一.写在前面

  • 最近做完直播的基础功能后,又多了很多相关的需求,其中有一个就是直播间分享榜单的功能,顾名思义就是:分享本直播间并成功拉用户进来的数量做一个排行。比如我分享了这个直播间,别人通过我分享的直播间链接点进来,那么这个人就是我邀请来的,我总共邀请了10个人,你总共邀请了6个人,他总共邀请了11个人。实时排名就是他>我>你。
  • 简单介绍了一下功能,其实就是个根据某个权重值做排行榜的功能。

二.介绍redis的zset

这里就不说具体的zset实现了(我太菜,不敢放肆,等我牛逼了我再写zset实现,估计n年后 ),总之为了速度和稳定性以及持久化,redis肯定是最合适的,而且redis又有zSet这种数据结构,那不用zSet岂不是浪费嘛。
首先简单说一下zSet:

命令 描述
ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数
ZCARD key 获取有序集合的成员数
ZCOUNT key min max 计算在有序集合中指定区间分数的成员数
ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment
ZINTERSTORE destination numkeys key [key …] 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中
ZLEXCOUNT key min max 在有序集合中计算指定字典区间内成员数量
ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合成指定区间内的成员
ZRANGEBYLEX key min max [LIMIT offset count] 通过字典区间返回有序集合的成员
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 通过分数返回有序集合指定区间内的成员
ZRANK key member 返回有序集合中指定成员的索引
ZREM key member [member …] 移除有序集合中的一个或多个成员
ZREMRANGEBYLEX key min max 移除有序集合中给定的字典区间的所有成员
ZREMRANGEBYRANK key start stop 移除有序集合中给定的排名区间的所有成员
   
ZREMRANGEBYSCORE key min max 移除有序集合中给定的分数区间的所有成员
   
ZREVRANGE key start stop [WITHSCORES] 返回有序集中指定区间内的成员,通过索引,分数从高到底
   
ZREVRANGEBYSCORE key max min [WITHSCORES] 返回有序集中指定分数区间内的成员,分数从高到低排序
ZREVRANK key member 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
ZSCORE key member 返回有序集中,成员的分数值
   
ZUNIONSTORE destination numkeys key [key …] 计算给定的一个或多个有序集的并集,并存储在新的 key 中
ZSCAN key cursor [MATCH pattern] [COUNT count] 迭代有序集合中的元素(包括元素成员和元素分值)

上面就是redis的zset相关的命令,项目中实际是不会这么写的,我们使用的RedisTemplate进行的redis操作

三.实现方式

介绍完zset,然后说一下功能实现思路,其实很简单。。。。。就是往zset里面塞数据

stringRedisTemplate.opsForZSet().incrementScore(key, member, incrementScore);

上面代码,其实就是reids命令的:ZINCRBY key increment member,描述:有序集合中对指定成员的分数加上增量 increment比如你要给某个直播间做排行榜,key就是直播间相关的key,member就是邀请人的标识(一般就是userId),incrementScore就是这个人邀请的人数自增量(这是我的业务的说法,具体大家根据自己需求理解,融会贯通哈,比如微博热搜排序,key就可以是小时榜/天榜/月榜,member是某一条热搜词条,incrementScore就是这个词条热度增量/权重增量),我觉得你们肯定理解我为啥直接用incrementScore,而不是add,所以把自增量直接塞进去redis-zset就完事了,有人通过邀请进来了你就往进塞一次,因为这个命令是incrementScore也就是自增类型的,所以你也不用担心刚开始的时候是否存在这个key(并发问题),如果调用incrementScore的时候这个key已经存在,那就score自增,如果不存在那就新增这个key,然后把自增量设置为初始值,天然的线程安全,redis牛逼!!! 然后根据我的业务来说,我的incrementScore自增量就是1,因为我邀请了1个人就+1,没啥特殊值,但比如你的业务是直播间但消费额排行,那你的incrementScore自增量就是本次消费的金额数,这点应该很好理解,这里只说redis操作哈,如果这些数据还要落mysql等数据库,那看情况操作就行,比如我们的业务还要判断同一个人点了两个邀请链接,只算第一个的,并且直播结束还要拉取分享榜前三名发奖励,所以存入redis-zset的时候要校验,最后还要落库到mysql,但其实mysql很快的哈,又不是那种上千万的级别,上千万那你分库分表也不就完事了,实在不行你发一条mq消息处理呗,这种业务,我觉得保证最终一致就行了。
分享榜数据和排行问题,zset全部帮我们解决了,我们只需要给里面填入数据就行,简单、高效、实用。
剩下的就是取数据了,取数据的话也是从zset取排行的有序集合数据:

stringRedisTemplate.opsForZSet().reverseRangeWithScores(key, start, end);

上面这个代码,首先reverseRangeWithScores 方法的意思是:从大到小从第start+1名开始取值,到第end+1名结束,并且返回结果带分数, 简单来说就是把得分从大到小排序,然后取前end+1名,这个是RedisTemplate的方法,如果是redis操作的话,那命令就是上面表格中的:ZREVRANGEBYSCORE key max min [WITHSCORES],描述:返回有序集中指定分数区间内的成员,分数从高到低排序,这个描述我感觉有点绕哈,但是仔细理解一下还是能理解的
举个例子哈,如果你要取排行榜前十名,那么调用上面方法的参数就是:

stringRedisTemplate.opsForZSet().reverseRangeWithScores("key", 0, 9);

这个方法就会返回排行榜前十名,这个方法返回结果是:Set<ZSetOperations.TypedTuple<String>>,一个Set,具体结构其实大概就是个Set<value,score>,直接循环这个结果,就拿到了前十名的结果。看到这里还不了解返回结果数据结构的可以去debug一下看看这个数据结构,立马就懂哈。循环这个结果拿到的就是排好序的<userId,score>,舒服啊,直接再完善一下数据,比如查一下用户名啥的,这个看具体业务哈,然后返回结果完事,简单、高效、又不担心线程安全。
好了!!!写完收工,zset实现排行榜真的很不错。本篇主要写实现思路,具体代码不能贴给你们看哈,因为是我们的业务代码,我又懒的自己写一个,所以只说思路,其实也不难,排序和并发问题redis都做好了,那还要啥自行车。

借鉴:

https://blog.csdn.net/qq_34203492/article/details/98202848

redis ZSet实现排行榜功能相关推荐

  1. Redis实现世界杯排行榜功能(实战)

    点击上方"后端技术精选",选择"置顶公众号" 技术文章第一时间送达! 作者:俊俊的小熊饼干 cnblogs.com/wenjunwei/p/9754346.ht ...

  2. 使用Redis的有序集合Zset实现排行榜功能

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

  3. 使用Redis Zset实现排行榜

    Zset简易排行 一.ZSet添加数据的命令 二.用到的命令 三.缓存击穿 提示:以下是本篇文章正文内容,下面案例可供参考 一.ZSet添加数据的命令 key:String类型 score:数值类型 ...

  4. 通过redis实现游戏排行榜功能

    需求说明 水晶数量排行榜 英雄熟练度排版 只排前一万名,玩家只能看到前200名的数据和自己的名次 每个排行榜实时刷新,玩家可以延迟5分钟查看榜单数据,但是自己的名次需要尽可能实时查看 分值一样,则先达 ...

  5. java基于Redis实现排行榜功能-附源码

    java基于Redis Zset实现排行榜功能 前言 做之前要思考的问题? Zset怎么存储需要的多个字段? 话不多说先上效果图 数据存储格式 代码 源码下载 闲暇之余,整理了一下之前利用Redis ...

  6. php redis 搜索,PHP+Redis有序集合(zset)实现博客园阅读排行榜功能

    许多网站都有排行榜的功能,比如球员人气榜单.阅读排行榜,对于一些小网站,通过查数据库就能实现排行榜的功能,但是对于稍微有点用户量而且还是实时排名的网站,使用一些关系型数据库如(MySQL.Oracle ...

  7. Redis ZSet数据结构实现排行榜功能

    Redis ZSet数据结构实现排行榜功能 一. 使用场景 公司新项目要求, 实现每日排行榜以及各省排行榜 二. 功能实现(Java) 1. 排行榜数据插入及更新 /*** @date: 2022/1 ...

  8. 使用redis实现排行榜功能

    一.需求背景 最近项目需要做排行榜功能,实现员工邀请用户注册排行榜,要求是实时更新,查询要快.员工所属支行.二级行.省行,界面要根据条件显示排名数据.效果如下图所示: 原型图展示比较随意,用excel ...

  9. 使用 Redis 实现语音社交聊天室源码中的排行榜功能

    在语音社交聊天室源码中,排行榜功能是一个很普遍的需求.使用 Redis 中有序集合的特性来实现排行榜是又好又快的选择. 一般语音社交聊天室源码的排行榜都是有实效性的,比如"用户积分榜&quo ...

最新文章

  1. 小米大数据:借助Apache Kylin打造高效、易用的一站式OLAP解决方案
  2. 英语语法---前言及索引
  3. python:collections模块
  4. php static method,php 类方法用static::hello(); 等同于 $this-hello();吗?
  5. 前端学习(2824):数据绑定前的代码编辑器技巧
  6. 八皇后问题和八数码问题的最陡上升爬山法、首选爬山法、随机重启爬山法、模拟退火算法的分析和实现
  7. Atitit uke消防防火规范 attilax总结
  8. 《穿越计算机的迷雾》读书笔记九
  9. 如何将NCM转换成MP3 - NCM转MP3转换软件
  10. CWDM SFP彩光模块知识百科
  11. NYOJ54 小明的存钱计划
  12. Deferred异步操作
  13. java多页码分页_对页码进行分页
  14. 从校园到职场,别让父母限制了你的天花板
  15. FTP协议(指令集)
  16. JavaCV - 图像锐化
  17. transE论文阅读 19年记录的
  18. GD32103系列 电机驱动项目总结
  19. 兽医提醒:狗狗生病的9个征兆,建议铲屎官收藏,以备不时之需!
  20. TMC4671-LA完全集成伺服控制器电机驱动芯片带FOC控制

热门文章

  1. jsp新webshell的探索之旅
  2. 格式化字符串_列表_元组
  3. git 配置origin_Git常规配置与用法
  4. 解决Docker Swarm重装.yml文件后无法创建新Service
  5. HashMap 深拷贝
  6. 2022 CSP-J 游记
  7. c语言延时变频1kHz和2kHz,1高频电子线路复习题及答案
  8. day1(Python爬虫:天气
  9. Android新荣耀手机角标只增不减
  10. 解说文案哪个网站好?解说文案素材哪里找?4大影视解说文案网站