spring cache配置多失效时间

spring cache配置多失效时间

  • 1 问题/场景
  • 2 解决
  • 3 实现
  • 4 使用

参考文章:
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;/*** 
* redis缓存配置* 
** @author LOOPY_Y* @since 2021/11/8*/
@Configuration public class RedisCacheConfig {@Bean// @Primary注解指定默认使用的cacheManager@Primarypublic RedisCacheManager cacheManager30M(RedisConnectionFactory connectionFactory) {// 设置当前cacheManager实现的失效时间,最好方法名中能够体现出来RedisCacheConfiguration config = instanceConfig(30L);return RedisCacheManager.builder(connectionFactory).cacheDefaults(config).build();}@Beanpublic RedisCacheManager cacheManager2H(RedisConnectionFactory connectionFactory) {// 失效时间为2小时RedisCacheConfiguration config = instanceConfig(120L);return RedisCacheManager.builder(connectionFactory).cacheDefaults(config).build();}@Beanpublic 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小时。
在这里插入图片描述


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部