需求:
多人竞价, 实时获取竞标价格排行榜, 相同价格根据时间优先排序
Redis 提供了按分数进行排序的有序集合。
比如在游戏里面,充值竞价排行,用默认的Redis 实现就可以达到需求。 但是,比如竞价排行,大家都是出价10元,谁先到谁第一。Redis 默认实现是,相同分数的成员按字典顺序排序(0 ~9 , A ~Z,a ~ z),所以相同价格排序就不能根据时间优先来排序。
需要设计一个 【分数 = 价格 + 时间】 ,分数大者排在前面,分数小者排在后面,最后再根据分数能解析出来价格和时间即可。
思路
分数 = 价格 + 时间 (当前系统时间戳)
分数为64 位的长整型 int64_t, 价格作为高位存储, 时间作为低位存储,时间精度上面,精确到秒级别。
设计方式 1
int64_t分数,二进制用高 32位存价格,低32位存时间(秒精度),那么数据看起是这样
A 玩家, 10 + 1111111111(时间戳)
后来 B 玩家也到 10 , 10 + 1111122222(时间戳)
这样排序,最终还是 B 玩家 会排到第一名,不能达到目的。**(放弃)**
设计方式 2
int64_t分数,二进制用高 32位存价格,低32位存储当时与某一个时刻的时间差(秒),那么数据看起是这样
这里有一个最大时间 MAX_TIME = 2208960000(2040年1月1日)(服务超过这个时间无效)
A 玩家,(10 * 价格偏移) + MAX_TIME - 11111111111111( 时间戳)
B 玩家,(10 * 等级偏移) + MAX_TIME - 1111122222( 时间戳)
最终分数A > B ,
最终排序,A