You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 18:46:06