栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

spring cache配置多失效时间

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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;


@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> getInfoByChannelId(CmsQueryParam cmsQueryParam){
        return cmsQueryRepository.getInfoByChannelId(cmsQueryParam);
    }
}    

可以通过redis客户端工具看到,缓存时间正是我们引用的cacheManager2H对应的2小时。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/769537.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号