spring redis 查询缓存动态指定ttl

4 阅读1分钟

1、使用方式

接口或方法上使用
@Cacheable(value = "list#3600", key = "#user.id")
3600 指ttl时常
@CacheEvict(value = "list", allEntries = true)

2、配置步骤

2.1 定义自己的RedisCacheManager

public class CustomRedisCacheManager extends RedisCacheManager {
    public CustomRedisCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration) {
        super(cacheWriter, defaultCacheConfiguration);
    }
    @Override
    protected RedisCache createRedisCache(String name, RedisCacheConfiguration cacheConfig) {
        String[] array = StringUtils.delimitedListToStringArray(name, "#");
        name = array[0];
        if(array.length>1) {
            long ttl = Long.parseLong(array[1]);
            cacheConfig = cacheConfig.entryTtl(Duration.ofSeconds(ttl));
        }
        return super.createRedisCache(name, cacheConfig);
    }
    
}

2.2 定义Bean

@Bean
public RedisCahceManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
    return new CustomRedisCacheManager(
            RedisCacheWriter.lockingRedisCacheWriter(redisConnectionFactory),
            this.getRedisCacheConfigurationWithTtl(-1)
    );
}

private RedisCacheConfiguration getRedisCacheConfigurationWithTtl(Integer seconds) {
    RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
    redisCacheConfiguration = redisCacheConfiguration.serializeValuesWith(RedisSerializationContext.java().getValueSearializationPair())
    .entryTtl(Duration.ofSeconds(seconds)));
    
    return redisCacheConfiguration;
}

3、注意

这里不使用其他的序列化处理器,估使用该配置的方法或接口返回结果要implements Serializable