Spring Boot3 Redis 项目地址
https://gitee.com/supervol/loong-springboot-study
(记得给个start,感谢)
Redis 介绍
Redis 是一款高性能的 内存数据库(支持持久化),兼具缓存、NoSQL 存储、分布式锁等核心能力;Spring Boot 3 作为主流的 Java 开发框架,通过 spring-boot-starter-data-redis
starter 简化了 Redis 的整合流程,降低了开发门槛。
Redis 核心
开源内存数据库,支持 String、Hash、List、Set、ZSet 等数据结构,主打高性能(QPS 达 10W+)、低延迟,常用于缓存、分布式锁、会话存储等场景。Spring Boot 3 为 Redis 提供了两个核心操作类:RedisTemplate
和 StringRedisTemplate
,两者定位不同,需根据场景选择。
1. StringRedisTemplate
- 定位:专门处理 String 类型 的 Redis 操作(键和值均为 String)。
- 默认配置:使用
StringRedisSerializer
序列化键和值,序列化后的数据在 Redis 中 可读性强(无乱码)。 - 适用场景:存储简单字符串(如验证码、会话 ID、计数器等)。
2. RedisTemplate
- 定位:通用 Redis 操作类,支持 任意类型 的键和值(通过泛型
RedisTemplate<K, V>
约束)。 - 默认配置问题:默认使用
JdkSerializationRedisSerializer
序列化,会导致 Redis 中存储的是 二进制数据(可读性差,且需实体类实现Serializable
接口),不推荐直接使用默认配置。 - 优化方案:自定义
RedisTemplate
,使用Jackson2JsonRedisSerializer
序列化(支持 JSON 格式,可读性强,无需实现Serializable
)。
Redis 示例
1. 前置条件
- JDK 17+(推荐 JDK 17 或 21)
- 构建工具:Maven 3.6+
- 开发工具:IntelliJ IDEA
- Redis 环境: Redis 6.x+
2. 代码位置
请参考项目地址中 springboot-cache/springboot-redis 模块代码。
Redis 高级
Spring Boot 3 不仅支持 Redis 基础操作,还能便捷整合其高级特性(如缓存抽象、分布式锁、发布订阅)。基于 Redis 的缓存抽象,Spring 提供了 缓存注解(如 @Cacheable
),结合 Redis 可快速实现缓存功能,无需手动调用 RedisTemplate
。
步骤 1:启用缓存
在启动类上添加 @EnableCaching
注解:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
@SpringBootApplication
@EnableCaching // 启用 Spring 缓存抽象
public class RedisDemoApplication {
public static void main(String[] args) {
SpringApplication.run(RedisDemoApplication.class, args);
}
}
步骤 2:使用缓存注解
常用注解说明及示例:
注解 | 作用 |
---|---|
@Cacheable |
方法执行前先查缓存,有则返回缓存值;无则执行方法,将结果存入缓存。 |
@CachePut |
执行方法后,将结果存入缓存(覆盖旧值,常用于更新操作)。 |
@CacheEvict |
删除缓存(常用于删除操作,支持批量删除)。 |
@Caching |
组合多个缓存操作(如同时 @Cacheable 和 @CacheEvict )。 |
示例代码:
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
@Service
public class UserService {
/**
* 查询用户:优先查缓存(key 为 "user:userId"),无则查数据库并缓存(1 小时过期)
*/
@Cacheable(
value = "user", // 缓存名称(对应 Redis 中的 key 前缀:user::xxx)
key = "#userId", // 缓存 key 的后缀(SpEL 表达式,#userId 为方法参数)
unless = "#result == null", // 结果为 null 时不缓存
timeout = 3600 // 缓存过期时间(秒)
)
public User getUserById(Long userId) {
// 模拟数据库查询(实际项目中替换为 MyBatis/JPA 调用)
System.out.println("查询数据库:userId = " + userId);
return new User(userId, "张三", 25, "zhangsan@xxx.com");
}
/**
* 更新用户:执行方法后更新缓存(覆盖旧值)
*/
@CachePut(
value = "user",
key = "#user.id", // 用用户 ID 作为 key
unless = "#user == null"
)
public User updateUser(User user) {
// 模拟数据库更新
System.out.println("更新数据库:user = " + user);
return user;
}
/**
* 删除用户:执行方法后删除缓存
*/
@CacheEvict(
value = "user",
key = "#userId"
)
public void deleteUser(Long userId) {
// 模拟数据库删除
System.out.println("删除数据库:userId = " + userId);
}
}
Redis 指南
1. 序列化方式选择
序列化器 | 优点 | 缺点 | 推荐度 |
---|---|---|---|
Jackson2JsonRedisSerializer | 可读性强、支持复杂对象、无需实现 Serializable | 需配置类型信息(避免反序列化丢失类型) | ★★★★★ |
StringRedisSerializer | 可读性强、轻量 | 仅支持 String 类型 | ★★★★☆ |
JdkSerializationRedisSerializer | 无需额外配置、支持所有实现 Serializable 的类 | 可读性差(二进制)、需实现 Serializable | ★★☆☆☆ |
结论:优先使用 Jackson2JsonRedisSerializer
(自定义 RedisTemplate
)。
2. 连接池配置优化
- max-active:根据并发量调整(如 16-64,避免过大导致 Redis 压力)。
- max-idle:建议与
max-active
一致(避免频繁创建连接)。 - max-wait:设置为 1-3 秒(避免无限等待,快速失败)。
- timeout:设置为 1-3 秒(避免网络波动导致的长时间阻塞)。
3. 缓存问题解决方案
问题 | 原因 | 解决方案 |
---|---|---|
缓存穿透 | 请求不存在的 key,穿透缓存直击数据库 | 1. 缓存空值(短期过期);2. 使用布隆过滤器 |
缓存击穿 | 热点 key 过期,大量请求直击数据库 | 1. 互斥锁(如 Redisson 锁);2. 热点 key 永不过期 |
缓存雪崩 | 大量 key 同时过期,数据库压力骤增 | 1. 过期时间加随机值(分散过期);2. 集群部署 Redis |
4. 数据一致性保障
缓存与数据库同步的核心原则:先更新数据库,后操作缓存(避免脏数据)。
- 更新操作:更新数据库 → 删除缓存(推荐,避免更新缓存失败导致脏数据)。
- 删除操作:删除数据库 → 删除缓存。
总结
Spring Boot 3 整合 Redis 简化了开发流程,通过 RedisTemplate
/StringRedisTemplate
可快速操作 Redis 基础数据结构,结合 Spring 缓存抽象、Redisson 分布式锁等高级特性,能满足企业级应用的核心需求。实际开发中需注意序列化配置、连接池优化、缓存一致性等问题,确保系统高性能、高可用。Redis 的场景覆盖 缓存、分布式协调、计数、消息、排序 等多个领域,核心是利用其 高性能、多结构、原子性 的特性解决传统数据库或单体应用的痛点。实际使用时需根据业务需求选择合适的数据结构和命令,同时注意内存管理、持久化策略和高可用部署(如主从、集群)。