SpringBoot项目使用Redis作为缓存框架,清除缓存支持通配符*
步骤:
1.以下是需要导入的依赖
<--!连接池 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
2.配置redis的yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://aliyuncs.com:3306/database?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF8
username: root
password: 123456
redis:
database: 9
host:redis.rds.aliyuncs.com
port: 6379
password: 123456
lettuce:
pool:
max-idle: 8
min-idle: 0
max-active: 8
max-wait: 3000ms
3.编写缓存的管理类,这里为了支持@CahceEvict可以使用通配符*,做了一些调整;如果不需要支持通配符,使用下面即可
@Configuration
@EnableCaching
public class RedisConfiguration {
/**
* Redids缓存配置
*/
@Bean
public CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration
.defaultCacheConfig()
.entryTtl(Duration.ofHours(12)) // 默认缓存12个小时
.disableCachingNullValues(); // 默认不缓存null值
RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory);
return RedisCacheManager.builder(redisCacheWriter)
.cacheDefaults(defaultCacheConfig)
.build();
}
}
如果需要支持通配符,则按以下步骤
3.1重写RedisCache的evict方法,如下
public class CustomizedRedisCache extends RedisCache {
private final String name;
private final RedisCacheWriter cacheWriter;
CustomizedRedisCache(String name, RedisCacheWriter cacheWriter, RedisCacheConfiguration cacheConfig) {
super(name, cacheWriter, cacheConfig);
this.name = name;
this.cacheWriter = cacheWriter;
}
/**
* 重写evict方法,由于redis底层是支持通配符操作,将原来的remove换成clean
*
* @param key
*/
@Override
public void evict(@NotBlank Object key) {
cacheWriter.clean(name, serializeCacheKey(createCacheKey(key)));
}
}
3.2编写缓存的管理类,如下
public class CustomizedRedisCacheManager extends RedisCacheManager {
private final RedisCacheWriter cacheWriter;
private final RedisCacheConfiguration defaultCacheConfig;
CustomizedRedisCacheManager(RedisConnectionFactory redisConnectionFactory, RedisCacheConfiguration cacheConfiguration) {
this(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory), cacheConfiguration);
}
private CustomizedRedisCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration) {
super(cacheWriter, defaultCacheConfiguration);
this.cacheWriter = cacheWriter;
this.defaultCacheConfig = defaultCacheConfiguration;
}
@Override
protected RedisCache createRedisCache(String name, RedisCacheConfiguration cacheConfig) {
return new CustomizedRedisCache(name, cacheWriter, null == cacheConfig ? defaultCacheConfig : cacheConfig);
}
}
3.3改写Redis的配置类文件,如下
@Configuration
@EnableCaching
public class RedisConfiguration {
/**
* Redids缓存配置
*/
@Bean
public CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration
.defaultCacheConfig()
.entryTtl(Duration.ofHours(12)) // 默认缓存12个小时
.disableCachingNullValues(); // 默认不缓存null值
return new CustomizedRedisCacheManager(connectionFactory, defaultCacheConfig);
}
@Bean
public KeyGenerator params2String() {
return (target, method, params) -> {
List<String> sb = new ArrayList<>();
for (Object obj : params) {
if (null == obj) {
sb.add("null");
} else {
sb.add(obj.toString());
}
}
return String.join(Constants.DASH_SEPARATOR, sb);
};
}
@Bean
public KeyGenerator clzMethod2String() {
return (target, method, params) -> target.getClass().getName() +
Constants.DOT_SEPARATOR +
method.getName();
}
@Bean
public KeyGenerator methodAndParams2String() {
return (target, method, params) -> {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName())
.append(Constants.DOT_SEPARATOR)
.append(method.getName())
.append(Constants.COLON_SEPARATOR);
List<String> paramList = new ArrayList<>();
for (Object obj : params) {
if (null == obj) {
paramList.add("null");
} else {
paramList.add(obj.toString());
}
}
return sb.append(String.join(Constants.DASH_SEPARATOR, paramList)).toString();
};
}
}
4.缓存使用方法
4.1@Cacheable
在对应的service实现方法上面添加注解
@Cacheable(value = "prefix", keyGenerator = "params2String")
4.2@CacheEvict
在对应service的增加或者修改方法上添加注解
//#vo 中的vo为方法的入参
@CacheEvict(value = "prefix", key = "T(cn.rifu.test.enums.DeptTypeEnum).value2Enum(#vo.deptType) +'*'")