让 @Cacheable 可配置 Redis 过期时间

526 阅读1分钟

用法

只需要修改org.springframework.data.redis.cache#createRedisCache

protected RedisCache createRedisCache(String name, @Nullable RedisCacheConfiguration cacheConfig) {
   String[] array = StringUtils.delimitedListToStringArray(name, "#");
   name = array[0];
   if (array.length > 1) {
      String expirationTimeStr = array[1];
      if (!StringUtils.isEmpty(expirationTimeStr)) {
         Duration expirationTime = DurationStyle.detect(expirationTimeStr).parse(expirationTimeStr);
         return new RedisCache(name, cacheWriter, cacheConfig != null ? cacheConfig.entryTtl(expirationTime) : defaultCacheConfig.entryTtl(expirationTime));
      }
   }
   return new RedisCache(name, cacheWriter, cacheConfig != null ? cacheConfig : defaultCacheConfig);
}

然后@Cacheable就会这么用

@Cacheable(cacheNames = {"USER#500s"}, key = "#userName")
public UserEntity findOne(String userName) {
    LOGGER.info("查询到数据了");
    UserEntity user = new UserEntity();
    user.setName("张三");
    user.setSuperior(new UserEntity());
    return user;
}

解释一下:

原本CachePropertiesRedis 相关配置支持缓存的过期时间,跟踪代码是配置到 org.springframework.data.redis.cache.RedisCacheConfigurationentryTtl 中。 那就可以在 createRedisCache 里的name上动点手脚,这里的name就是注解上的cacheNames,在cacheNames上拼接上过期时间,然后在createRedisCache截出来,怼到cacheConfigentryTtl就完活了。