需求:
希望利用Redis的Zset结构实现排行榜,数据按分数倒序排列,分数相同时按时间顺序排列

分数 名字 时间
12 小王 2020-04-01
10 小张 2020-04-03
10 小李 2020-04-04
8 小羊 2020-04-02

Zset按照分数从小到大排列,在分数相同的情况下,会按照Value的字典序进行排列,Value是一个字符串对象,所以问题就变成了如何构造一个字符串格式,按照zset的排列规则满足需求。

score value
8 aaa
10 aaa
10 bbb
12 aaa

Redis Zset排列规则如上图

解决办法:用一个大数减去时间戳拼在value前端

例如:
当前时间戳:1586420999
Value前缀:2^32 - 1586420999 = 2147483647 - 1586420999 = 561062648
Value:561062648|小王

score value
8 561062648
10 561062646
10 561062650
12 561062648

相同分数,后进排行榜的数据就会排在前面,取数据时直接ZRevRange倒序取整个排行榜即可

注意:发现个小问题,这里的前缀需要保证长度一致
561062646
561062650
这样才能保证561062650在后面
如果是
561062646
561062650
9999999
虽然9999999比前面俩都小,但是会被排后面,不符合需求