Redis怎么去实现排行榜的功能呢?这实际上也是非常有意思的一个需求,我们先来确定一下 Redis 实现排行榜都需要准备什么样子的工作。

Redis实现排行榜

为什么 Redis 可以实现排行榜的功能呢?

这也是和数据结构有一定的关系,因为我们大家的认知里面,都知道 Redis 支持各种数据类型的存储,有 String 有 List,还有 Set ,而 Redis 中就是因为有了这个 Set 所以实现排行榜就相对来说比较简单了,因为 Set 是有序的。

Sorted Sets数据类型就像是set和hash的混合,与sets一样,Sorted Sets是唯一的,不重复的字符串组成。可以说Sorted Sets也是Sets的一种。

Sorted Sets是通过Skip List(跳跃表)和hash Table(哈希表)的双端口数据结构实现的,因此每次添加元素时,Redis都会执行O(log(N))操作。所以当我们要求排序的时候,Redis根本不需要做任何工作了,早已经全部排好序了。元素的分数可以随时更新。

使用 Redis 实现排行榜

我们使用 Springboot 来整合一下 Redis 然后使用 Sorted Sets 来实现一下我们想做的这个排行榜。

  1. 创建 Springboot 项目,导入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.68</version></dependency>

我们在这里就使用 RedisTemplate,

2.增加配置

server:port: 9001
spring:redis:host: 127.0.0.1port: 6379password: 123456jedis:pool:max-active: 8max-wait: -1max-idle: 500min-idle: 0lettuce:shutdown-timeout: 0
给 Redis 中存数据信息
@Testpublic void batchAdd() {Set<ZSetOperations.TypedTuple<String>> tuples = new HashSet<>();long start = System.currentTimeMillis();for (int i = 0; i < 100000; i++) {DefaultTypedTuple<String> tuple = new DefaultTypedTuple<>("chuyikeji" + i, 1D + i);tuples.add(tuple);}System.out.println("循环时间:" +( System.currentTimeMillis() - start));Long num = redisTemplate.opsForZSet().add(SCORE_RANK, tuples);System.out.println("批量新增时间:" +(System.currentTimeMillis() - start));System.out.println("受影响行数:" + num);}

运行我们的测试可以看到

循环时间:56
批量新增时间:1015
受影响行数:100000
获取前10名(根据分数倒序)
@Testpublic void list() {Set<String> range = redisTemplate.opsForZSet().reverseRange(SCORE_RANK, 0, 10);System.out.println("获取到的排行列表:" + JSON.toJSONString(range));Set<ZSetOperations.TypedTuple<String>> rangeWithScores = redisTemplate.opsForZSet().reverseRangeWithScores(SCORE_RANK, 0, 10);System.out.println("获取到的排行和分数列表:" + JSON.toJSONString(rangeWithScores));}

这时候我们就能看到数据信息


获取到的排行列表:["chuyikeji99999","chuyikeji99998","chuyikeji99997","chuyikeji99996","chuyikeji99995","chuyikeji99994","chuyikeji99993","chuyikeji99992","chuyikeji99991","chuyikeji99990","chuyikeji99989"]获取到的排行和分数列表:[{"score":100000.0,"value":"chuyikeji99999"},{"score":99999.0,"value":"chuyikeji99998"},{"score":99998.0,"value":"chuyikeji99997"},{"score":99997.0,"value":"chuyikeji99996"},{"score":99996.0,"value":"chuyikeji99995"},{"score":99995.0,"value":"chuyikeji99994"},{"score":99994.0,"value":"chuyikeji99993"},{"score":99993.0,"value":"chuyikeji99992"},{"score":99992.0,"value":"chuyikeji99991"},{"score":99991.0,"value":"chuyikeji99990"},{"score":99990.0,"value":"chuyikeji99989"}]

我们在开头使用了批量新增的方式直接给把所有的数据都填充进去了,实际上肯定不是这个样子的,因为大部分的数据我们肯定都是一条记录一条记录增加的,比如现在有个新人 aaaa 他的得分是777 这时候我们要插入到 Redis 中


@Testpublic void add() {redisTemplate.opsForZSet().add(SCORE_RANK, "aaaa", 777);}

这时候我们获取一下 aaaa 的排名情况。


@Testpublic void find(){Long rankNum = redisTemplate.opsForZSet().reverseRank(SCORE_RANK, "aaaa");System.out.println("aaaa的个人排名:" + rankNum);Double score = redisTemplate.opsForZSet().score(SCORE_RANK, "aaaa");System.out.println("aaaa的分数:" + score);}

这时候我们看一下打印出来的结果

aaaa的个人排名:99224
aaaa的分数:777.0

如果我们在其中想查询 700分到800分之间的人数?

@Test
public void count(){Long count = redisTemplate.opsForZSet().count(SCORE_RANK, 701, 800);System.out.println("统计700-800之间的人数:" + count);}
统计700-800之间的人数:101
Redis 中的 Sorted Sets

Sorted Set有点像Set和Hash的结合体。
和Set一样,它里面的元素是唯一的,类型是String,所以它可以理解为就是一个Set。

但是Set里面的元素是无序的,而Sorted Set里面的元素都带有一个浮点值,叫做分数(score),所以这一点和Hash有点像,因为每个元素都映射到了一个值。

Redis实现排行榜相关推荐

  1. redis mysql排行榜实现_redis实现排行榜

    1 前言 实现一个排版榜,我们通常想到的就是mysql的order by 简单粗暴就撸出来了.但是这样真的优雅吗? 数据库是系统的瓶颈,这是众所周知的.如果给你一张百万的表,让你排序做排行榜,花费的时 ...

  2. SpringBoot集成Redis实现排行榜

    SpringBoot继承Redis实现排行榜 项目文件结构 1.修改maven文件 <?xml version="1.0" encoding="UTF-8" ...

  3. 手把手教你使用 Java 和 Redis 实现排行榜!

    编辑:业余草 来源:https://www.xttblog.com/?p=4937 前言 排行榜作为互联网应用中几乎必不可少的一个元素,其能够勾起人类自身对比的欲望,从而来增加商品的销量.排行榜的实现 ...

  4. php TP5 redis 实现排行榜功能 (日榜 周榜 月榜)

    php 结合tp5框架进行redis开发排行榜功能 下面附上我自己封装的redis类:数据持久化我目前是这么想的:同步存:然后定时检测是否过期,或者是否存在在去读数据遍历重新存储 <?php n ...

  5. 【Redis】Redis实现排行榜及相同积分按时间排序

    在日常的开发中,经常会碰到需要对用户的分值等进行排序,比如在游戏里面需要对战斗力进行排行,在组队活动中需要对各个队伍的贡献值进行排行,在微信中需要对各个好友的步数进行排行,此时一般会选择redis的有 ...

  6. 基于Redis的排行榜设计和实现

    基于redis的排行榜设计和实现 一.场景介绍 二.案例设计 1.有序集合命令语法 2.终端测试 1). 添加成绩记录 2).第一次top3查询 3).更新分数 4).再次top-3查询 三.代码示例 ...

  7. 【Redis最佳实践】使用DCS Redis实现排行榜功能

    本节基于华为云DCS Redis实践所编写,用于指导您在以下场景使用DCS Redis实现排行榜功能. 目录 场景介绍 代码示例 实践指导 运行结果 华为云DCS Redis介绍 场景介绍 在网页和A ...

  8. Redis实现排行榜、延迟队列、LRU、消息已读未读(Redisson客户端实现)

    目录 序言 Redis客户端选型 Redis配置 Redis实现排行榜 Redis实现延迟队列 Redis LRU(Least Recently Used)使用 Redis实现消息已读未读 总结 序言 ...

  9. Redis实现排行榜设计

    Redis实现排行榜设计 redis的zset结构有着天然的排序功能,十分适合并发量大的排行功能.通过key值确定排行榜的范围,使用members来作为排序的标识,score作为排序的依据.redis ...

  10. redis实战之使用redis实现排行榜

    转载:http://blog.csdn.net/u011250882/article/details/48632379 设想在一个游戏中,有上百万的玩家数据,如果现在需要你根据玩家的经验值整理一个前2 ...

最新文章

  1. 【Qt】在QtCreator中编译log4cplus
  2. 相机居然能存储气味,未来智能家居会是什么样? | CCF C³
  3. 鄙人为啥要在博客上记录学到的技术细节?
  4. SetInterval和SettimeOut(转载文章)
  5. Oracle 的一些语句
  6. SQLserver删除某数据库中所有表 方法 二
  7. (DFS or BFS)Find The Multiple(poj1426)
  8. 使用Jquery开发适合自己的幻灯片组件
  9. [c++] polymorphism without virtual function
  10. 罗马音平假名中文可复制_怎么记也记不住? 轻松打好日文50音基础的4个方法...
  11. 【nvidia npp】——图像resize
  12. 海康威视、python环境下onvif安装,多通道摄像头获取rtsp视频流
  13. webp图片格式、响应式图片
  14. Python Web 框架-Django day06
  15. 百度搜索框搜索时显示或者隐藏历史搜索记录
  16. python时间模块 datetime (datetime、timedelta和timezone部分)
  17. 最大似然估计与极大似然估计_使用最大似然估计对NFL球队排名
  18. Unix和Linux之间的区别?什么是bash?常用的linux命令
  19. VBA通达信股票交易接口获得方法
  20. Libnet 1.1教程

热门文章

  1. 3月6日云栖精选夜读 | 三七女生节,解密阿里女程序员们的代码诗!
  2. USART学习(一)
  3. 循环登录提示“您为登录或者认证已过期,请重新登录”
  4. PXE+Kickstart实现无人值守批量部署服务器
  5. java.io.FileNotFoundException: D:\xxx\yyy (拒绝访问。)
  6. 闭关修炼(十三)Netty入门
  7. CSU 1976: 搬运工小明(二分)
  8. 2019高考志愿填报微信群和qq群
  9. 投身AI战疫前你需要知道的前置知识
  10. 我最早欣赏的史诗巨片