Spring Boot 2.x 到 3.x 迁移实战:Redis 配置篇
前言
随着 Spring Boot 3.x 的发布,其对 Java 17 的支持和 模块化架构 的深化,Redis 配置与集成方式发生了显著变化。今天简单讲下redis的变化
一、Redis 配置前缀的模块化演进:从 spring.redis 到 spring.data.redis
1.1 Spring Boot 2.x(Java 8)
- 配置前缀:
spring.redis - 示例:
spring:redis:host: localhostport: 6379password: mypasswordtimeout: 2000lettuce:pool:max-active: 8max-idle: 8 - 特点:直接通过
spring.redis配置 Redis 连接参数,未明确与 Spring Data 模块绑定。
1.2 Spring Boot 3.x(Java 17)
- 配置前缀:
spring.data.redis - 示例:
spring:data:redis:host: localhostport: 6379password: mypasswordtimeout: 2000msclient:type: lettucelettuce:pool:max-active: 8 - 模块化设计:遵循 Spring Data Commons 的统一命名规则,与
spring.data.mongodb等其他数据源保持一致,便于扩展和维护。
二、Redis 客户端库的颠覆性变化:Lettuce 一统天下
2.1 Spring Boot 2.x:Jedis 和 Lettuce 并存
- 支持客户端:
- Jedis:基于阻塞式 I/O,适合简单场景。
- Lettuce:基于 Netty 的非阻塞式,支持异步操作和响应式流(Reactive Streams)。
- 配置示例:
spring:redis:client-type: jedis # 或 lettucejedis:pool:max-active: 8lettuce:pool:max-active: 8
2.2 Spring Boot 3.x:Lettuce 独占
- 官方声明:
- Jedis 客户端被弃用,仅支持 Lettuce。
- 原因:Lettuce 的非阻塞特性更契合现代高并发场景,且与 Spring Reactor 生态深度集成。
- 配置示例:
spring:data:redis:client-type: lettucelettuce:pool:max-active: 8max-wait: 1000ms - 迁移建议:
<!-- 移除 Jedis 相关依赖 --> <!-- 保留 Lettuce 依赖 --> <dependency><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId> </dependency>
三、RedisTemplate 的序列化策略升级:从 Java 序列化到 JSON
3.1 Spring Boot 2.x
- 默认序列化器:
JdkSerializationRedisSerializer(基于 Java 序列化)。 - 问题:
- 序列化后键值对难以直接读取(如
"\xac\xed\x00...")。 - 跨语言兼容性差,且存在性能损耗。
- 序列化后键值对难以直接读取(如
3.2 Spring Boot 3.x
- 默认序列化器:
GenericJackson2JsonRedisSerializer(基于 JSON)。 - 优势:
- 键值对以 JSON 格式存储,可读性高。
- 跨语言兼容性好,适合微服务场景。
- 配置示例(若需恢复旧行为):
@Configuration public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(new JdkSerializationRedisSerializer());template.setConnectionFactory(factory);return template;} }
四、集群与哨兵模式的配置迁移
4.1 Spring Boot 2.x
spring:redis:cluster:nodes: localhost:7000,localhost:7001sentinel:master: master1nodes: localhost:26379
4.2 Spring Boot 3.x
spring:data:redis:cluster:nodes: localhost:7000,localhost:7001sentinel:master: master1nodes: localhost:26379
五、连接池与超时参数的规范化
5.1 Spring Boot 2.x
spring:redis:lettuce:pool:max-active: 8max-idle: 8min-idle: 0max-wait: -1read-timeout: 1000
5.2 Spring Boot 3.x
spring:data:redis:lettuce:pool:max-active: 8max-idle: 8min-idle: 0max-wait: -1msread-timeout: 1000ms
- 关键变化:
- 超时参数需显式指定单位(如
ms)。 max-wait改为max-wait-time(部分版本可能不同,需参考文档)。
- 超时参数需显式指定单位(如
六、Redisson 集成的路径调整
6.1 Spring Boot 2.x
spring:redis:redisson:config: |singleServerConfig:address: redis://localhost:6379
6.2 Spring Boot 3.x
spring:data:redis:redisson:config: |singleServerConfig:address: redis://localhost:6379
七、安全性配置:SSL/TLS 的统一路径
7.1 Spring Boot 3.x
spring:data:redis:ssl: truessl-trust-store: classpath:truststore.jksssl-trust-store-password: mypasswordssl-trust-store-type: JKS
八、迁移策略与最佳实践
8.1 配置文件迁移步骤
- 替换前缀:
- 将
spring.redis改为spring.data.redis。
- 将
- 移除 Jedis 配置:
- 删除
jedis.pool相关参数。
- 删除
- 检查超时单位:
- 为
timeout、read-timeout等参数添加ms后缀。
- 为
8.2 依赖管理
<!-- Spring Boot 3.x 依赖 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId><version>6.2.4.RELEASE</version> <!-- 保持最新版本 -->
</dependency>
8.3 测试与验证
@SpringBootTest
@AutoConfigureCache
public class RedisConfigTest {@Autowiredprivate RedisTemplate<String, String> redisTemplate;@Testpublic void testRedisConnection() {redisTemplate.opsForValue().set("testKey", "testValue");assertEquals("testValue", redisTemplate.opsForValue().get("testKey"));}
}
九、性能优化与高级配置
9.1 Lettuce 的异步与响应式支持
- 异步操作:
@Autowired private ReactiveRedisTemplate<String, String> reactiveTemplate;public Mono<String> asyncGet(String key) {return reactiveTemplate.opsForValue().get(key); } - 响应式流集成:
@Autowired private Flux<String> reactiveKeys() {return reactiveTemplate.keys("pattern:*").flatMap(key -> reactiveTemplate.opsForValue().get(key)); }
9.2 高级连接池配置
spring:data:redis:lettuce:pool:max-active: 100max-wait: 1000msmin-idle: 10max-idle: 50
十、总结:模块化设计的深层价值
Spring Boot 3.x 的配置调整并非简单的语法变化,而是 模块化设计 的体现:
- 统一命名空间:通过
spring.data.redis集中管理 Redis 配置,降低认知成本。 - 技术演进:淘汰 Jedis,拥抱 Lettuce 的非阻塞特性,提升性能与可维护性。
- 配置标准化:强制单位标注(如
timeout: 2000ms)减少配置歧义。
十一、附录:关键配置对比表
| 配置项 | Spring Boot 2.x | Spring Boot 3.x |
|---|---|---|
| 客户端类型 | spring.redis.client-type | spring.data.redis.client-type |
| 连接池配置 | spring.redis.pool | spring.data.redis.lettuce.pool |
| JSON 序列化 | 需手动配置 | 默认启用 |
| SSL 配置 | spring.redis.ssl | spring.data.redis.ssl |
| Redisson 集成路径 | spring.redis.redisson | spring.data.redis.redisson |
十二、进一步阅读
- Spring Boot 3.x 迁移指南
- Spring Data Redis 文档
- Lettuce 官方文档
相关文章:
Spring Boot 2.x 到 3.x 迁移实战:Redis 配置篇
前言 随着 Spring Boot 3.x 的发布,其对 Java 17 的支持和 模块化架构 的深化,Redis 配置与集成方式发生了显著变化。今天简单讲下redis的变化 一、Redis 配置前缀的模块化演进:从 spring.redis 到 spring.data.redis 1.1 Spring Boot 2.x&…...
SQL Server:用户权限
目录 创建 & 删除1. 创建用户命令整理创建 admin2 用户创建 admin_super 用户 2. 删除用户命令删除 admin2 用户删除 admin_super 用户 3. 创建时权限的区别admin2 用户权限admin_super 用户权限 查看方法一:使用对象资源管理器(图形化界面ÿ…...
Windows .gitignore文件不生效的情况排查
概述 今天下班在家里捣腾自己的代码,在配置.gitignore文件忽略部分文件的时候,发现死活不生效 问题根源 经过一通分析和排查才发现,是.gitignore文件的编码错了,刚开始还没注意到,因为是在Windows下开发,…...
cJSON 处理 JSON(轻量级 C 语言库)(二)
第二部分:cJSON 处理 JSON(轻量级 C 语言库) 📢 快速掌握 cJSON!文章 + 视频双管齐下 🚀 如果你觉得阅读文章太慢,或者更喜欢 边看边学 的方式,不妨直接观看我录制的 cJSON 课程视频!🎬 视频里会用更直观的方式讲解 cJSON 的核心概念、实战技巧,并配有动手演示…...
服务器数据恢复—误格式化NTFS文件系统分区别慌,NTFS数据复活秘籍
NTFS文件系统下格式化在理论上不会对数据造成太大影响,但有可能造成部分文件目录结构丢失的情况。下面介绍一个人为误操作导致服务器磁盘阵列中的NTFS文件系统分区被格式化后的服务器数据恢复案例。 服务器数据恢复过程: 1、将故障服务器连接到一台备份…...
《Linux运维总结:基于银河麒麟V10+ARM64架构CPU源码编译部署单实例redis7.2.6》
总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:《Linux运维篇:Linux系统运维指南》 一、环境信息 环境信息如下: 主机IP 操作系统 Redis版本 CPU架构 192.168.1.111 K…...
华为云对象存储服务(OBS)
华为云对象存储服务(OBS) 前言 华为云为开发者提供了丰富的 Java SDK,借助这些 SDK 能够方便地与华为云的各类服务进行交互。下面以 华为云对象存储服务(OBS) 的 Java SDK 为例,介绍其使用步骤。 华为云…...
【3】数据结构的双向链表章
目录标题 双向链表的定义双向链表的初始化双向链表的创建插入操作删除操作 双向链表总代码与调试 双向链表的定义 结点结构组成:数据域(data)、指针域(pre)、指针域(next)。其中, da…...
分布式环境下的主从数据同步
目录 1. 数据同步的推/拉方式 1.1 主节点推送 1.2 从节点拉取 1.3 常见组件的推拉方式 2.复制方式 2.1 同步复制 2.2 异步复制 2.3 半同步复制 2.4 常见组件的同步方式 3.日志格式 3.1 基于语句复制 SBR 3.2 基于行复制 RBR 3.3 基于预写日志 WAL 3.4 基于触发器…...
蓝桥杯杯赛-日期模拟
知识点 处理日期 1. 按天枚举日期:逐天遍历起始日期到结束日期范围内的每个日期。 2. 处理闰年:正确判断闰年条件。闰年定义为:年份 满足以下任意一个条件:(闰年的2月只有29天) 满足下面一个条件就是闰年 1> 是 400 的倍数…...
【SQL】MySQL基础2:视图,存储过程,游标,约束,触发器
文章目录 1. 视图2. 存储过程2.1 创建存储过程2.2 执行存储过程 3. 游标4. 约束4.1 主键约束4.2 外键约束4.3 唯一约束4.4 检查约束 5. 触发器 1. 视图 视图是虚拟的表,它是动态检索的部分。使用视图的原因:避免重复的SQL语句;使用表的部分而…...
【TS学习】(15)分布式条件特性
在 TypeScript 中,分布式条件类型(Distributive Conditional Types) 是一种特殊的行为,发生在条件类型作用于裸类型参数(Naked Type Parameter) 时。这种特性使得条件类型可以“分布”到联合类型的每个成员…...
Android 小组件
小部件的布局文件支持如下布局: FrameLayout LinearLayout RelativeLayout GridLayout 以及如下控件 AnalogClock Button Chronometer ImageButton ImageView ProgressBar TextView ViewFlipper ListView GridView StackView AdapterViewFlipper 应该不止这些有空…...
搭建开源笔记平台:outline
折腾的意义 为什么要自己搭建一个笔记平台?没理由,就是突然想试试。有时候突然有个想法,搜了一下正好有合适的方案,就顺手试一下。 其实已经有很多成熟的笔记软件,例如Notion/OneNote,但谁不想要一个数据完…...
Unity编辑器功能及拓展(2) —Gizmos编辑器绘制功能
Unity中的Gizmos功能是用于在场景视图中绘制辅助图形或图标的工具,帮助开发者在编辑模式下直观调试和可视化游戏对象的位置、范围、方向等信息。 一.定义概述 Gizomsd 概述 Gizoms是Unity提供的一个API,或者叫做一个工具类,包含一系列静态…...
电脑屏幕亮度随心控,在Windows上自由调整屏幕亮度的方法
调整电脑屏幕的亮度对于保护视力和适应不同环境光线条件非常重要。无论是在白天强光下还是夜晚昏暗环境中,合适的屏幕亮度都能让您的眼睛更加舒适。本文中简鹿办公小编将向您介绍几种在 Windows 系统中调整屏幕亮度的方法。 方法一:使用快捷键 大多数笔…...
presto行转列
presto的行列转换和spark、hive一样也是通过外链语句实现的,只不过语法和关键子有点不同,如下 with tmp1 as (select 1,2,3 as a1,4,5,6 as a2 ) select * from tmp1 cross join unnest(split(tmp1.a1, ,),split(tmp1.a2, ,) ) as b(a1s,a2s) 结果如下...
MySQL 5.7 Online DDL 技术深度解析
14.13.1 在线DDL操作 索引操作主键操作列操作生成列操作外键操作表操作表空间操作分区操作 索引操作 下表概述了对索引操作的在线DDL支持情况。星号表示有附加信息、例外情况或依赖条件。有关详细信息,请参阅语法和使用说明。 操作原地执行重建表允许并发DML仅修…...
【汽车功能安全:软件与硬件缺一不可】
随着汽车变得越来越智能,功能安全就成为汽车电子系统不可回避的标准体系,日益复杂的功能导致了汽车中电子元件的数量和复杂性的指数级增长(Leen)。如今高级别汽车拥有多达90个电子控制单元(ECU),…...
docker打包使用有头模式playwright
1.打包镜像 创建Dockerfile文件如下 # playywright 官方镜像 FROM mcr.microsoft.com/playwright:v1.37.0-jammy# 设置非交互式环境变量和时区 ENV DEBIAN_FRONTENDnoninteractive ENV TZEtc/UTC# 安装 Python 3.9 和 pip(修复时区阻塞问题) RUN apt-g…...
TCP/IP协议的应用层与传输层
TCP/IP协议簇是互联网的核心通信框架,定义了数据如何在网络中封装、寻址、传输和路由(确定数据包从源主机到目标主机的传输路径的过程)。 应用层 直接面向用户和应用,负责实现网络服务的具体功能(如网页浏览、文件传输…...
51c自动驾驶~合集15
我自己的原文哦~ https://blog.51cto.com/whaosoft/11720657 #DRAMA 首个基于Mamba的端到端运动规划器(新加坡国立) 运动规划是一项具有挑战性的任务,在高度动态和复杂的环境中生成安全可行的轨迹,形成自动驾驶汽车的核心能…...
拼多多 anti-token unidbg 分析
声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 逆向分析 版本7.3-7.4 都试过加密没什…...
【Git】5 个分区的切换方式及示例
目录 1. **工作区(Working Directory)**2. **缓存区(Stage/Index)**3. **本地仓库(Local Repository)**4. **远程仓库(Remote Repository)**5. **贮藏区(Stash࿰…...
Java高频面试之并发编程-02
hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶 面试官:进程和线程的区别是什么? 1. 资源分配与独立性 进程: 独立性:每个进程拥有独立的内存…...
openwebui和keycloak集成,使用keycloak的用户名和密码登录
1,实现效果 使用keycloak定义的用户名和密码,直接登录openwebui 2,实现原理 keycloak中用户信息中包含用户名和密码,以及email。 使用keycloak中的用户名和密码登录之后,会用email创建一个openwebui的账号。之后每次…...
html实现手势密码
<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>手势密码</title><style>body {font-fam…...
【区块链安全 | 第八篇】多签机制及恶意多签
部分参考:慢雾科技 文章目录 为什么需要多签多签机制Tron钱包下的恶意多签Tron 钱包多签权限分类Tron 多签机制的运作方式 恶意多签的过程黑客通过多签机制控制账户黑客剥夺用户权限,完全控制账户 恶意多签成因 在区块链中,多签(M…...
项目如何安装本地tgz包并配置局部registry
一、判断包来源是否正确 1. 检查url curl <registry_url>2. 查看包是否存在 npm view <package_name> --registry<registry_url>二、局部registry配置步骤: 1. 全局配置 如果你希望对所有项目生效,可以将这行配置添加到全局.npmr…...
二月公开赛Web-ssrfme
目录 环境搭建 题目分析 分析代码 解题过程 Redis未授权访问 寻找Flag 环境搭建 进入含有docker-compose.yml的文件内,拉取容器镜像 docker-compose up -d 题目分析 访问容器地址172.25.254.200:8091查看题目 分析代码 url通过GET请求访问界面,…...
