重学SpringBoot3-集成Redis(十三)之点排行榜实现
更多SpringBoot3内容请关注我的专栏:《SpringBoot3》
期待您的点赞👍收藏⭐评论✍
重学SpringBoot3-集成Redis(十三)之点排行榜实现
- 1. 为什么选择 Redis 来实现排行榜?
- 2. 项目环境准备
- 2.1. 添加依赖
- 2.2. 配置 Redis 连接
- 3. 排行榜功能实现
- 3.1 排行榜服务的实现
- 3.2 排行榜功能的 REST 接口
- 3.3 测试接口
- 4. 关键代码解析
- 5. 小结
在现代应用程序中,排行榜功能常用于展示用户或内容的排名,如游戏中的分数排名、社交平台上的活跃度排名等。Redis 提供的有序集合(Sorted Set)结构,能够通过分数进行排序,非常适合用来构建排行榜。本文将介绍如何使用 Spring Boot 3 和 Redis 实现一个简单的排行榜功能。
1. 为什么选择 Redis 来实现排行榜?
Redis 的有序集合(Sorted Set)具备以下优点:
- 高效排序:有序集合是通过分数(Score)来进行排序的,支持快速的插入、删除和排序操作。
- 高性能:Redis 是内存数据库,读写速度非常快,特别适合实时性要求高的应用。
- 丰富的操作:Redis 提供了多种操作命令,如按分数范围查询、获取前 N 名等,非常适合排行榜的需求。
Redis 有序集合通过 zadd
命令向集合中添加成员,并为每个成员设置一个分数。通过 zrange
等命令可以按分数从小到大或从大到小获取成员的排名。
2. 项目环境准备
2.1. 添加依赖
首先,在 pom.xml
中引入 Spring Boot 3 和 Redis 的相关依赖,具体参考重学SpringBoot3-集成Redis(一)之基本使用:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
2.2. 配置 Redis 连接
在 application.yml
中配置 Redis:
spring:data:redis:host: localhostport: 6379 # Redis 端口password: redis123456 # 如果有密码可以在这里配置lettuce:pool:max-active: 100 # 最大并发连接数max-idle: 50 # 最大空闲连接数min-idle: 10 # 最小空闲连接数
3. 排行榜功能实现
3.1 排行榜服务的实现
我们使用 Redis 的有序集合(Sorted Set
)来存储排行榜的数据。成员(用户或内容)作为集合的元素,得分(如游戏分数、点赞数)作为排序依据。
package com.coderjia.boot310redis.service;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;import java.util.HashMap;
import java.util.Map;
import java.util.Set;/*** @author CoderJia* @create 2024/10/7 下午 09:13* @Description**/
@Service
public class LeaderboardService {@Autowiredprivate StringRedisTemplate redisTemplate;private static final String LEADERBOARD_KEY = "leaderboard";// 添加用户及其得分到排行榜public void addUserToLeaderboard(String userId, double score) {redisTemplate.opsForZSet().add(LEADERBOARD_KEY, userId, score);}// 获取前N名用户public Set<String> getTopUsers(int n) {return redisTemplate.opsForZSet().reverseRange(LEADERBOARD_KEY, 0, n - 1);}// 获取某个用户的排名public Long getUserRank(String userId) {return redisTemplate.opsForZSet().reverseRank(LEADERBOARD_KEY, userId);}// 获取某个用户的得分public Double getUserScore(String userId) {return redisTemplate.opsForZSet().score(LEADERBOARD_KEY, userId);}// 获取用户的排名和得分public Map<String, Object> getUserRankAndScore(String userId) {Map<String, Object> result = new HashMap<>();result.put("rank", getUserRank(userId));result.put("score", getUserScore(userId));return result;}
}
3.2 排行榜功能的 REST 接口
为排行榜功能创建简单的 REST API,用户可以通过该接口添加分数、查看前几名和用户排名等操作。
package com.coderjia.boot310redis.demos.web;import com.coderjia.boot310redis.service.LeaderboardService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.util.Map;
import java.util.Set;/*** @author CoderJia* @create 2024/10/10 下午 10:36* @Description**/
@RestController
@RequestMapping("/api/leaderboard")
public class LeaderboardController {@Autowiredprivate LeaderboardService leaderboardService;// 添加用户得分@PostMapping("/add")public ResponseEntity<String> addUser(@RequestParam("userId") String userId, @RequestParam("score") double score) {leaderboardService.addUserToLeaderboard(userId, score);return ResponseEntity.ok("User added to leaderboard.");}// 获取前N名@GetMapping("/top")public ResponseEntity<Set<String>> getTopUsers(@RequestParam("topN") int topN) {return ResponseEntity.ok(leaderboardService.getTopUsers(topN));}// 获取某个用户的排名和得分@GetMapping("/user/{userId}")public ResponseEntity<Map<String, Object>> getUserRankAndScore(@PathVariable String userId) {return ResponseEntity.ok(leaderboardService.getUserRankAndScore(userId));}
}
3.3 测试接口
你可以使用 Postman 或 curl 来测试这些接口。例如,添加用户的接口请求可以这样发起:
curl -X POST "http://localhost:8080/api/leaderboard/add?userId=1&score=100"
获取前 5 名的接口请求:
curl -X GET "http://localhost:8080/api/leaderboard/top?topN=5"
获取某个用户的排名和得分:
curl -X GET "http://localhost:8080/api/leaderboard/user/1"
4. 关键代码解析
redisTemplate.opsForZSet().add(key, value, score)
:将用户 ID 和分数作为一对数据添加到有序集合中,key
为排行榜的键。redisTemplate.opsForZSet().reverseRange(key, start, end)
:根据分数从高到低获取排行榜前几名用户。redisTemplate.opsForZSet().reverseRank(key, value)
:获取用户的排名,返回值是排名(从 0 开始)。redisTemplate.opsForZSet().score(key, value)
:获取用户的分数。
5. 小结
使用 Spring Boot 3 与 Redis 实现排行榜非常高效且简便。Redis 的有序集合为我们提供了强大的排序功能,能够轻松处理各种排行榜需求。通过该方案,我们可以实现以下功能:
- 动态添加用户得分到排行榜
- 实时获取前几名的用户
- 查询用户的排名和分数
Redis 由于其快速的读写性能,非常适合用于实时性要求高的排行榜应用场景。如果你需要开发类似的功能,Redis 无疑是一个理想的选择。
相关文章:

重学SpringBoot3-集成Redis(十三)之点排行榜实现
更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(十三)之点排行榜实现 1. 为什么选择 Redis 来实现排行榜?2. 项目环境准备2.1. 添加依赖2.2. 配置 Redis 连…...

Java 中方法参数传递的陷阱
前言 在编程过程中,我们经常会遇到一些看似简单却容易出错的问题。本文将通过一个具体的例子,探讨 Java 中方法参数传递的陷阱,并提供详细的解决方法。希望这篇文章能帮助你在未来的开发中避免类似的错误。 问题背景 假设我们的任务是计算…...

哪家云电脑便宜又好用?ToDesk云电脑、顺网云、达龙云全方位评测
陈老老老板🤴 🧙♂️本文专栏:生活(主要讲一下自己生活相关的内容)生活就像海洋,只有意志坚强的人,才能到达彼岸。 🧙♂️本文简述:讲一下市面上云电脑的对比。 🧙♂️上一篇文…...

【汇编语言】寄存器(内存访问)(三)—— 字的传送
文章目录 前言1. 字的传送2. 问题一3. 问题一的分析与解答4. 问题二5. 问题二的分析与解答结语 前言 📌 汇编语言是很多相关课程(如数据结构、操作系统、微机原理)的重要基础。但仅仅从课程的角度出发就太片面了,其实学习汇编语言…...

6 机器学习之应用现状
在过去二十年中,人类收集、存储、传输、处理数据的能力取得了飞速提升,人类社会的各个角落都积累了大量数据,亟需能有效地对数据进行分析利用的计算机算法,而机器学习恰顺应了大时代的这个迫切需求,因此该学科领域很自…...

相似度为 K 的字符串
题目链接 相似度为 K 的字符串 题目描述 注意 s1和s2只包含集合 {‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’} 中的小写字母s2是s1的一个字母异位词 解答思路 可以深度优先遍历交换字母使得s1和s2尽可能接近,基本思路是:设定一个指针idx指向s1和s2的…...

[云] Project Analysis
项目要求分析: 开放性选题: 主题范围:任何与云计算系统相关的主题。项目类型:可以是技术、商业或研究项目。团队规模:最多可组成三人小组。 示例主题: 分析公共云数据:例如,AWS公共数…...

腾讯六宫格本地识别,本地模型识别,腾讯六图识别
基于K哥爬虫昨天发的文章,特此训练了一版腾讯模型,效果不错,特此感谢K哥的指导,效果如下图: 有需求,有疑问的欢迎评论区点出...

Transformer图解以及相关的概念
前言 transformer是目前NLP甚至是整个深度学习领域不能不提到的框架,同时大部分LLM也是使用其进行训练生成模型,所以transformer几乎是目前每一个机器人开发者或者人工智能开发者不能越过的一个框架。接下来本文将从顶层往下去一步步掀开transformer的面…...

Nginx缓存静态文件
在Python项目中,通过Nginx缓存静态文件(如CSS、JS、图片等),可以有效提升网页的加载性能。Nginx可以帮助你缓存静态资源,减少服务器负担,并加速页面加载。 1. 配置Nginx缓存静态文件 首先,你需…...

【隐私计算】隐语HEU同态加密算法解读
HEU: 一个高性能的同态加密算法库,提供了多种 PHE 算法, 包括ZPaillier、FPaillier、IPCL、Damgard Jurik、DGK、OU、EC ElGamal 以及基于FPGA和GPU硬件加速版本的Paillier版本。 本文我们会基于GPU运行HEU Docker容器,编译打包GPaillier并测…...

用C#实现互斥操作
1、传统的lock lock简单易用,适合大多数场景,但在高竞争用情况下可能会导致线程阻塞; Object obj new object(); void method1(){lock (obj){// 进行互斥操作}}2、SpinLock SpinLock在低延迟情况下更有效,因为SpinLock会在忙等…...

【黑马点评优化】之使用Caffeine+Redis实现应用级二层缓存
【黑马点评优化】之使用CaffeineRedis实现应用级二层缓存 1 缓存雪崩定义及解决方案2 为什么要使用多级缓存3 RedisCaffeine实现应用层二级缓存原理4 利用CaffeineRedis解决Redis突然宕机导致的缓存雪崩问题4.1 pom.xml文件引入相关依赖4.2 本地缓存配置类4.3 修改ShopServiceI…...

CEEMDAN +组合预测模型(BiLSTM-Attention + ARIMA)
往期精彩内容: 时序预测:LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较 全是干货 | 数据集、学习资料、建模资源分享! EMD、EEMD、FEEMD、CEEMD、CEEMDAN的区别、原理和Python实现(一)EMD-CSDN博客 EMD、EEM…...

2.1.ReactOS系统中断描述符的格式KIDTENTRY结构体
2.1.ReactOS系统中断描述符的格式KIDTENTRY结构体 2.1.ReactOS系统中断描述符的格式KIDTENTRY结构体 文章目录 2.1.ReactOS系统中断描述符的格式KIDTENTRY结构体KIDTENTRY KIDTENTRY 数据结构KIDTENTRY定义了CPU对中断描述符的格式 // // …...

三、ElementPlus下拉搜索加弹窗组件的封装
近期产品提出了一个需求,要求一个form的表单里面的一个组件既可以下拉模糊搜索,又可以弹窗搜索,我就为这个封装了一个组件,下面看效果图。 效果大家看到了,下面就看组件封装和实现方法 第一步,组件封装&…...

androidStudio编译导致的同名.so文件冲突问题解决
files found with path lib/arm64-v8a/libserial_port.so from inputs: ...\build\intermediates\library_jni\debug\jni\arm64-v8a\libserial_port.so C:\Users\...\.gradle\caches\transforms-3\...\jni\arm64-v8a\XXX.so 解决方式如下: 1.将gradle缓存文件删…...

大学新生编程入门指南:如何选择编程语言与制定学习计划
大学新生编程入门指南:如何选择编程语言与制定学习计划 编程已成为当代大学生的必备技能,尤其是在信息技术高速发展的今天,编程能力不仅能帮助你在课堂学习中脱颖而出,更能为未来职业生涯打下坚实的基础。然而,面对如…...

SpringAI快速上手
一、导入依赖 镜像(导入maven依赖) <repositories><repository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><releases><enabled>…...

07 django管理系统 - 部门管理 - 搜索部门
在dept_list.html中,添加搜索框 <div class"container-fluid"><div style"margin-bottom: 10px" class"clearfix"><div class"panel panel-default"><!-- Default panel contents --><div clas…...

数据操作学习
1.导入torch。虽然被称为PyTorch,但应导入torch而不是pytorch import torch 2.张量表示一个数值组成的数组,这个数组可能有多个维度 xtorch.arange(12)x 3.通过张量的shape属性来访问张量的形状和张量中元素的总数 x.shape x.numel() 4.要改变张量的形…...

什么是网络代理
了解网络代理 网络代理是一种特殊的网络服务,它允许一个网络终端(通常指客户端)通过这个服务与另一个网络终端(通常指服务器)进行非直接的连接。网络代理服务器位于发送主机和接收主机之间,接收网络请求&a…...

安防监控摄像头图传模组,1公里WiFi无线传输方案,监控新科技
在数字化浪潮汹涌的今天,安防监控领域也迎来了技术革新的春风。今天,我们就来聊聊这一领域的产品——摄像头图传模组,以及它如何借助飞睿智能1公里WiFi无线传输技术,为安防监控带来未有的便利与高效。 一、安防监控的新篇章 随着…...

问:JVM中GC类型有哪些?触发条件有哪些?区别是啥?
在Java虚拟机(JVM)中,垃圾收集(GC)是自动管理内存的关键机制。GC负责识别并回收那些不再被程序使用的对象,以释放内存空间。根据回收的区域和策略的不同,JVM中的GC可以分为多种类型。 一、GC的…...

【操作系统的使用】Linux 输入输出重定向:掌握控制台的高级用法
文章目录 Linux 输入输出重定向:掌握控制台的高级用法输出重定向将命令输出保存到文件将命令输出追加到文件 输入重定向从文件读取输入 管道操作将多个命令的输出链接起来 错误重定向将错误信息保存到文件同时重定向输出和错误信息 Linux 输入输出重定向:…...

无线通信中的四个关键概念:OFDM、多径效应、CSI和信道均衡
无线通信中的四个关键概念:OFDM、多径效应、CSI和信道均衡 无线通信技术在现代通信系统中发挥着至关重要的作用。无论是日常的手机通信,还是复杂的物联网应用,理解无线信道的特性和优化信号传输的技术是关键。在本文中,我们将介绍…...

如何高效规划千人大会?数字化会议管理的实战经验分享!建议收藏!
在当今快节奏的商业环境中,大型会议不仅是企业展示自身实力、促进交流合作的重要平台,更是推动行业发展、分享创新思维的关键活动。然而,随着参会人数的增加,如何高效规划并管理一场千人大会,成为了组织者面临的巨大挑…...

mysql指令笔记(基本)
一、数据库操作 创建数据库:CREATE DATABASE database_name;选择数据库:USE database_name;删除数据库:DROP DATABASE database_name; 二、表操作 创建表:CREATE TABLE table_name (column1 datatype constraint, column2 datat…...

web前端-----html5----用户注册
以改图为例 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>用户注册</title> </hea…...

bug的定义和测试
一、软件测试的生命周期 软件测试的⽣命周期是指测试流程,这个流程是按照⼀定顺序执⾏的⼀系列特定的步骤,去保证产品 质量符合需求。在软件测试⽣命周期流程中,每个活动都按照计划的系统的执⾏。每个阶段有不同的 ⽬标和交付产物 需求分析…...