spring cache redis 的使用过程中,删除缓存只能用具体的 key 删除,不能使用通配符号,原因是 redis 不支持 del key 这种通配符用法,可以通过修改 redis 源代码实现,但这种方式修改了 redis 本身代码,后期升级、维护不好操作,具体操作方式可以参见:
redis del 命令支持正则删除(pattern)git 地址:redis-del-with-pattern
我们使用改写 spring-redis cache 实现具体实现方式为:改写:org.springframework.data.redis.cache.RedisCache 下的 evict 方法原为:cacheWriter.remove(name, createAndConvertCacheKey(key)); 改为:cacheWriter.clean(name, createAndConvertCacheKey(key));
spring redis 最底层是支持了通配符的方式的,但是经过包装后就去掉了
具体在项目中的使用实例如:在查询方法上加入缓存:
@Override
@Cacheable(keyGenerator = “cacheKeyGenerator”)
public List query(xx x) throws IllegalAccessException {
return xxxx;
}
其中 cacheKeyGenerator 生成如 com.demo.service.impl.xxServiceImpl-query-99986a
删除或更新时:
@Override
@CacheEvict(key = “targetClass.name+’-*'”)
public boolean saveOrUpdate(xx x) {
return xxxx;
}
其中 key 时 spEL 表达式,生成 com.demo.service.impl.xxServiceImpl-* 的 key
最终效果是在新增或更新时能删除所有列表的缓存 key