spring cache配置多失效时间

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

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐