数据库
首页 > 数据库> > redis使用场景梳理

redis使用场景梳理

作者:互联网

redis使用场景梳理

一、排行榜

1. 实际业务场景

排行榜是业务开发中常见的一个场景。比如:

场景一:选手报名参加活动,观众可以对选手进行投票,每个观众对同一名选手只能投一票,活动期间最多投N票

功能1:返回TOP 10的选手信息及投票数

功能2:返回活动总参与选手数及总投票数

功能3:对于每个选手,返回自己的投票数,排名,距离上一名差的票数

实现 :

redis的有序集合是一个非常高效的数据结构,可以替代数据库里一些很难实现的操作。它的一个典型应用场景就是排行榜。

 

 

这里面有个问题:

1)在score相同的情况下,redis使用字典排序,而所谓的字典排序其实就是“ABCDEFG”这样的排序,在首字母相同的情况下,redis会再比较后面的字母,还是按照字典排序。

2)在有些情况下这个可能不满足实际要求,因此需要按实际情况重新设计score,比如如果要求同分数情况下按时间排序,时间戳越小,越排前。

3)使用双精度浮点数类型作为score,结构为:分数+'.'+(MAX-时间戳),变为浮点数

场景二:游戏中存在各种各样的排行榜,比如玩家的等级排名、分数排名等。玩家在排行榜中的名次是其实力的象征,位于榜单前列的玩家在虚拟世界中拥有无尚荣耀,所以名次也就成了核心玩家的追求目标。

一个典型的游戏排行榜包括以下常见功能:

功能1:能够记录每个玩家的分数;

功能2:能够对玩家的分数进行更新;

功能3:能够查询每个玩家的分数和名次;

功能4:能够按名次查询排名前N名的玩家;

功能5:能够查询排在指定玩家前后M名的玩家。

实现:

 

总结,在实现排行榜的功能时,我们发现常用的命令:

ZADD  :记录/更新每个玩家的分数

ZSCORE  :查询玩家的分数

ZREVRANK:查询玩家的名次(按分数从大到小排列)

ZREVRANGE:按名次查询排名前N名的玩家

ZRANK:  返回有序集中指定成员的排名(按分数从小到大)

注意: zrevrank/rank 查询到的名次,指的都是元素所在的索引下标

 

二、弹幕

ltrim 裁剪

三、共同好友

查找两个人共同的好友

可以对两个set提供交集、并集、差集操作。例如:查找两个人共同的好友等。

四、计数器

什么是计数器,如电商网站商品的浏览量、视频网站视频的播放数、高并发的秒杀活动、分布式序列号的生成等。为了保证数据实时效,每次浏览都得给+1,并发量高时如果每次都请求数据库操作无疑是种挑战和压力。

Redis提供的incr可以实现原子性的递增,内存操作,性能非常好,非常适用于这些计数场景。

 1 <?php
 2 
 3 // redis记录该用户投票次数
 4 $voteNum = $redis->incr('votes:' . $openid);
 5 if ($voteNum > 4) {
 6     // 投票已达上限,计数器还原
 7     $redis->decr('votes:' . $openid);
 8     return [-1, [], '抱歉,您的投票次数达到上限,活动期间最多投4票~!'];
 9 }
10 ...
11 // DB操作:记录投票信息,返回操作结果$res
12 if ($res) {
13     return [0, [], '恭喜您,投票成功~!'];
14 } else {
15     //插入数据失败,计数器还原
16     $redis->decr('votes:' . $openid);
17     return [-1, [], '抱歉,投票失败~!'];
18 }

 

 

 

参考链接:

https://www.jianshu.com/p/557e0faa15fc

https://segmentfault.com/a/1190000018636887

标签:分数,场景,名次,redis,玩家,排行榜,梳理
来源: https://www.cnblogs.com/hld123/p/14657264.html