0

我正在尝试使用 Redis 排序集作为我的二级索引,而实际数据存储在 AWS S3 上。

假设我想支持一个条件,比如Name!= 'uma'有没有使用内置模式匹配来实现这一点?

例如,让我们在下面作为我的排序集键

ZADD mykey 0 uma:7000
ZADD mykey 0 umesh:7001
ZADD mykey 0 mahes:7002

我可以做类似 ZSCAN mykey 0 match !uma 的事情吗?

我不想在内存中获取所有数据并在应用程序层应用 != 。

提前致谢

4

2 回答 2

0

您可以创建一个包含不需要的成员的临时集,然后使用 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
于 2022-02-14T18:25:21.007 回答
0

您可以使用 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也有类似的问题。我试图修改该答案中的单行符,并发表了评论。但是, for 的返回值与SCAN有很大的不同ZSCAN,所以我专门为它写了一个答案。

于 2022-02-15T02:23:23.240 回答