spring cache配置多失效时间

spring cache配置多失效时间 1 问题/场景2 解决3 实现4 使用 参考文章: https://my.oschina.net/iamgpj/blo

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小时。
在这里插入图片描述