【发布时间】:2016-03-16 15:25:21
【问题描述】:
我在 Redis 中跟踪多个排序集中的成员,作为对成员进行多列索引的一种方式。例如,假设我有两个排序集,lastseen(这是纪元时间)和points,我将用户名作为成员存储在这些排序集中。
我想先按lastseen 排序,这样我就可以在最后一天或一个月内看到用户,然后我想按points 对结果成员进行排序,这样我就可以有效地看到其中的成员按点排序的最后一天或一个月。
如果我可以将调用 ZREVRANGEBYSCORE 的结果存储到新的排序集(我们将调用新的排序集temp),这将很容易,因为这样我就可以对lastseen 进行限制排序,存储结果到temp,对temp 和points 使用ZINTERSTORE,out 的权重为零(存储到result),最后在result 上再次使用ZREVRANGEBYSCORE。但是,Redis 中没有内置方法可以将 ZRANGE 的结果存储到新的 Sorted Set 中。
我研究过使用here 发布的解决方案,虽然它似乎对结果进行了正确排序,但排序集中的结果分数不能再用于根据时间准确限制结果(即只想要一个最后一天内)。
例如:
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']。
【问题讨论】:
-
我没有在 Redis 中存储历史数据。例如,我不是每次看到用户时都存储,只是最后一次。这意味着,每次成员登录时,我都会更新 lastseen 排序集,其中用户名作为成员,当前纪元时间作为分数。
-
我的意思是,我没有在 Redis 中存储时间序列数据,只存储最新的。是的,排序集在启动时从 PostgreSQL 填充,但我更愿意实时查询 Redis 而不是 PostgreSQL。无论如何,它并没有真正改变我的问题——我可以很容易地使用一个展示相同用例的不同示例。
-
我已经在 OP 中有这个了。
标签: redis