背景/需求
接入需要对spring-data-redis的使用进行改造,在其操作redis的不同方法调用前,加入不同的逻辑。
方案一
针对于大多数系统中引入的spring-data-redis来说,对于redis中K-V类型的操作由RedisTemplate、ValueOperations进行。所以下载spring-data-redis源码,对目标类的相关方法进行侵入式改造。
方案二
思考:有没有不修改源码的方法?
修改源码的方式对于业务系统来说,每次升级spring-data-redis都需要加入相同的逻辑,再重新发版。尝试观察后发现,RedisTemplate是public的,ValueOperations也是public的,是否可以通过设计模式的手段实现。
我们要做到对RedisTemplate的delete方法加入一些逻辑,继承重写它不就行了?这样在代码中配置RedisTemplate的时候只需要修改RedisTemplate的引用为我们新建的子类,就可以满足既有原逻辑,又可以加入新逻辑。(这样破坏了里氏代换原则)
/*
* @author wangziyang
* @date 2021/10/13
**/
public class MyRedisTemplate<K, V> extends RedisTemplate<K, V> {
@Override
public void delete(K key) {
super.delete(key);
HotkeyStoreExecutor.remove(key);
}
@Override
public void delete(Collection<K> keys) {
super.delete(keys);
HotkeyStoreExecutor.remove(keys);
}
}
重写完delete方法后,还有其他一些操作呢,如何处理?查看代码发现,我去,都是私有属性,那有没有公共的调用方法呢。
*/
public class RedisTemplate<K, V>