SQL必知必会43-如何使用Redis搭建玩家排行榜?

上一篇文章中,我们使用 Redis 模拟了多用户抢票的问题,这里再回顾一下原理。我们通过使用 WATCH+MULTI 的方式实现乐观锁机制,对 ticket_count 这个键进行监视,当这个键发生变化的时候事务就会被打断,重新请求,这样做的好处就是可以保证事务对键进行操作的原子性,当然我们也可以使用 Redis 的 incr 和 decr 来实现键的原子性递增或递减。

今天我们用 Redis 搭建一个玩家的排行榜,假设一个服务器存储了 10 万名玩家的数据,我们想给这个区(这台服务器)上的玩家做个全区的排名,该如何用 Redis 实现呢?

不妨一起来思考下面几个问题:

  1. MySQL 是如何实现玩家排行榜的?有哪些难题需要解决?
  2. 如何用 Redis 模拟 10 万名玩家数据?Redis 里的 Lua 又是什么?
  3. Redis 如何搭建玩家排行榜?和 MySQL 相比有什么优势?

使用 MySQL 搭建玩家排行榜

我们如果用 MySQL 搭建玩家排行榜的话,首先需要生成 10 万名玩家的数据,这里我们使用之前学习过的存储过程来模拟。

为了简化,玩家排行榜主要包括 3 个字段:user_id、score、和 create_time,它们分别代表玩家的用户 ID、玩家的积分和玩家的创建时间。

王者荣耀英雄等级说明

这里我们可以模拟王者荣耀的英雄等级,具体等级标准如下:


如果想要英雄要达到最强王者的段位,那么之前需要积累 112 颗(9+12+16+25+25+25)星星,而达到最强王者之后还可以继续积累无上限的星星。在随机数模拟上,我们也分成两个阶段,第一个阶段模拟英雄的段位,我们使用随机数来模拟 score(数值范围是 1-112 之间),当 score=112 的时候,再模拟最强王者等级中的星星个数。如果我们只用一个随机数进行模拟,会出现最强王者的比例变大的情况,显然不符合实际情况。

使用存储过程模拟 10 万名玩家数据

这里我们使用存储过程,具体代码如下:

 

CREATE DEFINER=`root`@`localhost` PROCEDURE `insert_many_user_scores`(IN START INT(10), IN max_num INT(10))

BEGIN

DECLARE i INT DEFAULT 0;

-- 模拟玩家英雄的星星数

DECLARE score INT;

DECLARE score2 INT;

-- 初始注册时间

DECLARE date_start DATETIME DEFAULT ('2017-01-01 00:00:00');

-- 每个玩家的注册时间

DECLARE date_temp DATETIME;

SET date_temp = date_start;

SET autocommit=0;

REPEAT

SET i=i+1;

SET date_temp = date_add(date_temp, interval RAND()*60 second);

-- 1-112 随机数

SET score = CEIL(RAND()*112);

-- 如果达到了王者,继续模拟王者的星星数

IF score = 112 THEN

SET score2 = FLOOR(RAND()*100);

SET score = score + score2;

END IF;

-- 插入新玩家

INSERT INTO user_score(us

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员zhi路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值