1. 概述

Spring Boot 的一大优势在于,它能将第三方组件的配置简化为寥寥几个属性。

本文将重点讲解 Spring Boot 是如何简化 Redis 集成的。通过少量配置即可快速接入 Redis,无论是作为缓存、数据库还是消息中间件,都能轻松搞定。

2. 为什么选择 Redis?

Redis 是目前最流行的内存数据结构存储系统之一。它不仅仅是一个缓存工具,还可以作为:

  • 数据库(支持丰富数据类型)
  • 缓存层(高性能读写)
  • 消息代理(支持发布/订阅)

在性能方面,Redis 以响应速度快著称,官方基准测试显示其每秒可处理数十万次操作,且具备良好的水平扩展能力。

⚠️ 更重要的是,Redis 与 Spring Boot 生态集成非常顺畅。例如:

  • 微服务架构中用作分布式缓存
  • 替代轻量级 NoSQL 场景下的数据库
  • 实现会话共享(Session Sharing)

3. 启动 Redis 实例

为了快速开始,推荐使用官方 Docker 镜像来启动一个本地 Redis 服务。

$ docker run -p 16379:6379 -d redis:6.0 redis-server --requirepass "mypass"

✅ 说明:

  • 映射宿主机端口 16379 到容器的 6379
  • 设置访问密码为 mypass
  • 使用稳定版本 6.0

这样我们就有了一个带密码保护的 Redis 服务,适合本地开发和测试。

4. 添加 Starter 依赖

Spring 对 Redis 的支持主要通过 Spring Data Redis 实现。我们只需引入对应的 Starter 即可自动装配相关组件。

Maven 依赖如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>2.7.11</version>    
</dependency>

✅ 引入后,Spring Boot 会自动配置:

  • RedisConnectionFactory
  • 默认的 RedisTemplate
  • Lettuce 客户端(默认实现)

无需手动初始化连接池或客户端,真正做到开箱即用。

5. 客户端选择:Lettuce

Spring Boot 默认使用 Lettuce 作为 Redis 客户端,而不是老一代的 Jedis

区别简要对比:

特性 Lettuce Jedis
连接模式 基于 Netty,支持异步和响应式 多线程下需连接池
线程安全 ✅ 单连接可共享 ❌ 每线程需独立连接
Reactive 支持 ✅ 完整支持 ❌ 不支持

虽然你可以切换为 Jedis,但除非有特殊需求,否则建议保持默认的 Lettuce。

自定义 RedisTemplate

尽管自动配置已足够,但在实际项目中通常需要自定义序列化方式等设置:

@Bean
public RedisTemplate<Long, Book> redisTemplate(RedisConnectionFactory connectionFactory) {
    RedisTemplate<Long, Book> template = new RedisTemplate<>();
    template.setConnectionFactory(connectionFactory);
    
    // 设置 key 和 value 的序列化器(避免乱码或类加载问题)
    template.setKeySerializer(new GenericJackson2JsonRedisSerializer());
    template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
    
    return template;
}

⚠️ 踩坑提示:默认的 JDK 序列化容易导致跨服务反序列化失败,建议统一使用 JSON 序列化(如 GenericJackson2JsonRedisSerializer)。

6. 配置属性详解

使用 Lettuce 时,无需手动配置 RedisConnectionFactory —— Spring Boot 会根据 application.propertiesapplication.yml 自动完成。

Spring Boot 2.x 配置方式

spring.redis.database=0
spring.redis.host=localhost
spring.redis.port=16379
spring.redis.password=mypass
spring.redis.timeout=60000

Spring Boot 3.x 配置方式(注意命名空间变化)

spring.data.redis.database=0
spring.data.redis.host=localhost
spring.data.redis.port=16379
spring.data.redis.password=mypass
spring.data.redis.timeout=60000

📌 属性含义一览:

属性 说明
database 使用的 Redis 数据库索引(默认 0)
host Redis 服务器地址
port 服务监听端口
password 认证密码(如有)
timeout 连接超时时间(毫秒)

✅ 提示:完整配置项可参考 Spring Boot 官方文档 - Data Properties,包括连接池、SSL、集群等高级选项。

7. 实战示例:操作 Redis 数据

假设我们有一个 Book 实体类和对应的 BookRepository,可以通过 RedisTemplate 快速实现增删改查。

@Autowired
private RedisTemplate<Long, Book> redisTemplate;

public void save(Book book) {
    redisTemplate.opsForValue().set(book.getId(), book);
}

public Book findById(Long id) {
    return redisTemplate.opsForValue().get(id);
}

关键点解析:

  • opsForValue():操作字符串类型(对应 Redis 的 SET/GET
  • ✅ Lettuce 默认处理序列化/反序列化(前提是配置了合适的序列化器)
  • RedisTemplate 是线程安全的,可在多线程环境下安全使用(如高并发缓存场景)

扩展建议

除了 ValueOperations,还有:

  • ListOperations → 操作 list
  • SetOperations → 操作 set
  • ZSetOperations → 操作有序集合
  • HashOperations → 操作 hash

可根据业务场景灵活选用。

8. 总结

本文展示了如何通过 Starter + 少量属性 + 可选 Bean 配置,快速集成 Redis 到 Spring Boot 应用中。

核心要点回顾:

  1. ✅ 使用 spring-boot-starter-data-redis 开箱即用
  2. ✅ 默认客户端为 Lettuce,性能更强、支持响应式
  3. ✅ 配置集中在 application.properties,Spring Boot 自动装配
  4. ✅ 推荐自定义 RedisTemplate 的序列化策略,避免踩坑
  5. RedisTemplate 线程安全,适合高并发场景

简单粗暴地说:只要配好 host/port/password,剩下的交给 Spring 就行了。

对于大多数应用场景,这种基于属性的配置方式已经完全够用,既简洁又高效。


原始标题:Spring Data Redis's Property-Based Configuration | Baeldung