游戏项目中使用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位不能用,精度不准确)
求助:
有什么更好的设计方案吗?实现分数相同,按照时间来排序?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。