IT袋

当前位置:主页 > 经验教程 > 建站编程 >

Spring

Spring Cache缓存注解(2)

时间:2023-11-09 15:11:15 来源:IT袋 作者:马勇
导读:Spring,执行此方法后,Redis 中缓存 key 名称如下, crowd:configCache:getValueByKey_sys.name TTL 过期时间是 287,跟我们全局设置的 300 秒基本是一致的。此时假如我们想把

Spring

执行此方法后,Redis 中缓存 key 名称如下,

crowd:configCache:getValueByKey_sys.name

Spring

TTL 过期时间是 287,跟我们全局设置的 300 秒基本是一致的。此时假如我们想把getValueByKey方法的缓存有效期单独设置为 600 秒,那我们该如何操作嘞?

@Cacheable注解默认是没有提供有关缓存有效期设置的。想要单独修改getValueByKey方法的缓存有效期只能修改全局的缓存有效期。那么有没有别的方法能够为getValueByKey方法单独设置缓存有效期嘞?当然是有的,大家请往下看。

自定义 MyRedisCacheManager 缓存

其实我们可以通过自定义 MyRedisCacheManager 类继承 Spring Cache 提供的 RedisCacheManager 类后,重写 createRedisCache(String name, RedisCacheConfiguration cacheConfig) 方法,代码如下,

public class MyRedisCacheManager extends RedisCacheManager {
    public MyRedisCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration) {
        super(cacheWriter, defaultCacheConfiguration);
    }
    @Override
    protected RedisCache createRedisCache(String name, RedisCacheConfiguration cacheConfig) {
        String[] array = StringUtils.split(name, "#");
        name = array[0];
         // 解析 @Cacheable 注解的 value 属性用以单独设置有效期
        if (array.length > 1) {
            long ttl = Long.parseLong(array[1]);
            cacheConfig = cacheConfig.entryTtl(Duration.ofSeconds(ttl));
        }
        return super.createRedisCache(name, cacheConfig);
    }
}

MyRedisCacheManager类逻辑如下,

  1. 继承Spring Cache提供的RedisCacheManager类。
  2. 重写createRedisCache(String name, RedisCacheConfiguration cacheConfig)方法。
  3. 解析 name 参数,根据#字符串进行分割,获取缓存 key 名称以及缓存有效期。

接着我们修改下 CacheConfig 类的 cacheManager 方法用以使用 MyRedisCacheManager 类。代码如下,

@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
    return new MyRedisCacheManager(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory), defaultCacheConfig());
}
private RedisCacheConfiguration defaultCacheConfig() {
    return RedisCacheConfiguration.defaultCacheConfig()
            .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(keySerializer()))
            .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(valueSerializer()))
            .computePrefixWith(name -> CACHE_PREFIX + name  + ":")
            .entryTtl(Duration.ofSeconds(600));
}

相关阅读