在Redis中,是否有可能根据ZRANGE在不同ZSET中的存在来预测ZRANGE结果中是否包含成员?

时间:2015-12-09 13:27:08

标签: redis

我正在跟踪Redis中多个排序集中的成员,作为对成员进行多列索引的方法。举个例子,假设我有两个排序集lastseen(这是一个纪元时间)和points,我将用户名存储为这些排序集中的成员。

我想对lastseen使用ZREVRANGEBYSCORE来获取最近看到的用户列表,但我只希望用户包含在结果中,如果它也出现在points中排序集。

我看过使用ZINTERSTORE来帮助我这样做,但可用的AGGREGATE选项不利于我的场景。如果其中一个AGGREGATE选项是使用提供给ZINTERSTORE命令的特定集合中的分数,那么它将起作用,但这不是一个选项。

--- --- EDIT

示例:

redis> ZADD lastseen 12345 "foo"
redis> ZADD lastseen 12346 "bar"
redis> ZADD lastseen 12347 "sucka"
redis> ZADD points 5 "foo"
redis> ZADD points 9 "bar"

现在,如果我跑:

redis> ZREVRANGEBYSCORE lastseen +inf -inf
1) "sucka"
2) "bar"
3) "foo"

我正在寻找的方法只能通过调用"foo"的ZREVRANGEBYSCORE返回"bar"lastseen,因为"sucka"不会重新发送points redis> ZINTERSTORE out 2 lastseen points redis> ZRANGE out 0 -1 WITHSCORES 1) "foo" 2) "12350" 3) "bar" 4) "12355" 排序集。

我能做到:

"sucka"

如您所见,ZINTERSTORE确实删除了moveDown成员,但其他两个成员的得分使用SUM进行聚合。还有另外两个聚合选项(MIN和MAX)可用于ZINTERSTORE。在这种情况下,使用MAX会给我我正在寻找的东西,但如果用户的分数大于他们上一次看到的纪元值,那就不是这种情况。

1 个答案:

答案 0 :(得分:2)

在运行WEIGHT时,您可以通过将points lastseen设置为0,将ZINTERSTORE设置为1来获得您所要求的内容,这样只有权重of lastseen被认为是:

redis> ZINTERSTORE out 2 lastseen points WEIGHTS 1 0
(integer) 2

然后,根据您要求的顺序,您可以:

redis> ZRANGE out 0 -1 WITHSCORES
1) "foo"
2) "12345"
3) "bar"
4) "12346"

或:

redis> ZREVRANGE out 0 -1 WITHSCORES
1) "bar"
2) "12346"
3) "foo"
4) "12345"