当实际数据存储在AWS S3上时,我正试图使用Redis排序集作为我的辅助索引。
比方说,如果我想支持像Name!= 'uma'
这样的条件,是否有使用内置模式匹配来实现这一点?
例如,让我有下面作为我的排序设置密钥
ZADD mykey 0 uma:7000
ZADD mykey 0 umesh:7001
ZADD mykey 0 mahes:7002
我可以做一些类似ZSCAN mykey 0比赛的事情吗!uma?
我不想在内存中获取所有数据并应用!=在应用层中。
提前感谢
您可以创建一个包含不需要的成员的临时集合,然后使用ZDIFF:
> ZADD mykey 3 uma:7000
(integer) 1
> ZADD mykey 4 umesh:7001
(integer) 1
> ZADD mykey 5 mahes:7002
(integer) 1
添加一些温度值:
> ZADD tempkey 0 uma:7000
(integer) 1
并获得差异:
> ZDIFF 2 mykey tempkey WITHSCORES
1) "umesh:7001"
2) "4"
3) "mahes:7002"
4) "5"
哦。并且一定要清理温度设置:
> UNLINK tempkey
(integer) 1
您可以使用Lua Script+ZSCAN来完成这项工作。以下是实现目标的一句话。
redis-cli eval 'local res = redis.call("zscan", KEYS[1], ARGV[1]); local matches = {}; local kv = res[2]; for i=0,(#kv/2-1) do local k = kv[i * 2 + 1]; local v = kv[i * 2 + 2]; if k ~= ARGV[2] then matches[#matches + 1] = k; matches[#matches + 1] = v; end end res[2] = matches; return res' 1 mykey cursor-starting-from-0 uma
SCAN也有类似的问题。我试图修改答案中的一行,并发表了评论。然而,SCAN
的返回值与ZSCAN
有很大不同,所以我为它写了一个专门的答案