前言
随着 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: localhost port: 6379 password: mypassword timeout: 2000 lettuce: pool: max-active: 8 max-idle: 8
- 特点:直接通过
spring.redis
配置 Redis 连接参数,未明确与 Spring Data 模块绑定。
1.2 Spring Boot 3.x(Java 17)
- 配置前缀:
spring.data.redis
- 示例:
spring: data: redis: host: localhost port: 6379 password: mypassword timeout: 2000ms client: type: lettuce lettuce: 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 # 或 lettuce jedis: pool: max-active: 8 lettuce: pool: max-active: 8
2.2 Spring Boot 3.x:Lettuce 独占
- 官方声明:
- Jedis 客户端被弃用,仅支持 Lettuce。
- 原因:Lettuce 的非阻塞特性更契合现代高并发场景,且与 Spring Reactor 生态深度集成。
- 配置示例:
spring: data: redis: client-type: lettuce lettuce: pool: max-active: 8 max-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 { @Bean public 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:7001
sentinel:
master: master1
nodes: localhost:26379
4.2 Spring Boot 3.x
spring:
data:
redis:
cluster:
nodes: localhost:7000,localhost:7001
sentinel:
master: master1
nodes: localhost:26379
五、连接池与超时参数的规范化
5.1 Spring Boot 2.x
spring:
redis:
lettuce:
pool:
max-active: 8
max-idle: 8
min-idle: 0
max-wait: -1
read-timeout: 1000
5.2 Spring Boot 3.x
spring:
data:
redis:
lettuce:
pool:
max-active: 8
max-idle: 8
min-idle: 0
max-wait: -1ms
read-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: true
ssl-trust-store: classpath:truststore.jks
ssl-trust-store-password: mypassword
ssl-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 {
@Autowired
private RedisTemplate<String, String> redisTemplate;
@Test
public 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: 100
max-wait: 1000ms
min-idle: 10
max-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 |