【问题标题】:Jedis filtering values in hmsetJedis过滤hmset中的值
【发布时间】:2015-06-06 19:55:54
【问题描述】:

我在 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 中。 “key:1”是用于标识特定空间中不同用户的占位符,“key:1”之后的部分是“key:1”中每条记录的唯一区分符。我想编写一些代码来过滤掉redis中的数据,以获取所有投票数设置为0的记录。所以jedis代码的输出应该类似于

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

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

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

【问题讨论】:

  • 为什么不使用 redis 中的 zset 来进行这个排名,以 key 作为 value,以 votes 作为分数?每次用户有投票变化时,您都会更新此 zset。

标签: java redis jedis


【解决方案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)。对于每个调用,SSCANO(1),对于我们的场景,SREMO(1),通常 O(N) 其中N 是要删除的成员数。

【讨论】:

    猜你喜欢
    • 2018-01-09
    • 2016-07-11
    • 1970-01-01
    • 2017-03-31
    • 2015-07-24
    • 1970-01-01
    • 2014-12-11
    • 2018-12-10
    • 1970-01-01
    相关资源
    最近更新 更多