Spring Boot未连接Docker Redis容器,缓存生效但Redis无键问题排查
解决Spring Boot连接Docker Redis实例而非内置缓存的问题
核心问题分析
你的配置里spring.cache.type=simple是关键——这个配置指定Spring使用内置内存缓存,而非Redis,所以缓存能工作但Redis里看不到数据。另外,你的配置类缺少关联缓存注解与Redis的RedisCacheManager配置,导致缓存注解不会调用RedisTemplate操作外部Redis实例。
具体修复步骤
1. 修正缓存类型配置
修改application.properties,将缓存类型改为Redis:
# 替换原来的simple为redis spring.cache.type=redis spring.redis.host=localhost spring.redis.port=16379
2. 完善Redis配置类,添加RedisCacheManager
更新你的RedisConfiguration类,新增RedisCacheManager Bean,让Spring缓存注解(如@Cacheable)使用Redis作为缓存实现:
@Configuration @EnableCaching // 开启缓存注解支持 public class RedisConfiguration { @Value("${spring.redis.host}") private String REDIS_HOST; @Value("${spring.redis.port}") private Integer REDIS_PORT; @Bean public JedisConnectionFactory jedisConnectionFactory() { RedisStandaloneConfiguration config = new RedisStandaloneConfiguration(REDIS_HOST, REDIS_PORT); return new JedisConnectionFactory(config); } @Bean public RedisTemplate<String, ?> redisTemplate() { RedisTemplate<String, ?> template = new RedisTemplate<>(); template.setConnectionFactory(jedisConnectionFactory()); // 添加序列化配置,避免Redis中出现乱码 template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); template.setEnableTransactionSupport(true); template.setExposeConnection(true); template.afterPropertiesSet(); return template; } // 新增RedisCacheManager,关联缓存注解与Redis @Bean public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) { RedisCacheConfiguration cacheConfig = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofMinutes(30)) // 设置默认缓存过期时间 .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())); return RedisCacheManager.builder(connectionFactory) .cacheDefaults(cacheConfig) .build(); } }
3. 优化Maven依赖(可选但推荐)
替换原有的spring-data-redis和jedis依赖,使用Spring Boot提供的starter,它会自动管理版本兼容性:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> <version>2.4.3</version> </dependency> <!-- 替换原spring-data-redis和jedis,starter包含了这两个依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.4.3</version> </dependency>
4. 验证Docker Redis连通性
确保Docker Redis容器正常运行,执行以下命令测试连接:
# 使用redis-cli连接本地16379端口 redis-cli -p 16379 # 执行PING命令,返回PONG则说明连通正常 PING
验证修复
重启Spring Boot应用后,调用带有@Cacheable注解的方法,再用redis-cli执行KEYS *命令,就能看到Redis中生成的缓存键了。
内容的提问来源于stack exchange,提问作者eduardovendruscolo
相关产品推荐
相关产品推荐

