之前就一直集成SpringCache+redis缓存数据,这次项目中的缓存一直有缓存清除失效的问题,我就花时间好好梳理了一番,主要是针对@CacheEvict的key模糊匹配支持。熟悉redis命令的人都知道,查询和删除都可以做模糊匹配,所以我就想让SpringCache也支持模糊匹配清除。
起因是对外发布的API接口做了缓存,API需要支持分页,所以在@Cacheable的key中用current(当前页码)和classify(分类)做了匹配,在改动数据集的时候,如果每次都把所有分类的key全部清除掉有点不合理,如果只是针对改动数据集中某个分类做key的清理,这样最节省资源。
开始行动,查看SpringCache源码和原理,具体的可以网上查找,我只想说重点。
找到RedisCache中的evict,对应的就是@CacheEvict最终的执行方法,看到下面有个clear方法,使用的就是模糊匹配批量清除,一下觉得有戏。
/** (non-Javadoc)* @see org.springframework.cache.Cache#evict(java.lang.Object)*/@Overridepublic voidevict(Object key) {cacheWriter.remove(name, createAndConvertCacheKey(key)); //remove只能针对单个key删除操作
}
/** (non-Javadoc)* @see org.springframework.cache.Cache#clear()*/@Overridepublic voidclear() {
byte[]pattern = conversionService.convert(createCacheKey("*"), byte[].class);
cacheWriter.clean(name, pattern); //clean支持模糊匹配,这个是扩展的时候重点
}
1.先写个RedisCache子类,在实际中替代RedisCache
public classCustomizedRedisCache extendsRedisCache {
private finalString name;
private finalRedisCacheWriter cacheWriter;
private finalConversionService conversionService;
protectedCustomizedRedisCache(String name, RedisCacheWriter cacheWriter, RedisCacheConfiguration cacheConfig) {super(name, cacheWriter, ca