springmvcredis@Cacheable扩展(⼀)
springmvc 中有⾃带的cache处理模块,可以是⽅法级别的缓存处理,那么在实际使⽤中,很可能⾃⼰造轮⼦,因为实际中永远会有更奇怪的需求点。⽐如:
1 清除缓存时候,能模糊的进⾏删除
2 针对不同的key,设置不同的过期时间
这2个是有些⿇烦的需求,当然针对缓存内容,设置 key(这个 key 的确定)更让⼈难受,不好取舍,需要有⼀定的开发经验,否则只能不停的修改。
我们先集中处理第⼀个问题,模糊删除
1.查⽅案
2.查看低版本redis实现
3.具体处理⽅式
明确问题,查⽅案
可能⽹上有不少的解决⽅案
1. 直接重写
2. spring 5 + 版本的
3. 具有启发性的
1. ⾸先我们从⽹上到对应的修改的code,真的就是拿来就能⽤的那种,然后发现有2个function没有,然后就发现你是低版本,然后就没然后了。。 <properties>
<org.springframework-version>4.2.2.RELEASE</org.springframework-version>
<org.aspectj-version>1.8.2</org.aspectj-version>
<org.slf4j-version>1.7.21</org.slf4j-version>
<org.log4j2-version>2.8.2</org.log4j2-version>
</properties>
2. 根据第三个,可以看到,基于 redis template 的缓存处理,是有模糊处理的⽅法的,也就是说,可以做模糊处理。
3. 查看 spring 低版本
4.2.2 版本的 cache 的redis 类,进⾏简单的仿做。
查看低版本redis实现
因为使⽤springmvc时候,都会对 redis 进⾏配置,设置 ttl 等参数,那么,点进去看源码,就会发现
CustomizedRedisCacheManager和CustomizeRedisCache,和⾼版本的名字很像,那么仔细看看,发现 CustomizeRedisCache 就是需要改造的。
public void evict(RedisCacheElement element)
public void evict(Object key)
这2个函数。很可以,2个⽂件粘贴出来,直接做成注⼊,发现就直接可以在 @Cacheable 的时候断点看了。
这2个就是在删除缓存时候使⽤的。
改造⼀波
代码进⾏了删减,需要修改后的,可以联系我
CustomizedRedisCacheManager
/**
* CustomizedRedisCacheManager
*
* @desc 重新定义 oldcache 的处理⽅式
*/
public class CustomizedRedisCacheManager extends RedisCacheManager {
protected RedisOperations getRedisOperations() {
disOperations;
}
protected RedisCachePrefix getCachePrefix() {
return this.cachePrefix;
}
protected boolean isUsePrefix() {
return this.usePrefix;
}
public void afterPropertiesSet() {
if (!CollectionUtils.figuredCacheNames)) {
Iterator var1 = figuredCacheNames.iterator();
while (var1.hasNext()) {
String cacheName = (String) ();
}
}
super.afterPropertiesSet();
}
protected Cache decorateCache(Cache cache) {
return this.isCacheAlreadyDecorated(cache) ? cache : super.decorateCache(cache);
}
protected boolean isCacheAlreadyDecorated(Cache cache) {
return this.isTransactionAware() && cache instanceof TransactionAwareCacheDecorator;
}
}
CustomizeRedisCache
/**
* RedisCacheResolver
*
* @desc springCache 的重载
*/
public class CustomizeRedisCache extends RedisCache {
private final RedisOperations redisOperations;
private final CustomizeRedisCache.RedisCacheMetadata cacheMetadata;
private final CacheValueAccessor cacheValueAccessor;
public CustomizeRedisCache(String name, byte[] prefix, RedisOperations<? extends Object, ? extends Object> redisOperations, long expiration) {
super(name, prefix, redisOperations, expiration);
Assert.hasText(name, "non-empty cache name is required");
this.cacheMetadata = new CustomizeRedisCache.RedisCacheMetadata(name, prefix);
this.cacheMetadata.setDefaultExpiration(expiration);
this.cacheValueAccessor = new CustomizeRedisCache.ValueSerializer());
}
public <T> T get(Object key, Class<T> type) {
ValueWrapper wrapper = (key);
return wrapper == null ? null : (T) ();
}
public ValueWrapper get(Object key) {
((new RedisCacheKey(key)).usePrefix(KeyPrefix()).KeySerializer()));
}
/**
* 重点处理,进⾏重写
*
* @param key
*/
spring framework扩展点public void evict(Object key) {
if(key instanceof String){
String String();
dsWith(keyString,"*")){
// evictLikePrefix(this.cacheMetadata.cacheName + keyString);
evictLikePrefix(keyString);
return;
}
if(StringUtils.startsWith(keyString,"*")){
/
/ evictLikePrefix(this.cacheMetadata.cacheName + keyString);
evictLikePrefix(keyString);
return;
}
}
// 原始
RedisCacheElement redisCacheElement = new RedisCacheElement((new RedisCacheKey(key)).usePrefix(KeyPrefix()).KeySerializer()), (Object) null);
this.evict(redisCacheElement);
}
public void evict(RedisCacheElement element) {
}
/**
* 进⾏模糊处理 key
*
* @param key
*/
public void evictLikePrefix(Object key){
Set keys = disOperations.keys(key);
if(keys != null && keys.size() > 0){
for(Object k : keys){
RedisCacheElement redisCacheElement = new RedisCacheElement((new RedisCacheKey(k)).usePrefix(KeyPrefix()).KeySerializer()), (Object) null);
this.evict(redisCacheElement);
}
}
}
public void clear() {
public String getName() {
return CacheName();
}
public Object getNativeCache() {
disOperations;
}
private ValueWrapper toWrapper(Object value) {
return value != null ? new SimpleValueWrapper(value) : null;
}
}
可以关注来获取对应的源码
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论