Spring Boot 设置Redis缓存有效时间几种方式
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