Spring Boot集成Redis Cache无法存储数据问题求助
排查Redis缓存不生效问题的步骤
以下是针对你的场景逐步排查的具体操作:
1. 确认Redis容器的网络连通性与可用性
- 进入
bus-server容器:docker exec -it bus-server /bin/bash - 测试与Redis容器的网络连通:
ping bus-redis,如果不通,检查docker-compose.yaml中是否将三个容器放在同一个网络(默认Compose会创建默认网络,除非自定义网络但未将bus-server加入) - 直接连接Redis测试读写:
redis-cli -h bus-redis,执行set test_key 123,再执行get test_key,如果返回123说明Redis本身正常;否则查看Redis容器日志docker logs bus-redis排查启动问题
2. 校验application.properties中的Redis配置
必须确保配置项与Docker Compose中的Redis服务匹配:
# 注意要用Compose中的服务名bus-redis,不能用localhost(容器内localhost指向自身) spring.redis.host=bus-redis spring.redis.port=6379 # 如果Redis设置了密码,必须添加此行 # spring.redis.password=your_redis_password # 强制指定缓存类型为Redis spring.cache.type=redis
同时查看bus-server日志docker logs bus-server,搜索Redis或Cache关键词,确认是否有连接失败、初始化错误的日志。
3. 检查RedisConfiguration配置类的正确性
确保配置类正确生成RedisCacheManager并被Spring加载:
@Configuration public class RedisConfiguration { @Bean @Primary // 确保该CacheManager为默认实例 public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { // 配置key和value的序列化方式,避免默认JDK序列化的兼容性问题 RedisCacheConfiguration cacheConfig = RedisCacheConfiguration.defaultCacheConfig() .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())); return RedisCacheManager.builder(redisConnectionFactory) .cacheDefaults(cacheConfig) .build(); } }
- 确认配置类所在包被Spring扫描(比如与主启动类同包,或通过
@ComponentScan指定扫描路径) - 主类已加
@EnableCaching,配置类无需重复添加,但要确保配置类正常生效
4. 检查@Cacheable注解的使用规范
- 被注解方法必须为public修饰:Spring AOP仅能代理public方法,private/protected方法不会触发缓存逻辑
- 避免同一类内部调用:如果Service内部方法A调用带
@Cacheable的方法B,AOP不会生效,缓存不触发。解决方法是将方法B抽离到独立Bean,或通过自注入代理对象的方式调用 - 确认注解参数正确:比如
@Cacheable(cacheNames = "routes"),必须指定cacheNames/value,否则无法生成对应缓存空间 - 检查方法参数:如果参数是自定义对象,必须重写
equals()和hashCode()方法,否则Spring生成缓存key时会因对象哈希值变化导致每次生成不同key,无法命中缓存 - 添加日志验证:
调用接口后查看日志,若每次调用都打印这句话,说明缓存完全未触发@Cacheable(cacheNames = "routes") public List<Route> getAllRoutes() { log.info("从数据库查询路由数据"); return routeMapper.selectList(null); }
5. 检查Redis缓存key的查询方式
如果配置了缓存key前缀(比如spring.cache.redis.key-prefix=bus_或配置类中设置了前缀),直接用keys *会查不到,需要用keys bus_*匹配前缀后的key。
内容的提问来源于stack exchange,提问作者orm
相关产品推荐
相关产品推荐

