我在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
这就是我的键空间的样子。我正在使用hmset将这些东西存储在redis中。 "键:1"是一个占位符,用于标识特定空间中的不同用户以及"键之后的部分:1"是" key:1"中每个记录的唯一区别。我想编写一些代码来过滤掉redis中的数据,以便将所有投票数设置为0的记录。所以jedis代码的输出应该类似于
key:1:abc -> votes -> 0
-> name -> John
key:1:xyz -> votes -> 0
-> name -> Mary
拉里被过滤掉了。我正在研究hmscan解决这个问题,但我不确定该命令会是什么样子。关于我能做些什么来获得输出的任何线索?你认为这个时间的复杂程度是多少?
答案 0 :(得分:1)
对此有几种解决方案,但首先想到的是使用辅助结构。
每次向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
对于添加的每个成员, SADD
为O(N)
,在本例中为O(1)
。对于每个调用,SSCAN
为O(1)
,对于我们的方案,SREM
为O(1)
,一般为O(N)
,其中N
是成员的数量被删除。