Spring+Java17配置Redis多缓存不同TTL的问题求助
为不同Redis缓存配置独立TTL的解决方案
要给不同缓存设置不同的生存时间,不能依赖全局配置,得通过自定义RedisCacheManager实现,具体步骤如下:
1. 修改application.yml配置
先移除全局的time-to-live配置,避免和自定义配置冲突,修改后的配置如下:
spring: cache: cache-names: cache1, cache2 type: redis redis: key-prefix: rop use-key-prefix: true cache-null-values: false enable-transaction-support: false data: redis: url: redis://localhost:6379
2. 自定义RedisCacheManager配置类
创建配置类,通过RedisCacheManagerBuilder为每个缓存单独配置TTL:
import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheConfiguration; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializationContext; import org.springframework.data.redis.serializer.StringRedisSerializer; import java.time.Duration; import java.util.HashMap; import java.util.Map; @Configuration @EnableCaching public class RedisCacheConfig { @Bean public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) { // 基础通用缓存配置 RedisCacheConfiguration defaultConfig = RedisCacheConfiguration.defaultCacheConfig() .computePrefixWith(cacheName -> "rop:" + cacheName + ":") // 匹配原key-prefix格式 .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())) .cacheNullValues(false) .disableTransactionSupport(); // 为不同缓存配置独立TTL Map<String, RedisCacheConfiguration> cacheConfigs = new HashMap<>(); cacheConfigs.put("cache1", defaultConfig.entryTtl(Duration.ofSeconds(10))); cacheConfigs.put("cache2", defaultConfig.entryTtl(Duration.ofSeconds(20))); return RedisCacheManager.builder(connectionFactory) .cacheDefaults(defaultConfig) .withInitialCacheConfigurations(cacheConfigs) .build(); } }
3. 业务代码中使用缓存
在业务方法上通过@Cacheable指定对应缓存名称即可:
import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; @Service public class DemoService { @Cacheable(cacheNames = "cache1") public String getCache1Data(String key) { // 模拟数据查询逻辑 return "cache1-data-" + key; } @Cacheable(cacheNames = "cache2") public String getCache2Data(String key) { // 模拟数据查询逻辑 return "cache2-data-" + key; } }
关键说明
computePrefixWith的配置要和原key-prefix保持一致,确保缓存key格式统一- 通用配置(序列化、空值处理等)都可以放在
defaultConfig里,特定缓存只需覆盖TTL即可 - 这种方式支持后续扩展更多缓存的独立配置,比如不同的序列化规则、是否允许缓存空值等
内容的提问来源于stack exchange,提问作者Alexandre Mateus
相关产品推荐
相关产品推荐

