Redis 排行榜 相同分数根据时间优先排行

1. 需求

    Redis 提供了按分数进行排序的有序集合。 比如在游戏里面,比如战斗力排行,充值排行,用默认的Redis 实现就可以达到需求。

    但是,比如等级排行,大家都是30级,谁先到30级谁第一。Redis 默认实现是,相同分数的成员按字典顺序排序(0 ~9 , A ~Z,a ~ z),所以相同分数排序就不能根据时间优先来排序。

    需要设计一个 【分数 = 等级 + 时间】 ,谁分数大谁第一,最后再根据分数能解析出来等级即可。


2.设计

    分数 = 等级 + 时间 (当前系统时间戳)

    分数是 64位的长整型 Long (有符号)


    1) 设计方式一

         long 分数,二进制用高 32位存 等级,低32位存时间(秒精度),那么数据看起是这样

         A 玩家, 10 + 1111111111(时间戳)     

         后来 B 玩家也到 10 级, 10 + 2222222222(时间戳)         

         

         这样排序,最终还是 B 玩家 会排到第一名,不能达到目的。


    2) 设计方式二    

         long 整数长度总共有 19位,923XXX.......,时间戳 毫秒精度 是 13位,所以只需 14 ~ 19 位存 等级,其他13位存时间。接下来看怎么存。

         等级偏移: Math.power(10, 14) = 10000000000000000(14位)

         这里有一个最大时间 MAX_TIME = 9999999999999 (13位)

         A 玩家,(10 * 等级偏移) + MAX_TIME - 11111111111111( 时间戳),最终分数 10888888888888888

         B 玩家,(10 * 等级偏移) + MAX_TIME - 22222222222222( 时间戳),最终分数 10777777777777777

         

         最终排序,A 玩家依然是第一。通过分数可以解析出真实 【等级 = 分数 / 等级偏移,取整】


3. 劣势

    1) 如果有三个,四个排序条件怎么办,这种情况还是推荐使用数据库,就别考虑 Redis了 。Redis 优势在于可以做到实时排行

    2) 方式二 14 ~ 19位,那么等级最大数据就只能是 919999,超过这个数就会溢出。可以把时间戳降低到秒级别,可以支持更大数字


4. 总结

    以上设计主要还是针对游戏内排行榜,并不能涵盖所有行业,只能说是借鉴作用,仅供参考。

         


  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值