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

我试图使用带有分数的 Redis 有序集合 按时间排序。

我的当前想法是使用一个 Lua 脚本,并将时间和值打包到分数字段中,使用 MessagePackmsgpack)。

  • 时间值来自 Python 中的 datetime.utcnow(),看起来像这样:1417395600
  • 分数可以有任何类型的值。

所以我的问题是:

  1. 是否可以打包这些类型的值?Redis 的有序集合似乎仅限于浮点数,除非我搞错了。
  2. 这样做是否能保证时间顺序?

如果您对我如何实现有任何其他想法,请告诉我。我非常希望不必使用另一个表来存储每个客户端的得分...

PS:我实际上不关心时间,我只需要得分(值)按时间排序,以便将有序集合用作排行榜。

点赞
用户8190596
用户8190596

在 Redis 排序集中,当有多个元素具有相同的分数时,ZRANGEBYSCORE 命令以字典顺序返回元素。因此,如果您在元素前加上时间前缀,那就可以实现您的目标。

2017-08-17 21:43:16
用户5646269
用户5646269

利用排序相同分数的有序集合属性,按字典序对具有任意数量参数的键进行排序,如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"
2021-08-14 17:41:18