Spring Cache + Redis 的核心是通过注解实现缓存自动化,无需手写Redis操作;只需引入依赖、配置application.yml、添加@EnableCaching,即可启用@Cacheable、@CacheEvict、@CachePut等注解管理缓存生命周期,并支持JSON序列化、空值缓存、TTL和key前缀等生产级配置。

用 Redis 配合 Spring Cache,核心就是把缓存逻辑从“手写 Redis 操作”变成“加几个注解”,业务代码完全不碰缓存细节。关键不在 Redis 本身,而在 Spring Cache 提供的抽象层和自动集成能力。
基础配置:三步连通 Redis 和缓存注解
不需要写一行 RedisTemplate 代码,只要:
- 引入两个依赖:
spring-boot-starter-cache和spring-boot-starter-data-redis - 在
application.yml中声明缓存类型:spring.cache.type=redis,并可选配置过期时间(如spring.cache.redis.time-to-live=3600000) - 在启动类或配置类上加
@EnableCaching—— 这是开启所有缓存注解的总开关
Spring Boot 的自动配置会自动发现 Redis 连接工厂,并装配好 RedisCacheManager,整个过程零手动 Bean 注册。
@Cacheable:查库前先查缓存,命中直接返回
这是最常用、最典型的场景。比如查用户:
@Cacheable(value = "userCache", key = "#id")
public User getUserById(Long id) {
return userMapper.selectById(id); // 实际走数据库
}
它的行为是确定的:
- 调用方法前,Spring 根据
value(缓存名)和key(SpEL 表达式)拼出 Redis 的 key,例如userCache::1001 - 若 Redis 中存在该 key,直接反序列化返回,完全跳过方法体
- 若不存在,则执行方法,把返回值序列化后存入 Redis,再返回
- 注意:
key="#id"中的#id是 SpEL,表示参数;如果写成key="user1001",必须加单引号:key="'user1001'
@CacheEvict 和 @CachePut:精准控制缓存生命周期
缓存不能只写不删、只存不更,否则数据就脏了:
-
@CacheEvict(value = "userCache", key = "#id"):执行方法后,立即删除对应缓存项(适合删除操作) -
@CacheEvict(value = "userCache", allEntries = true):清空整个缓存命名空间(慎用,适合全局刷新) -
@CachePut(value = "userCache", key = "#user.id"):强制执行方法,并用返回值覆盖更新缓存(适合修改操作),不会跳过方法体 - 避免对同一方法同时用
@Cacheable和@CachePut,语义冲突易出错
让缓存更可靠:序列化、空值、TTL 的实用配置
默认配置够跑通,但生产环境需要微调:
- 改用 JSON 序列化:避免 JDK 序列化导致跨语言/升级兼容问题,只需自定义
RedisCacheConfiguration,指定Jackson2JsonRedisSerializer - 防穿透:开启
spring.cache.redis.cache-null-values=true,让 null 值也进缓存(配合理想的过期时间,如 2 分钟) - 统一 TTL:在配置中设
time-to-live,或在自定义CacheManager中为不同缓存名设置差异化过期策略(如用户信息 30 分钟,配置项 24 小时) - 加前缀隔离:启用
spring.cache.redis.use-key-prefix=true,避免不同环境或服务缓存 key 冲突
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











