redis 实现价格相同时间优先 排行榜

本文探讨了如何利用Redis创建一个价格相同情况下按时间优先排序的排行榜。通过将价格和时间戳结合为一个64位长整型,其中高32位存储价格,低32位存储与固定时刻的时间差,解决了相同价格排序的问题。由于Redis内部double类型的精度限制,文章指出了设计中的精度挑战,并提出了解决方案,确保排行榜的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求:

多人竞价, 实时获取竞标价格排行榜, 相同价格根据时间优先排序

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值