likes
comments
collection
share

Spring Boot 设置Redis缓存有效时间几种方式

作者站长头像
站长
· 阅读数 64

1.第一种方法:设置全局默认缓存有效时间

继承CachingConfigurerSupport 重写 cacheManager方法

@EnableCaching(proxyTargetClass = true)
@Configuration
public class RedisConfiguration extends CachingConfigurerSupport {

   private final RedisConnectionFactory redisConnectionFactory;

   public RedisConfiguration(RedisConnectionFactory redisConnectionFactory) {
      this.redisConnectionFactory = redisConnectionFactory;
   }


   @Override
   @Bean
   public CacheManager cacheManager() {
      RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
            // 设置缓存有效期
            .entryTtl(Duration.ofMinutes(30));
      return RedisCacheManager
            .builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory))
            .cacheDefaults(redisCacheConfiguration).build();
   }
   
}

使用方法

@Cacheable(cacheNames="test",key="xxx")
public String test() {
}

这样写有个缺点就是使用@Cacheable无法设置有效时间

2.第二种方法:初始化缓存空间并配置有效期

@EnableCaching(proxyTargetClass = true)
@Configuration
public class RedisConfiguration extends CachingConfigurerSupport {

   private final RedisConnectionFactory redisConnectionFactory;

   public RedisConfiguration(RedisConnectionFactory redisConnectionFactory) {
      this.redisConnectionFactory = redisConnectionFactory;
   }


   @Override
   @Bean
   public CacheManager cacheManager() {
      RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
            // 设置缓存有效期
            .entryTtl(Duration.ofMinutes(30));





      // 配置缓存过期时间
      Map<String, RedisCacheConfiguration> cacheNameMap = new HashMap<>();
      // 设置test缓存空间有效期1个小时
      cacheNameMap.put("test", RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(1)));
      // 设置test2缓存空间有效期2个小时
      cacheNameMap.put("test2", RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(2)));

      Set<String> cacheNames = cacheNameMap.keySet();

      return RedisCacheManager
            .builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory))
            // 设置初始化缓存空间
            .initialCacheNames(cacheNames)
            // 加载配置
            .withInitialCacheConfigurations(cacheNameMap)
            .cacheDefaults(redisCacheConfiguration).build();
   }
}

这样使用的优点是可以统一管理缓存空间的有效时间,但是缺点和上面一样

3.第三种方法:自定义RedisCacheManager 重写createRedisCache方法实现@Cacheable注解可以设置自定义过期时间

自定义RedisCacheManager


/**java
 * 自定义cacheNames方式 RedisCacheManager 自定义cacheNames方式可以设置过期时间 格式 name#12s  标识12秒过期(d=天,h=小时,m=分钟,s秒)
 * @author wenyuan
 * @date 2021/7/27
 */

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.delimitedListToStringArray(name, "#");
      name = array[0];
      if (array.length > 1) { // 解析TTL
         // 例如 12 默认12秒, 12d=12
         String ttlStr = array[1];
         Duration duration = convertDuration(ttlStr);
         cacheConfig = cacheConfig.entryTtl(duration);
      }
      return super.createRedisCache(name, cacheConfig);
   }

   private Duration convertDuration(String ttlStr) {
      if (NumberUtil.isLong(ttlStr)) {
         return Duration.ofSeconds(Long.parseLong(ttlStr));
      }

      ttlStr = ttlStr.toUpperCase();

      if (ttlStr.lastIndexOf("D") != -1) {
         return Duration.parse("P" + ttlStr);
      }

      return Duration.parse("PT" + ttlStr);
   }

}

创建RedisConfiguration

@EnableCaching(proxyTargetClass = true)
@Configuration
public class RedisConfiguration extends CachingConfigurerSupport {

   private final RedisConnectionFactory redisConnectionFactory;

   public RedisConfiguration(RedisConnectionFactory redisConnectionFactory) {
      this.redisConnectionFactory = redisConnectionFactory;
   }


    @Override
    @Bean
    public CacheManager cacheManager() {
            RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
            // 设置默认缓存有效期
            .entryTtl(Duration.ofMinutes(30));
            return new MyRedisCacheManager(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory),
            RedisCacheConfiguration.defaultCacheConfig());
        }

}

使用方法 格式cacheNames = name + "#" + 时间 + d/h/m/s (天/时/分/秒)

@Cacheable(cacheNames = "grade#1d",key = "'default'") // 1天有效期
@Cacheable(cacheNames = "grade#1h",key = "'default'") // 1h小时有效期
@Cacheable(cacheNames = "grade#1m",key = "'default'") // 1m 1分钟有效期
@Cacheable(cacheNames = "grade#1s",key = "'default'") // 1s 1秒有效期

总结

SpringBoot Redis提供了更方便使用缓存的方式,使用注解就可以存入缓存数据,但是注解并没有提供设置有效期属性,所以可以通过自定义RedisCacheManager的方式来实现注解也可以设置缓存时间,其中第二种方法和第三种可以联合使用。

转载自:https://juejin.cn/post/6989876341566865438
评论
请登录