spring boot用@cacheable集成redis需三步到位:配对(启用@enablecaching、引入starter依赖)、序列化(避免jdk默认,推荐string+json)、缓存管理(自定义rediscachemanager,否则退化为内存缓存)。

Spring Boot 用 @Cacheable 集成 Redis,不是加个注解就完事,得配对、序列化、缓存管理三步到位。核心是让 Spring Cache 抽象层真正把 Redis 当作底层存储,而不是走默认的内存缓存(ConcurrentMapCacheManager)。
基础依赖与配置
先确保项目引入了 Redis 支持和缓存自动装配:
- 添加
spring-boot-starter-data-redis和spring-boot-starter-cache依赖 - 在
application.yml中配置 Redis 连接参数(注意 Spring Boot 3.x 使用spring.data.redis.*前缀) - 必须显式启用缓存:
@EnableCaching加在主配置类或配置类上
关键:自定义 RedisCacheManager
Spring Boot 默认不会为 Redis 创建 CacheManager,需手动配置一个 RedisCacheManager 实例,否则 @Cacheable 会退化到内存缓存。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 基于
RedisCacheConfiguration设置 TTL(过期时间)、Key 序列化方式(推荐 String)、Value 序列化方式(推荐 JSON) - 避免使用默认 JDK 序列化,否则 Redis 中数据不可读、跨服务不兼容
- 示例中常搭配
GenericJackson2JsonRedisSerializer或带类型信息的Jackson2JsonRedisSerializer
缓存键与行为控制
@Cacheable 的实际效果高度依赖键设计和条件逻辑:
- 用
key参数写 SpEL 表达式,比如key = "#userId"或key = "#user.id + '_' + #type" - 复杂对象作参数时,确保其
hashCode()和equals()正确实现,否则键生成不稳定 - 用
condition控制缓存触发时机(如condition = "#userId != null"),用unless过滤空结果(如unless = "#result == null") - 高并发场景下开启
sync = true可防止缓存击穿(首次未命中时只放行一个线程回源加载)
验证是否真走 Redis
最容易忽略的一步:确认缓存真的写进了 Redis,而不是本地 Map。
- 启动后查 Redis CLI:
KEYS userCache:*看是否有 key 写入 - 观察日志,开启
logging.level.org.springframework.cache=DEBUG,能看到缓存操作路由到RedisCache - 故意删掉 Redis 中的 key,再次调用方法,若数据库被查询且新 key 出现,说明集成生效
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










