Spring Cache 框架给我们提供了 @Cacheable 注解用于缓存方法返回内容。但是 @Cacheable 注解不能定义缓存有效期。这样的话在一些需要自定义缓存有效期的场景就不太实用。
按照 Spring Cache 框架给我们提供的 RedisCacheManager 实现,只能在全局设置缓存有效期。这里给大家看一个常规的 CacheConfig 缓存配置类,代码如下,
- @EnableCaching
- @Configuration
- public class CacheConfig extends CachingConfigurerSupport {
- ...
-
- private RedisSerializer<String> keySerializer() {
- return new StringRedisSerializer();
- }
-
- private RedisSerializer<Object> valueSerializer() {
- return new GenericFastJsonRedisSerializer();
- }
-
- public static final String CACHE_PREFIX = "crowd:";
-
- @Bean
- public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
- // 配置序列化(解决乱码的问题)
- RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
- //设置key为String
- .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(keySerializer()))
- //设置value为自动转Json的Object
- .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(valueSerializer()))
- .computePrefixWith(name -> CACHE_PREFIX + name + ":")
- .entryTtl(Duration.ofSeconds(600));
- RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(Objects.requireNonNull(redisConnectionFactory));
- return new RedisCacheManager(redisCacheWriter, config);
- }
- }
其实我们可以通过自定义 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);
- }
- }
-