王者荣耀的段位排行榜是通过Redis实现的?


王者荣耀的段位排行榜是通过Redis实现的?

文章插图
在王者荣耀 target=_blank class=infotextkey>王者荣耀中,我们会打排位赛,而且大家最关注的往往都是你的段位,还有在好友中的排名 。
作为程序员的你,思考过吗,这个段位排行榜是怎么实现的?了解它的实现原理,会不会对上分有所帮助?
看看我的排名,你就知道了,答案是否定的,哈哈 。
王者荣耀的段位排行榜是通过Redis实现的?

文章插图
一、设计方案从技术角度而言,我们可以根据排行榜的类型来选择不同技术方案来进行排行榜设计 。
1、数据库直接排序在低数据量场景中,用数据库直接排序做排行榜的,有很多 。
举个栗子,比如要做一个程序员薪资排行榜,看看哪个城市的程序员最有钱 。
根据某招聘网站的数据,2023年中国国内程序员的平均月薪为1.2万元,其中最高的是北京,达到了2.1万元,最低的是西安,只有0.7万元 。
以下是几个主要城市的程序员平均月薪排行榜:
  1. 北京:2.1万元
  2. 上海:1.9万元
  3. 深圳:1.8万元
  4. 杭州:1.6万元
  5. 广州:1.5万元
  6. 成都:1.3万元
  7. 南京:1.2万元
  8. 武汉:1.1万元
  9. 西安:0.7万元
从这个榜单中可以看出,我拖了大家的后腿,抱歉了 。
这个就可以用数据库来做,一共也没有多少个城市,来个百大,撑死了 。
对于这种量级的数据,加好索引,用好top,都不会超过100ms,在请求量小、数据量小的情况下,用数据库做排行榜是完全没有问题的 。
2、王者荣耀好友排行这类榜单是根据自己好友数据来进行排行的,这类榜单不用将每位好友的数据都存储在数据库中,而是通过获取自己的好友列表,获取好友的实时分数,在客户端本地进行本地排序,展现出王者荣耀好友排行榜,因为向数据库拉取数据是需要时间的,比如一分钟拉取一次,因为并非实时拉取,这类榜单对数据库的压力还是较小的 。
【王者荣耀的段位排行榜是通过Redis实现的?】下面探索一下在JAVA中使用redis实现高性能的排行榜是如何实现的?
二、Redis实现计数器1、什么是计数器功能?计数器是一种常见的功能,用于记录某种事件的发生次数 。在应用中,计数器可以用来跟踪用户行为、统计点击次数、浏览次数等 。
例如,您可以使用计数器来记录一篇文章被阅读的次数,或者统计某个产品被购买的次数 。通过跟踪计数,您可以了解数据的变化趋势,从而做出更明智的决策 。
2、Redis实现计数器的原理Redis是一款高性能的内存数据库,提供了丰富的数据结构和命令,非常适合实现计数器功能 。在Redis中,我们可以使用字符串数据类型以及相关的命令来实现计数器 。
(1)使用INCR命令实现计数器Redis的INCR命令是一个原子操作,用于将存储在键中的数字递增1 。如果键不存在,将会创建并初始化为0,然后再执行递增操作 。这使得我们可以轻松地实现计数器功能 。
让我们通过Java代码来演示如何使用Redis的INCR命令实现计数器:
import redis.clients.jedis.Jedis;public class CounterExample {public static void mAIn(String[] args) {Jedis jedis = new Jedis("localhost", 6379);String articleId = "article:123";String viewsKey = "views:" + articleId;// 使用INCR命令递增计数long views = jedis.incr(viewsKey);System.out.println("Article views: " + views);jedis.close();}}在上面的代码中,我们使用了Jedis客户端库来连接Redis服务器,并使用INCR命令递增一个存储在views:article:123键中的计数器 。每次执行该代码,计数器的值都会递增,并且我们可以轻松地获取到文章的浏览次数 。
(2)使用INCRBY命令实现计数器除了单次递增1,我们还可以使用INCRBY命令一次性增加指定的数量 。这对于一些需要一次性增加较大数量的场景非常有用 。
让我们继续使用上面的例子,但这次我们使用INCRBY命令来增加浏览次数:
import redis.clients.jedis.Jedis;public class CounterExample {public static void main(String[] args) {Jedis jedis = new Jedis("localhost", 6379);String articleId = "article:123";String viewsKey = "views:" + articleId;// 使用INCRBY命令递增计数long views = jedis.incrBy(viewsKey, 10); // 一次增加10System.out.println("Article views: " + views);jedis.close();}}


推荐阅读