我正在跟踪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会给我我正在寻找的东西,但如果用户的分数大于他们上一次看到的纪元值,那就不是这种情况。
答案 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"