我在Redis中跟踪多个排序集中的成员,以此对成员进行多列索引。举例来说,假设我有两个Sorted Sets lastseen
(时间点)和points
,并且我将用户名存储为这些Sorted Sets中的成员。
我想首先进行排序,lastseen
以便可以在最后一天或一个月内看到用户,然后我要对结果成员进行排序,points
这样我就可以有效地对过去一天或一个月内看到的成员按点进行排序。
如果我可以将对ZREVRANGEBYSCORE的调用结果存储到新的Sorted Set(我们称为新的Sorted Set temp
)中,这将很容易,因为这样我就可以对lastseen
限制进行排序,将结果存储到temp
,对temp
并points
与一起使用ZINTERSTORE out
(存储到result
)的权重为零,最后在上再次使用ZREVRANGEBYSCORE result
。但是,Redis中没有内置的方法将ZRANGE的结果存储到新的Sorted Set中。
我调查了此处发布的解决方案的使用情况,尽管它似乎可以正确地排列结果顺序,但排序集中的结果分数不再能够用于根据时间准确地限制结果(即,只需要最后一天内的结果) 。
例如:
redis> ZADD lastseen 12345 "foo"
redis> ZADD lastseen 12350 "bar"
redis> ZADD lastseen 12355 "sucka"
redis> ZADD points 5 "foo"
redis> ZADD points 3 "bar"
redis> ZADD points 9 "sucka"
假设我的时间范围在12349
和之间12356
,我想得出的最终结果是成员列表['sucka', 'bar']
。
我能想到的解决方案是:
1)您的愿望是ZREVRANGEBYSCORE
,以某种方式保存临时结果。取而代之的是,您可以复制zset(可以通过ZINTERSTORE
仅使用一个set作为参数来完成zset ),然后ZREMRANGEBYSCORE
对新副本执行a来摆脱您不感兴趣的时间,然后执行final ZINTERSTORE
。
2)按照Eli的建议,在客户端上循环执行。
3)在Lua脚本中执行相同的操作。
这些都是潜在的昂贵操作,因此最有效的方法取决于您的数据和用例。在不了解更多信息的情况下,我个人会倾向于使用Lua解决方案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句