需求:
希望利用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比前面俩都小,但是会被排后面,不符合需求