Redis 排序集按时间排序并带有分数
Posted
技术标签:
【中文标题】Redis 排序集按时间排序并带有分数【英文标题】:Redis sorted set ordered by time with a score as well 【发布时间】:2018-01-26 10:10:19 【问题描述】:我正在尝试使用带有分数的Redis sorted set
,按时间排序。
我目前的想法是在分数字段中使用Lua script
和pack
的时间和值,使用MessagePack
(msgpack
)。
datetime.utcnow()
,如下所示:1417395600
。
分数几乎可以有任何价值。
所以我的问题是:
-
是否可以打包这些值? Redis 的排序集似乎仅限于浮点数,除非我弄错了。
这会保持时间顺序吗?
如果您对如何执行此操作有任何其他想法,请告诉我。我强烈不希望使用另一个表来存储每个客户的分数...
PS:其实我并不关心时间,我只需要按时间排序分数(值),将排序后的集合用作排行榜。
【问题讨论】:
Sorted Set 成员的分数只能用于存储浮点(IEEE 754)值。 我可以输入时间,然后是.
(浮点数),然后是序列化分数,以获取字符串中的浮点数,无论我的分数类型如何?
当然,只要注意精度
【参考方案1】:
使用按字典顺序排序相同分数键的已排序集的属性。您可以使用任意数量的参数对键进行排序,例如first_score:second_score:third_score
。
这里的关键是在创建具有多个分数的键时使用相同的填充。
如果 A 和 B 的分数完全相同,那么如果 A 字符串在字典顺序上大于 B 字符串,则 A > B。 A 和 B 字符串不能相等,因为有序集合只有唯一元素。
在此示例中,我在创建键时对所有第一分数和第二分数使用相同的填充。
> zadd leaderboard 0 010:1234
> zadd leaderboard 0 009:1234
> zadd leaderboard 0 011:1234
> zadd leaderboard 0 010:2345
> zadd leaderboard 0 010:9999
> zrange leaderboard 0 -1 withscores
1) "009:1234"
2) "0"
3) "010:1234"
4) "0"
5) "010:2345"
6) "0"
7) "010:9999"
8) "0"
9) "011:1234"
10) "0"
【讨论】:
【参考方案2】:在 Redis 排序集中,当多个元素具有相同的分数时,ZRANGEBYSCORE
命令按字典顺序返回元素。因此,如果您在元素前面加上时间,那应该可以实现您的目标。
【讨论】:
以上是关于Redis 排序集按时间排序并带有分数的主要内容,如果未能解决你的问题,请参考以下文章