Spring Boot 2.x 到 3.x 迁移实战:Redis 配置篇

发布于:2025-03-29 ⋅ 阅读:(28) ⋅ 点赞:(0)

前言

随着 Spring Boot 3.x 的发布,其对 Java 17 的支持和 模块化架构 的深化,Redis 配置与集成方式发生了显着变化。今天简单讲下redis的变化


一、Redis 配置前缀的模块化演进:从 spring.redisspring.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 配置文件迁移步骤

  1. 替换前缀
    • spring.redis 改为 spring.data.redis
  2. 移除 Jedis 配置
    • 删除 jedis.pool 相关参数。
  3. 检查超时单位
    • timeoutread-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

十二、进一步阅读


网站公告

今日签到

点亮在社区的每一天
去签到