SpringBoot集成Redis 灵活使用 TypedTuple 和 DefaultTypedTuple 实现 Redis ZSet 的复杂操作
以下是 Spring Boot 集成 Redis 中 TypedTuple 和 DefaultTypedTuple 的详细使用说明,包含代码示例和场景说明:
1. 什么是 TypedTuple 和 DefaultTypedTuple?
-
TypedTuple<T>接口:
定义了 Redis 中有序集合(ZSet)的元素结构,包含 元素值(value) 和 分数(score)。T表示元素的类型(如String、自定义对象等)。
-
DefaultTypedTuple<T>类:
TypedTuple的实现类,用于创建包含元素和分数的元组对象,常用于 ZSet 的增删改查操作。
2. 使用场景
TypedTuple 主要用于以下场景:
- 存储带分数的元素(如排行榜、优先级队列)。
- 获取元素时同时获取分数(如查询用户积分及排名)。
- 批量操作 ZSet(如添加多个元素并指定分数)。
3. Spring Boot 配置
3.1 添加依赖
在 pom.xml 中添加以下依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId>
</dependency>
3.2 配置 RedisTemplate
@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(factory);// 设置键和值的序列化器template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(new GenericJackson2JsonRedisSerializer());return template;}
}
4. TypedTuple 的核心操作
4.1 创建 TypedTuple 对象
通过 DefaultTypedTuple 构造函数创建:
TypedTuple<String> tuple = new DefaultTypedTuple<>("Alice", 90.0); // 元素值为 "Alice",分数为90.0
4.2 添加元素到 ZSet
// 添加单个元素
redisTemplate.opsForZSet().add("leaderboard", "Alice", 90.0);// 或使用 TypedTuple 批量添加
redisTemplate.opsForZSet().add("leaderboard", new DefaultTypedTuple<>("Alice", 90.0),new DefaultTypedTuple<>("Bob", 85.0));
4.3 获取元素和分数
// 获取所有元素及其分数(按分数升序)
Set<ZSetOperations.TypedTuple<String>> tuples = redisTemplate.opsForZSet().reverseRangeWithScores("leaderboard", 0, -1);for (TypedTuple<String> tuple : tuples) {String member = tuple.getValue(); // 元素值(如 "Alice")Double score = tuple.getScore(); // 分数(如 90.0)System.out.println("Member: " + member + ", Score: " + score);
}
4.4 更新元素分数
// 更新元素的分数
redisTemplate.opsForZSet().add("leaderboard", "Alice", 95.0); // 若已存在,分数会被更新
4.5 删除元素
// 删除指定元素
redisTemplate.opsForZSet().remove("leaderboard", "Alice");
5. 完整代码示例
5.1 服务类实现
@Service
public class RankService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;// 添加用户到排行榜public void addUserToLeaderboard(String userId, double score) {redisTemplate.opsForZSet().add("leaderboard", userId, score);}// 获取前10名用户及其分数public List<ScoredUser> getTop10() {Set<ZSetOperations.TypedTuple<String>> tuples = redisTemplate.opsForZSet().reverseRangeWithScores("leaderboard", 0, 9);List<ScoredUser> result = new ArrayList<>();for (TypedTuple<String> tuple : tuples) {ScoredUser user = new ScoredUser();user.setId(tuple.getValue());user.setScore(tuple.getScore());result.add(user);}return result;}// 自定义返回对象@Dataprivate static class ScoredUser {private String id;private Double score;}
}
5.2 使用示例
@Autowired
private RankService rankService;// 添加用户
rankService.addUserToLeaderboard("user1001", 90.0);
rankService.addUserToLeaderboard("user1002", 85.0);// 获取前10名
List<ScoredUser> top10 = rankService.getTop10();
for (ScoredUser user : top10) {System.out.println("ID: " + user.getId() + ", Score: " + user.getScore());
}
6. 关键代码说明
6.1 添加元素(带分数)
// 直接添加元素和分数
redisTemplate.opsForZSet().add(key, member, score);// 使用 TypedTuple 批量添加
redisTemplate.opsForZSet().add(key, new DefaultTypedTuple<>("Alice", 90.0),new DefaultTypedTuple<>("Bob", 85.0));
6.2 获取元素和分数
// 获取带分数的元素(按分数降序)
Set<ZSetOperations.TypedTuple<String>> tuples = redisTemplate.opsForZSet().reverseRangeWithScores(key, start, end);// 遍历获取每个元素和分数
for (TypedTuple<String> tuple : tuples) {String member = tuple.getValue();Double score = tuple.getScore();
}
6.3 更新元素分数
// 若元素已存在,会更新其分数
redisTemplate.opsForZSet().add(key, member, newScore);
7. 总结表格
| 操作 | 方法 | 描述 |
|---|---|---|
| 添加元素 | opsForZSet().add(key, member, score) | 添加元素并指定分数。 |
| 批量添加 | opsForZSet().add(key, tuples) | 使用 TypedTuple 列表批量添加元素。 |
| 获取元素和分数 | opsForZSet().reverseRangeWithScores(key, start, end) | 获取指定范围的元素及其分数(按分数降序)。 |
| 更新分数 | opsForZSet().add(key, member, newScore) | 若元素已存在,更新其分数。 |
| 删除元素 | opsForZSet().remove(key, member) | 删除指定元素。 |
8. 注意事项
-
泛型类型:
TypedTuple<T>的类型T必须与 ZSet 中的元素类型一致(如String、自定义对象等)。- 若存储自定义对象,需确保序列化配置正确(如使用
GenericJackson2JsonRedisSerializer)。
-
分数范围查询:
- 使用
rangeByScoreWithScores(key, min, max)可根据分数范围获取元素。
- 使用
-
性能优化:
- 大量数据操作时,优先使用批量操作(如
add接受TypedTuple列表)。
- 大量数据操作时,优先使用批量操作(如
通过以上示例和说明,可以灵活使用 TypedTuple 和 DefaultTypedTuple 实现 Redis ZSet 的复杂操作。
相关文章:
SpringBoot集成Redis 灵活使用 TypedTuple 和 DefaultTypedTuple 实现 Redis ZSet 的复杂操作
以下是 Spring Boot 集成 Redis 中 TypedTuple 和 DefaultTypedTuple 的详细使用说明,包含代码示例和场景说明: 1. 什么是 TypedTuple 和 DefaultTypedTuple? TypedTuple<T> 接口: 定义了 Redis 中有序集合(ZSet…...
7-4 BCD解密
BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位。所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12。但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了。于是BCD的0x12被输出成了十进制的18了&#x…...
Golang改进后的任务调度系统分析
以下是整合了所有改进点的完整代码实现: package mainimport ("bytes""context""fmt""io""log""net/http""sync""time""github.com/go-redis/redis/v8""github.com/robfig/…...
【目标检测】【深度学习】【Pytorch版本】YOLOV2模型算法详解
【目标检测】【深度学习】【Pytorch版本】YOLOV2模型算法详解 文章目录 【目标检测】【深度学习】【Pytorch版本】YOLOV2模型算法详解前言YOLOV2的模型结构YOLOV2模型的基本执行流程YOLOV2模型的网络参数YOLOV2模型的训练方式 YOLOV2的核心思想前向传播阶段反向传播阶段 总结 前…...
NineData云原生智能数据管理平台新功能发布|2025年3月版
本月发布 15 项更新,其中重点发布 3 项、功能优化 11 项、性能优化 1 项。 重点发布 基础服务 - MFA 多因子认证 新增 MFA 多因子认证,提升账号安全性。系统管理员开启后,所有组织成员需绑定认证器,登录时需输入动态验证码。 数…...
破局与赋能:信息系统战略规划方法论
信息系统战略规划是将组织的战略目标和发展规划转化为信息系统的战略目标和发展规划的过程,常见的方法有以下几种: 一、企业系统规划法(BSP) 1.基本概念:通过全面调查,分析企业信息需求,确定信…...
GLSL(OpenGL 着色器语言)基础语法
GLSL(OpenGL 着色器语言)基础语法 GLSL(OpenGL Shading Language)是 OpenGL 计算着色器的语言,语法类似于 C 语言,但提供了针对 GPU 的特殊功能,如向量运算和矩阵运算。 着色器的开头总是要声明…...
Redis基础知识-3
RedisTemplate对多种数据结构的操作 1. String类型 示例代码: // 保存数据 redisTemplate.opsForValue().set("user:1001", "John Doe"); // 设置键值对,无过期时间 redisTemplate.opsForValue().set("user:1002", &qu…...
Git Rebase 操作中丢失提交的恢复方法
背景介绍 在团队协作中,使用 Git 进行版本控制是常见实践。然而,有时在执行 git rebase 或者其他操作后,我们可能会发现自己的提交记录"消失"了,这往往让开发者感到恐慌。本文将介绍几种在 rebase 后恢复丢失提交的方法。 问题描述 当我们执行以下操作时,可能…...
【diffusers 进阶(十五)】dataset 工具,Parquet和Arrow 数据文件格式,load dataset 方法
系列文章目录 【diffusers 极速入门(一)】pipeline 实际调用的是什么? call 方法!【diffusers 极速入门(二)】如何得到扩散去噪的中间结果?Pipeline callbacks 管道回调函数【diffusers极速入门࿰…...
unity各个面板说明
游戏开发,unity各个面板说明 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是Python基础语法。前后每一小节的内容是存在的有:学习and理解的关联性,希望对您有用~ unity简介-unity基础…...
游戏引擎学习第199天
回顾并发现我们可能破坏了某些东西 目前,我们的调试 UI 运行得相对顺利,可以创建可修改的调试变量,也可以插入分析器(profiler)等特殊视图组件,并进行一些交互操作。然而,在上一次结束时&#…...
Linux红帽:RHCSA认证知识讲解(十)使用 tar创建归档和压缩文件
Linux红帽:RHCSA认证知识讲解(十)使用 tar创建归档和压缩文件 前言一、归档与压缩的基本概念1.1 归档与压缩的区别 二、使用tar创建归档文件2.1 tar命令格式2.2 示例操作 三、使用tar进行压缩3.2 命令格式3.3 示例操作 前言 在红帽 Linux 系…...
端到端机器学习流水线(MLflow跟踪实验)
目录 端到端机器学习流水线(MLflow跟踪实验)1. 引言2. 项目背景与意义2.1 端到端机器学习流水线的重要性2.2 MLflow的作用2.3 工业级数据处理需求3. 数据集生成与介绍3.1 数据集构成3.2 数据生成方法4. 机器学习流水线与MLflow跟踪4.1 端到端机器学习流水线4.2 MLflow跟踪实验…...
相平面案例分析爱情故事
动态系统的分析可以分为三个步骤:第一步描述系统,通过语言来描述系统的特性,第一步描述系统,即通过语言来描述系统的特性;第二步数学分析,即使用数学工具对系统进行量化解析;第三步结果与讨论&a…...
《2024年全球DDoS攻击态势分析》
从攻击态势来看,2024年DDoS攻击频次继续呈增长趋势,2024年同步增加1.3倍;超大规模攻击激增,超800Gbps同比增长3.1倍,累计高达771次,且互联网史上最大带宽和最大包速率攻击均被刷新;瞬时泛洪攻击…...
RTC实时时钟M41T11M6F国产替代FRTC4111S
由NYFEA徕飞公司制造的FRTC4111S是一种低功耗的串行实时时钟(RTC),国产直接替代ST的M41T11M6F,其具有56字节的NVRAM,32.768 kHz振荡器(由外部晶体控制)和RAM的前8字节用于时钟/日历功能并以二进制编码十进制(BCD)格式配置。地址和数据通过两行双向总线串…...
Uni-app PDF Annotation plugin library online API examples
This article introduces the online version of the ElasticPDF API tutorial for the PDF annotation plug-in library in Uni-app projects. The API includes ① Export edited PDF data; ② Export annotations json data; ③ Reload old annotations; ④ Change files; ⑤…...
SpringKafka消息发布:KafkaTemplate与事务支持
文章目录 引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优化总结 引言 在现代分布式系统架构中,Apache Kafka作为高吞吐量的消息系统,被广泛应用于事件驱动应用开发。Spring Kafka为Java开发者提供了与Kafka交互…...
进行性核上性麻痹护理指南,助患者安稳生活
生活细致照料 安全保障:进行性核上性麻痹患者易出现平衡障碍、步态不稳,居家环境需格外留意安全。移除地面障碍物,保持通道畅通,在卫生间、走廊安装扶手,防止患者摔倒受伤。 饮食协助:患者常伴有吞咽困难&…...
提取嘉立创3D封装
嘉立创上元器件基本都有3D封装,当用AD或其他软件画PCB时,需要用到的3D封装可以从嘉立创EDA中提取。 首先新建工程,然后放置要提取3D封装的器件 导出-》3D文件 因为导出的文件中包含器件的3D封装和PCB板,需要把PCB板删除才能使用…...
工作记录 2017-03-24
工作记录 2017-03-24 序号 工作 相关人员 1 修改了邮件上的问题。 更新RD服务器。 郝 更新的问题 1、修改了New User时 init的保存。 2、文件的查询加了ID。 3、加了 patient insurance secondary 4、修改了payment detail的处理。 识别引擎监控 Ps (iCDA LOG :剔除…...
chromium魔改——修改 navigator.webdriver 检测
chromium源码官网 https://source.chromium.org/chromium/chromium/src 说下修改的chromium源码思路: 首先在修改源码过检测之前,我们要知道它是怎么检测的,找到他通过哪个JS的API来做的检测,只有知道了如何检测,我们…...
Qt 信号量使用方法
Qt 信号量使用方法 QSemaphore 类 常用函数介绍 函数名称函数功能QSemaphore()构造并初始化对象acquire()尝试获取n个资源,如果没有那么多资源,线程将阻塞直到有n个资源可用available()返回当前信号量可用的资源个数,这个数永远不可能为负…...
训练或微调以生成新组合结构
能通过训练或者微调,产生其它没有的组合的结构,比如有化学组成和空年组,想要生成指定化学成分指定空间组的结构,以下是针对需求的详细分析与实现思路,同时给出相应的 Python 代码示例。 1. 训练或微调以生成新组合结构…...
【通俗易懂说模型】生成对抗网络·GAN
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀《深度学习理论直觉三十讲》_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目…...
容器适配器-stack栈
C标准库不只是包含了顺序容器,还包含一些为满足特殊需求而设计的容器,它们提供简单的接口。 这些容器可被归类为容器适配器(container adapter),它们是改造别的标准顺序容器,使之满足特殊需求的新容器。 适配器:也称配置器,把一…...
7-6 混合类型数据格式化输入
本题要求编写程序,顺序读入浮点数1、整数、字符、浮点数2,再按照字符、整数、浮点数1、浮点数2的顺序输出。 输入格式: 输入在一行中顺序给出浮点数1、整数、字符、浮点数2,其间以1个空格分隔。 输出格式: 在一行中…...
【UE5 C++课程系列笔记】31——创建Json并保存为文件
目录 方式一(不推荐) 方式二(推荐) 一、生成普通Json对象 二、对象嵌套对象 三、对象嵌套数组 四、对象嵌套数组再嵌套对象 方式一(不推荐) 如下代码实现了把JSON字符串保存到文件中 #include &qu…...
Photoshop 2025 Mac中文 Ps图像编辑软件
Photoshop 2025 Mac中文 Ps图像编辑软件 文章目录 Photoshop 2025 Mac中文 Ps图像编辑软件一、介绍二、效果三、下载 一、介绍 Adobe Photoshop 2025 Mac版集成了多种强大的图像编辑、处理和创作功能。①强化了Adobe Sensei AI的应用,通过智能抠图、自动修复、图像…...
