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