用法
只需要修改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;
}
解释一下:
原本CacheProperties 的 Redis 相关配置支持缓存的过期时间,跟踪代码是配置到 org.springframework.data.redis.cache.RedisCacheConfiguration 的 entryTtl 中。
那就可以在 createRedisCache 里的name上动点手脚,这里的name就是注解上的cacheNames,在cacheNames上拼接上过期时间,然后在createRedisCache截出来,怼到cacheConfig的entryTtl就完活了。