Redis 排序集按时间排序并带有分数

Posted

技术标签:

【中文标题】Redis 排序集按时间排序并带有分数【英文标题】:Redis sorted set ordered by time with a score as well 【发布时间】:2018-01-26 10:10:19 【问题描述】:

我正在尝试使用带有分数的Redis sorted set,按时间排序。

我目前的想法是在分数字段中使用Lua scriptpack 的时间和值,使用MessagePack (msgpack)。

时间值取自 Python 中的 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 排序集按时间排序并带有分数的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 json 文件从 Redis 排序集中删除项目

多对多关系的查询集按列表中的匹配数排序

Redis基本操作进阶篇学习--排序

List数据集按对象某个属性排序

Redis 排行榜 相同分数根据时间优先排行

根据带有 id 和分数的其他列表对 Django 查询集进行排序