Jedis 过滤 hmset 中的值

Jedis filtering values in hmset

我在 redis 中有一些具有这个键结构的值

key:1:abc -> votes -> 0
          -> name  -> John 

key:1:xyz -> votes -> 0
          -> name  -> Mary 

key:1:def -> votes -> 1
          -> name  -> Larry

key:2:ijk -> votes -> 0
          -> name  -> apple

这就是我的钥匙space 的样子。我正在使用 hmset 将内容存储在 redis 中。 "key:1" 是用于标识特定 space 中不同用户的占位符,"key:1" 之后的部分是 "key:1" 中每条记录的唯一区分符。我想写一些代码来过滤掉来自redis的数据,以获得所有投票数设置为0的记录。所以jedis代码的输出应该是这样的

key:1:abc -> votes -> 0
          -> name  -> John 

key:1:xyz -> votes -> 0
          -> name  -> Mary 

Larry 被过滤掉了。我正在研究 hmscan 以解决此问题,但不确定该命令的外观。关于我可以做些什么来获得该输出的任何线索?另外你认为这次得到的时间复杂度是多少?

有几个解决方案,但第一个想到的是使用辅助结构。

每次将一个项目添加到 HASH 中时,也会将此人的姓名添加到一个 SET 中:

> SADD zerocount "Larry"
(integer) 1
> SADD zerocount "Mary"
(integer) 1

每当您想要计数为零的姓名列表时,您可以执行 SSCAN(给您分页):

> sscan zerocount 0
1) "0"
2) 1) "Mary"
2) "Larry"

例如,在增加 Larry 的值时,您将从集合中删除该值:

> srem zerocount "Larry"
1
对于每个添加的成员,

SADDO(N),在本例中为 O(1)SSCAN 是每次调用的 O(1),而 SREMO(1) 对于我们的场景,一般来说 O(N) 其中 N 是成员的数量被移除。