Spring Boot集成Redis缓存数据无法存入问题求助
排查Spring Cache+Redis缓存不生效的方案
针对你遇到的问题——Spring Boot 2.4.1中@Cacheable方法执行了缓存存储逻辑但Redis无对应键,可按以下步骤排查:
1. 确认Redis中键的实际格式
Spring Cache默认会给缓存键加上缓存名前缀,格式为缓存名::key,比如你的场景下实际键应该是myCache::fixed,而非直接的fixed。
- 用
redis-cli连接目标Redis实例,执行KEYS "myCache::*"或KEYS "*fixed*"查找对应键,避免因为键格式判断错误导致误以为没生成缓存。
2. 检查Redis序列化配置
默认的JdkSerializationRedisSerializer会将键序列化为字节数组,在Redis客户端中显示为乱码,导致你看不到正常的键名;或者值序列化失败未触发报错。
- 确认是否配置了正确的序列化规则,比如用
StringRedisSerializer处理键,Jackson2JsonRedisSerializer处理值:
@Bean public RedisCacheConfiguration redisCacheConfiguration() { return RedisCacheConfiguration.defaultCacheConfig() .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new Jackson2JsonRedisSerializer<>(Object.class))); }
3. 验证Redis连接与实例正确性
检查application.yml/application.properties中的Redis配置是否指向正确的实例:
- 确认
spring.redis.host、spring.redis.port、spring.redis.database、spring.redis.password配置无误,是否连接到了预期的Redis实例(比如是否误连测试环境或其他库)。 - 可以通过
redis-cli -h 主机 -p 端口 -a 密码 select 库号切换到对应库,再执行键查询。
4. 检查方法返回值是否被过滤
@Cacheable默认不缓存null值,如果authorizationFeignClient.isAuthorized(request)返回null,则不会在Redis中生成缓存键。
- 调试或打印返回值,确认是否为
null;如果需要缓存null值,可添加unless="#result == null"属性:
@Cacheable(value = "myCache", key = "'fixed'", unless = "#result == null")
5. 排查Redis缓存管理器配置
如果自定义了RedisCacheManager,需确认是否存在禁用缓存、过期时间设为0或针对myCache的特殊限制:
- 检查缓存管理器是否开启了缓存,是否为
myCache设置了不合理的过期策略(比如过期时间为0会导致键立即被删除)。
6. 查看Redis底层操作日志
将org.springframework.data.redis的日志级别设为TRACE,查看RedisTemplate执行存储操作的细节:
- 确认是否有
SET命令执行,是否存在序列化异常、连接异常等被吞掉的错误;同时查看Redis服务端日志,确认是否收到存储请求,是否因内存不足、淘汰策略等导致键被删除。
7. 确认AOP代理规则是否被遵守
虽然你调试确认了缓存存储代码执行,但仍需排查是否为类内部调用(即this.isAuthorized(request)):
- Spring Cache基于AOP实现,类内部调用不会触发代理逻辑,需确保通过注入的Bean实例调用该方法。
内容的提问来源于stack exchange,提问作者Oscar B
相关产品推荐
相关产品推荐

