开发者社区> 问答> 正文

求一个redis 实时并列排行榜解决方案

游戏项目中使用redis的Sorted-Sets 做排行榜,对于并列排行处理的机制为:
因为redis存储的是double类型,为64位
所以对于分数相同的情况,采用按照时间来排序。
为此,现在的设计为: double 64位 , 拆分为: 高32位 , 低32位
其中高32位存储真正的分数,低32位存储当时与某一个时刻的时间差(秒),这样就很好解决了并列排名,
不过支持的最大分为32位,即一个int
问题:
因为redis内部使用double类型,关于double的本身就有精度问题,
在<<计算机操作系统>>中,double 64位, 其中63位是符号位,62-52位位阶码,51-0 位表示尾数。
其中可以确定的说,在double中,只有低52位(尾数位部分)才是精确的
所以,在我的redis排行榜设计中,其中低32位为时间戳,高32位为真正的分数,这样只有高32位中的低20位才是有效数位,
因此,这样最多就能最大为支持100w的数据(因为高32位的高12位不能用,精度不准确)
求助:
有什么更好的设计方案吗?实现分数相同,按照时间来排序?

展开
收起
落地花开啦 2016-02-20 18:52:02 4369 0
1 条回答
写回答
取消 提交回答
  • 喜欢技术,喜欢努力的人

    将double转成字符串,手动指定高位的分数

    2019-07-17 18:45:41
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Redis集群演化的心路历程——从2.x到3.0时代 立即下载
微博的Redis定制之路 立即下载
云数据库Redis版的开源之路 立即下载