SpringBoot集成Redis 灵活使用 TypedTuple 和 DefaultTypedTuple 实现 Redis ZSet 的复杂操作

以下是 Spring Boot 集成 Redis 中 TypedTupleDefaultTypedTuple 的详细使用说明,包含代码示例和场景说明:


1. 什么是 TypedTuple 和 DefaultTypedTuple?

  • TypedTuple<T> 接口
    定义了 Redis 中有序集合(ZSet)的元素结构,包含 元素值(value)分数(score)

    • T 表示元素的类型(如 String、自定义对象等)。
  • DefaultTypedTuple<T>
    TypedTuple 的实现类,用于创建包含元素和分数的元组对象,常用于 ZSet 的增删改查操作


2. 使用场景

TypedTuple 主要用于以下场景:

  1. 存储带分数的元素(如排行榜、优先级队列)。
  2. 获取元素时同时获取分数(如查询用户积分及排名)。
  3. 批量操作 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. 注意事项

  1. 泛型类型

    • TypedTuple<T> 的类型 T 必须与 ZSet 中的元素类型一致(如 String、自定义对象等)。
    • 若存储自定义对象,需确保序列化配置正确(如使用 GenericJackson2JsonRedisSerializer)。
  2. 分数范围查询

    • 使用 rangeByScoreWithScores(key, min, max) 可根据分数范围获取元素。
  3. 性能优化

    • 大量数据操作时,优先使用批量操作(如 add 接受 TypedTuple 列表)。

通过以上示例和说明,可以灵活使用 TypedTupleDefaultTypedTuple 实现 Redis ZSet 的复杂操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/74979.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

递归实现组合型枚举(DFS)

从 1∼n 这 n 个整数中随机选出 m 个&#xff0c;输出所有可能的选择方案。 输入格式 两个整数 n,m,在同一行用空格隔开。 输出格式 按照从小到大的顺序输出所有方案&#xff0c;每行 1 个。 首先&#xff0c;同一行内的数升序排列&#xff0c;相邻两个数用一个空格隔开。…

CentOS 7 镜像源失效解决方案(2025年)

执行 yum update 报错&#xff1a; yum install -y yum-utils \ > device-mapper-persistent-data \ > lvm2 --skip-broken 已加载插件&#xff1a;fastestmirror, langpacks Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http://mirror…

vue3 脚手架初始化项目生成文件的介绍

文章目录 一、介绍二、举例说明1.src/http/index.js2.src/router/index.js3.src/router/routes.js4.src/stores/index.js5.src/App.vue6.src/main.js7.babel.config.js8.jsconfig.json9.vue.config.js10. .env11.src/mock/index.js12.src/mock/mock-i18n.js13.src/locales/en.j…

ubuntu 20.04 编译和运行A-LOAM

1.搭建文件目录和clone代码 mkdir -p A-LOAM/src cd A-LOAM/src git clone https://github.com/HKUST-Aerial-Robotics/A-LOAM cd .. 2.修改代码文件 2.1 由于PCL版本1.10&#xff0c;将CMakeLists.txt中的C标准改为14&#xff1a; set(CMAKE_CXX_FLAGS "-stdc14"…

【教程】MacBook 安装 VSCode 并连接远程服务器

目录 需求步骤问题处理 需求 在 Mac 上安装 VSCode&#xff0c;并连接跳板机和服务器。 步骤 Step1&#xff1a;从VSCode官网&#xff08;https://code.visualstudio.com/download&#xff09;下载安装包&#xff1a; Step2&#xff1a;下载完成之后&#xff0c;直接双击就能…

LabVIEW 长期项目开发

LabVIEW 凭借其图形化编程的独特优势&#xff0c;在工业自动化、测试测量等领域得到了广泛应用。对于长期运行、持续迭代的 LabVIEW 项目而言&#xff0c;其开发过程涵盖架构设计、代码管理、性能优化等多个关键环节&#xff0c;每个环节都对项目的成功起着至关重要的作用。下面…

用matlab搭建一个简单的图像分类网络

文章目录 1、数据集准备2、网络搭建3、训练网络4、测试神经网络5、进行预测6、完整代码 1、数据集准备 首先准备一个包含十个数字文件夹的DigitsData&#xff0c;每个数字文件夹里包含1000张对应这个数字的图片&#xff0c;图片的尺寸都是 28281 像素的&#xff0c;如下图所示…

Go 语言语法精讲:从 Java 开发者的视角全面掌握

《Go 语言语法精讲&#xff1a;从 Java 开发者的视角全面掌握》 一、引言1.1 为什么选择 Go&#xff1f;1.2 适合 Java 开发者的原因1.3 本文目标 二、Go 语言环境搭建2.1 安装 Go2.2 推荐 IDE2.3 第一个 Go 程序 三、Go 语言基础语法3.1 变量与常量3.1.1 声明变量3.1.2 常量定…

如何选择优质的安全工具柜:材质、结构与功能的考量

在工业生产和实验室环境中&#xff0c;安全工具柜是必不可少的设备。它不仅承担着工具的存储任务&#xff0c;还直接影响工作环境的安全和效率。那么&#xff0c;如何选择一个优质的安全工具柜呢&#xff1f;关键在于对材质、结构和功能的考量。 01材质&#xff1a;耐用与防腐 …

系统与网络安全------Windows系统安全(11)

资料整理于网络资料、书本资料、AI&#xff0c;仅供个人学习参考。 制作U启动盘 U启动程序 下载制作U启程序 Ventoy是一个制作可启动U盘的开源工具&#xff0c;只需要把ISO等类型的文件拷贝到U盘里面就可以启动了 同时支持x86LegacyBIOS、x86_64UEFI模式。 支持Windows、L…

【5】搭建k8s集群系列(二进制部署)之安装master节点组件(kube-controller-manager)

注&#xff1a;承接专栏上一篇文章 一、创建配置文件 cat > /opt/kubernetes/cfg/kube-controller-manager.conf << EOF KUBE_CONTROLLER_MANAGER_OPTS"--logtostderrfalse \\ --v2 \\ --log-dir/opt/kubernetes/logs \\ --leader-electtrue \\ --kubeconfig/op…

C#里第一个WPF程序

WPF程序对界面进行优化,但是比WINFORMS的程序要复杂很多, 并且界面UI基本上不适合拖放,所以需要比较多的时间来布局界面, 产且需要开发人员编写更多的代码。 即使如此,在面对诱人的界面表现, 随着客户对界面的需求提高,还是需要采用这样的方式来实现。 界面的样式采…

createContext+useContext+useReducer组合管理React复杂状态

createContext、useContext 和 useReducer 的组合是 React 中管理全局状态的一种常见模式。这种模式非常适合在不引入第三方状态管理库&#xff08;如 Redux&#xff09;的情况下&#xff0c;管理复杂的全局状态。 以下是一个经典的例子&#xff0c;展示如何使用 createContex…

记一次常规的网络安全渗透测试

目录&#xff1a; 前言 互联网突破 第一层内网 第二层内网 总结 前言 上个月根据领导安排&#xff0c;需要到本市一家电视台进行网络安全评估测试。通过对内外网进行渗透测试&#xff0c;网络和安全设备的使用和部署情况&#xff0c;以及网络安全规章流程出具安全评估报告。本…

el-table,新增、复制数据后,之前的勾选状态丢失

需要考虑是否为 更新数据的方式不对 如果新增数据的方式是直接替换原数据数组&#xff0c;而不是通过正确的响应式数据更新方式&#xff08;如使用 Vue 的 this.$set 等方法 &#xff09;&#xff0c;也可能导致勾选状态丢失。 因为 Vue 依赖数据的响应式变化来准确更新视图和…

第15届蓝桥杯java-c组省赛真题

目录 一.拼正方形 1.题目 2.思路 3.代码 二.劲舞团 1.题目 2.思路 3.代码 三.数组诗意 1.题目 2.思路 3.代码 四.封闭图形个数 1.题目 2.思路 3.代码 五.吊坠 1.题目 六.商品库存管理 1.题目 2.思路 3.代码 七.挖矿 1.题目 2.思路 3.代码 八.回文字…

玄机-应急响应-入侵排查

靶机排查目标&#xff1a; 1.web目录存在木马&#xff0c;请找到木马的密码提交 查看/var/www/html。 使用find命令查找 find ./ -type f -name "*.php | xargs grep "eval("查看到1.php里面存在无条件一句话木马。 2.服务器疑似存在不死马&#xff0c;请找…

usbip学习记录

USB/IP: USB device sharing over IP make menuconfig配置&#xff1a; Device Drivers -> Staging drivers -> USB/IP support Device Drivers -> Staging drivers -> USB/IP support -> Host driver 如果还有作为客户端的需要&#xff0c;继续做以下配置&a…

爱普生高精度车规晶振助力激光雷达自动驾驶

在自动驾驶技术快速落地的今天&#xff0c;激光雷达作为车辆的“智慧之眼”&#xff0c;其测距精度与可靠性直接决定了自动驾驶系统的安全上限。而在这双“眼睛”的核心&#xff0c;爱普生&#xff08;EPSON&#xff09;的高精度车规晶振以卓越性能成为激光雷达实现毫米级感知的…

28--当路由器开始“宫斗“:设备控制面安全配置全解

当路由器开始"宫斗"&#xff1a;设备控制面安全配置全解 引言&#xff1a;路由器的"大脑保卫战" 如果把网络世界比作一座繁忙的城市&#xff0c;那么路由器就是路口执勤的交通警察。而控制面&#xff08;Control Plane&#xff09;就是警察的大脑&#xf…