spring cache配置多失效时间
spring cache通过配置多个cacheManager来实现配置多种失效时间。每个cacheManager设置不同的缓存失效时间,不同功能根据需求引用相应的cacheManager。
·
参考文章:
https://my.oschina.net/iamgpj/blog/3070914
1 问题/场景
当使用全局的配置信息时,只能实现使用同一个缓存失效时间的效果,参考我之前写过的spring cache文章(https://blog.csdn.net/weixin_46505978/article/details/121315389),但实际项目中,往往不同功能对缓存失效时间的需求是不一样的,这种配置方式就不适用了。
2 解决
可通过配置多个cacheManager来实现此需求,每个cacheManager设置不同的缓存失效时间,不同功能根据需求引用相应的cacheManager。
3 实现
配置多个cacheManager,代码如下:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
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;
/**
* <pre>
* redis缓存配置
* </pre>
*
* @author LOOPY_Y
* @since 2021/11/8
*/
@Configuration
public class RedisCacheConfig {
@Bean
// @Primary注解指定默认使用的cacheManager
@Primary
public RedisCacheManager cacheManager30M(RedisConnectionFactory connectionFactory) {
// 设置当前cacheManager实现的失效时间,最好方法名中能够体现出来
RedisCacheConfiguration config = instanceConfig(30L);
return RedisCacheManager.builder(connectionFactory)
.cacheDefaults(config)
.build();
}
@Bean
public RedisCacheManager cacheManager2H(RedisConnectionFactory connectionFactory) {
// 失效时间为2小时
RedisCacheConfiguration config = instanceConfig(120L);
return RedisCacheManager.builder(connectionFactory)
.cacheDefaults(config)
.build();
}
@Bean
public RedisCacheManager cacheManager6H(RedisConnectionFactory connectionFactory) {
// 失效时间为6小时
RedisCacheConfiguration config = instanceConfig(360L);
return RedisCacheManager.builder(connectionFactory)
.cacheDefaults(config)
.build();
}
private RedisCacheConfiguration instanceConfig(Long cacheTtl) {
// 生成一个默认配置,通过config对象即可对缓存进行自定义配置
return RedisCacheConfiguration.defaultCacheConfig()
// 设置缓存的默认过期时间,也是使用Duration设置
.entryTtl(Duration.ofMinutes(cacheTtl))
// 不缓存空值
.disableCachingNullValues()
// 覆盖默认的构造key,否则会多出一个冒号 原规则:cacheName::key 现规则:cacheName:key
.computePrefixWith(name -> name + ":")
// 设置序列化方式
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
}
}
4 使用
@Service
public class CmsQueryService {
private CmsQueryRepository cmsQueryRepository;
public CmsQueryService(CmsQueryRepository cmsQueryRepository) {
this.cmsQueryRepository = cmsQueryRepository;
}
// 直接在注解上指定使用的cacheManager即可
@Cacheable(value = "cmsQuery", cacheManager = "cacheManager2H")
public ApiResult<List<CmsQueryVo>> getInfoByChannelId(CmsQueryParam cmsQueryParam){
return cmsQueryRepository.getInfoByChannelId(cmsQueryParam);
}
}
可以通过redis客户端工具看到,缓存时间正是我们引用的cacheManager2H对应的2小时。
更多推荐
已为社区贡献2条内容
所有评论(0)