分享好友 最新动态首页 最新动态分类 切换频道
跨服排行榜:快速排序与Redis跳表实现策略,
2024-12-27 21:12

排行榜是游戏中重要的功能,如何才能实现一个高效的排行榜呢?我所在的项目组做的是SLG游戏,我们游戏的很多活动都有排行榜。上周接到一个跨服排行榜的功能案,需求是让现有的排行榜支持跨服。

一、问题描述

目前每个服的玩家大概4W人,如果战力排行榜做成跨服,开到300个服时,上榜人数会超过1kw。虽然很少有游戏能开到300个服,但作为服务器程序设计功能时必须要考虑极端情况,选择适合的方案,不然可能有推倒重来的风险。下面介绍2种实现排行榜的方案,一是快速排序,另一种是redis实现。

二、快速排序实现

实现方式如下

  1. 玩家分数变化时,更新到内存缓存,比如map。
  2. 用快速排序定时对内存中的数据排序,生成成榜单。
  3. 把排序生成的榜单推送到对应的区服。

优化
假如配置榜单只显示前1k名的玩家,除首次排序外,我们可以只让分数>最后一名的玩家参与排名,避免每次都全量排。排完名把1k名以外的玩家移除排序缓存,以保证参与排序的玩家不会越来越多。这样做可以解决排序基数大的问题,把每次需要排序的玩家从1kw减少到1k左右。
但这种方式还是很有局限,比如,不管玩家不上不榜,都要显示自己的名次。这是不是要对所有玩家名排序呢?或者有一个GM需求是从后台查看某榜单前N名的玩家,那又该如何应对呢
游戏中排行榜比较主流的做法是用redis排序,那么redis内部是如何实现的呢?下面我们结合源码来一探究竟。

三、跳表实现

排行榜的另一种实现方式是使用redis中的有序集合SortedSet,其底层是通过跳跃表实现的。跳跃表拥有非常好的查找、插入、删除性能(logn),而且可以很方便的获取名次区间内的节点,这恰好是排行榜需要的功能。

1.1 基本思想

跳表非常像一个有序双向链表,它的插入,删除操作都跟双向链表操作类似,需要更新当前节点前驱和后继节点的指针。不同在于,比链表的节点多了层高和跨度的概念。
层高:节点的层数,插入节点时随机生成。 查找节点时,从层高最高的节点开始查找,如果查找score > 当前层下一个节点的score,则继续在当前层查找,否则进入下一层用同样的方法查找,直到查找成功或失败。
跨度:也叫跳数,第i层当前节点到第i层下一个节点的距离,这是跳表的核心。 当查找一个节点时,从当前节点到下一个节点可能直接跳过N个节点,查找路径上的跳数和就是节点在跳表中的名次(升序)。

 

1.1 数据结构

本文使用的源码版本为redis 6.0跳表结构由2部分组成

  1. 跳表节点:跳表是由节点组成的双向链表

     
  2. 跳表节点信息:记录了跳表节点的基本信息

     

1.2 查找

下图是一个节点数为10,层高为4的跳表结构。

绿色箭头为查找score为19的节点需要经历的路径,步骤如下

  1. 从header节点不为NULL的最高层开始查找,本例为level4。
  2. level4的forward指向的节点score为21, 21 > 19, 则查找下一层(level3
  3. level3指向的节点score为 9, 9 < 19, 则当前指针指向score为9的节点
  4. score为9节点的forward节点值为21, 21 > 19, 则查找下一层(level2
  5. level2的forward节点值为17, 17 < 19, 则当前指针指向score为17的节点
  6. score为17节点的forward节点值为21, 21 > 19, 则查找下一层(level1
  7. score为17节点(level1)的forward节点值为19, 查找成功

源码

 

 

1.3 插入
 

 

1.4 删除
 

:通过玩家ID而非分数来查询排行榜中玩家的排名,可以采用如下方法:

  1. 在redis的跳表结构中,同时以分数score和玩家ID作为键存入记录。

比如:

 
  1. 为每个玩家创建一个索引键,值为分数。

比如:

 
  1. 查询玩家排名时:
  • 首先通过ID键获取玩家的分数值

  • 再通过分数值在跳表中查找排名

例如:

 

这样就可以通过玩家ID直接获取其排名,同时利用跳表保持基于分数的排名有效。

最新文章
贵州新型城镇化:推动“强省会”“双城记”实现“3个100万”
“上学和就医都在家门口,方便得很!”今年48岁的成信梅是贵州省毕节市七星关区撒拉溪镇中山村人,得益于易地扶贫搬迁政策,一家6口从交通不便、自然环境恶劣的大山深处搬到柏杨林街道和美社区,享受到了便捷的教育、医疗、就业等公共服务
最新疫情情况安徽合肥,最新疫情情况安徽合肥,科技之光照亮抗疫之路
在合肥的街头巷尾,智能测温系统已经成为疫情防控的第一道防线,这款产品巧妙地结合了人工智能和大数据分析技术,实现了高精度、高效率的体温检测,无需接触,它即可快速准确地检测行人体温,有效预防疫情扩散,其高效的检测速度和精准的测
网页链接怎么做
网页链接怎么如何进行制作,怎样做好外部链接就成为搜索引擎优化推广人的论题,网站怎么正确的利用外部链接做搜索引擎优化优化?锚文本链接要有相关度(推荐学习:web前端视频教程)先来说一下,搜索引擎优化外链锚文本要到什么网站去做才
购买商标“蚝功坊”29类食品详细指南
  随着市场对品牌认知度的提升,商标作为企业的重要资产之一,其价值日益凸显。对于那些想要进入特定市场的创业者或者小企业主来说,直接购买一个已经注册并具有一定知名度的商标,无疑是一条快速启动业务的有效途径。在众多可选的类别中
淘宝秒杀是什么意思?淘宝秒杀活动如何设置?(淘宝秒杀是什么活动)
秒杀活动几乎在任何电商平台都是常见的,秒杀商品一般价格都很低,不过抢到的机会却比较少,可以说这是考验你网速的,那淘宝秒杀是什么意思?接下来我们就来给大家讲解一下这方面的内容。一、淘宝秒杀是什么意思?秒杀就是网络卖家发布一些超
企业产品营销推广策划案例
企业产品营销推广策划案例(精选3篇)  一、公司简介  本公司以“与绿色同行,与自然为本”为企业宗旨,号召广大人民热爱大自然,保护大自然。  本公司以生产绿色产品为主(包括绿色食品,绿色日用品,等绿色系列品),创建于20__年1月
申请一个微信小程序有哪些需要注意的事项
相信有使用微信的用户,早就在微信平台上面接触了一种,不需要下载安装,只需要打开就能够使用的软件。这些软件有之前很火跳一跳、斗地主、弹球等等,其实这些软件都叫做微信小程序。不少企业、商家、个人用户
精选联盟是什么?一篇文章带你读懂
随着互联网时代的到来,抖音小店的经营模式也越来越受欢迎,伴随而来的是越来越多的人开始关注精选联盟的问题。那么,到底什么是精选联盟?怎么开通精选联盟?开通精选联盟的优势又在哪里?本文将会给大家一一解答上述问题,以及分享一些“
校园外卖小程序的功能介绍(校园跑腿小程序制作)
世界那么大,机会每天都有,但是我们需要判断校园外卖小程序的功能介绍学习到位没有,才能更好的进行下一步。校园外卖小程序的功能介绍一、便捷的点餐流程校园外卖小程序的最大特点之一是其便捷的点餐流程。学生只需在小程序首页选择自己所
今年,你不应错过的五本书
​直接订阅商论,双语对照阅读更多书评文章!全世界应对新冠的过程推动了生化领域的爆炸式发展,《密码破解者》借由去年诺贝尔化学奖得主之一杜德纳的故事,梳理了基因科学领域内最新的发展脉络,让我们对未来与数字科技并驾齐驱的生物科技
相关文章
推荐文章
发表评论
0评