开源框架是如何使用设计模式的-MyBatis缓存机制之装饰者模式 (5)

cacheElement方法解析cache标签

开源框架是如何使用设计模式的-MyBatis缓存机制之装饰者模式

可以看出最底层是PerpetualCache,默认装饰的是LruCache。

开源框架是如何使用设计模式的-MyBatis缓存机制之装饰者模式

如下就是将剩下的装饰器循环装饰的过程了,细节就不追进去了。

开源框架是如何使用设计模式的-MyBatis缓存机制之装饰者模式

以上就是MyBatis对于缓存的装饰者设计模式的实践相关的源码简单追踪了。

跟随源码看看缓存的使用的地方

先随便点击Cache接口的一方法,看看在哪里有使用。很明显,那个BaseExecutor的类就是正儿八经使用的地方。

开源框架是如何使用设计模式的-MyBatis缓存机制之装饰者模式

query方法中很明显表示了先从缓存中获取,如果没有则走DB(还会写缓存)

开源框架是如何使用设计模式的-MyBatis缓存机制之装饰者模式

代码也很简单,就是从DB获取然后写入缓存

开源框架是如何使用设计模式的-MyBatis缓存机制之装饰者模式

总结

笔者先简单描述了装饰者模式,随后回忆了MyBatis的缓存传统手艺-cache标签的使用,以及一级二级缓存,描述了集成第三方缓存(解决JVM缓存的单点问题)。

随后结合源码介绍了MyBatis的Cache接口及其相关的实现类,首先通过Demo言简意赅地表达了装饰者模式的使用以及MyBatisCache装饰者模式使用的效果(LoggingCache)

紧接着笔者介绍了

PerpetualCache这个最关键最核心的缓存实现类,它的核心是一个HashMap;

FifoCache先进先出淘汰策略的缓存实现类,它的核心是一个维护key的双端队列,添加缓存前先维护这个双端队列,如果size到达阈值则移除队头的元素;

LruCache最近最少使用淘汰策略的缓存实现类,它的核心是基于LinkedHashMap实现LRU机制,我们也回忆了LRU以及LinkedHashMap相关的知识点,其关键点就是一个继承了LinkedHashMap的keyMap(KV都是缓存Key),重写了LinkedHashMap的重要方法removeEldestEntry,用于记录最近最少使用的key,在适当时机删除该缓存;

SoftCache、WeakCache我们回忆了软引用、弱引用的相关知识,其核心就是对应的Value组件Entry继承了SoftReference、WeakReference;

BlockingCache这个阻塞缓存的核心就是大名鼎鼎的ReentrantLock;

SynchronizedCache这个缓存顾名思义就是核心方法追加了synchronized的关键字,事实也确实如此。

为什么要使用缓存?走DB的链路上层用缓存抗一抗再正常不过了。 为什么用装饰者模式?这个场景它的核心就是缓存策略有很多,它们互相可以叠加,可以在配置的时候灵活配置,那么就可以通过解析配置后在运行时灵活的“装饰”起来,达到最后的预期效果,挺妙的。
关于多种Cache的核心实现,以及相关的周边技术可以反复琢磨,比如锁的使用、缓存的读写、LinkedHashMap、JVM的GC等等,毕竟这是开源框架的实战代码,这些都是值得我们像骆驼一样反复咀嚼,反复反刍的,至少了解了这一块,后续你真的有类似实战的时候之前可以先参考参考了!

好了,以上就是MyBatis缓存解析-装饰者设计模式了。欢迎多多交流,希望对你有帮助。原创不易..(没想到这么难,本来想总结下,发现一两次还写不完,光扣字都扣傻了 哈哈..)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgdjjj.html