通过redis实现游戏排行榜功能

需求说明

  1. 水晶数量排行榜
  2. 英雄熟练度排版
  3. 只排前一万名,玩家只能看到前200名的数据和自己的名次
  4. 每个排行榜实时刷新,玩家可以延迟5分钟查看榜单数据,但是自己的名次需要尽可能实时查看
  5. 分值一样,则先达到分值的玩家前面在前

设计说明

  1. 由于要求实时排序,且我们的服务是分布式的,所以采用redis的有序集合sorted set排序
  2. 将变动分值zadd到集合,然后调用zremrangeByRank移除指定排名区间内的成员,保证只排前一万名
  3. sorted set支持单字段排序,但是分值一样的时候,需要在比较到达时间,这里使用一个小技巧
    score为long类型,但是我们的分值用不到这么大的类型,所以将score的高位表示分值,低位表示距离某个时间点的时间间隔
    具体公式如下:
    score = ((value & 0xfffff) << 32) | (createTime & 0xffffffff)
  4. 定时拉取前200名的数据到本地内存

注意事项

  1. 我们的redis没有开启持久化,所以需要将排行榜数据定时备份到数据库。由于是分布式服务,所以需要决定由哪个服务来保存数据,并且需要在redis里记录上次保存时间
    这里使用了一个分布式锁,每个服务定时拉取排行榜数据到内存,然后竞争分布式锁,如果获取到锁并且判断上次保存的时间,大于保存间隔时间就执行保存操作
    每次保存数据,不是全保存,需要和内存里上次的数据做对比,只保存变化的名次数据,降低写入条数
    停服的时候做一次全保存
    起服的时候检测redis里是否有排行榜数据,如果没有就需要竞争一个分布式锁,从数据库加载数据到redis
  2. 拉取到内存的排行榜数据立马做好序列化,减少序列化次数
  3. 限制同一玩家同一榜单数据请求频率(30s),可以减少发送数据次数,降低流量。客户端也可以限制玩家请求数据的频率
  4. 榜单数据分页发送
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值