Mybatis源码-缓存初探笔记(持续更新)

mybatis缓存使用的是装饰者模式

下面介绍下各种装饰者

1、PerpetualCache是缓存最基础的一个实现。永久缓存。构造方法是传一个字符串,作为缓存的key。(除了这个,以下均是Cache作为构造参数传入;这个我认为不是装饰类,但在装饰包内,除了这个以下均是装饰类)

2、SynchronizedCache是一个简单的装饰,构造方法可以传入Cache,是缓存装饰的一个基础实现。同步缓存。

3、SerializedCache,序列化缓存,在put值的时候,将其序列号为byte[],并存入缓存.

4、LoggingCache,日志缓存。在获取缓存的时候,记录了请求次数和击中次数。并在debug模式下打印日志,击中次数/请求次数,能直观的看到缓存击中的比例。

5、ScheduledCache,时效缓存。在初始化缓存的时候(执行构造方法的时候),设置间隔为1h,并记录初始化时间。以后每次操作缓存的时候(put或者get缓存等等)都会获取当前时间点,减去初始化的时间点,若大于1h,则清除缓存并记录清除时间点为初始化时间点,再进行后续的操作。ps:这里在get缓存的时候,做了判断,若清除了缓存则不再去get,直接返回null。但在remove操作的时候却没有做处理,也就是清除缓存后(执行clear方法后)直接又执行了remove方法。不知所以。

6、SoftCache,软缓存。理解软缓存需要先理解java的4种引用级别 强引用、软(soft)引用、弱(weak)引用、虚(phantom)引用。以及了解ReferenceQueue。对于这两个我都了解很浅,对于这个缓存类,就不妄言了。理解了我再来更新。

7、WeakCache,弱缓存。通同上面软缓存,对应java弱引用。

8、TransactionalCache,事务缓存。源码注释说明,该类是二级缓存的事务缓存。该类有一个clearOnCommit的布尔型标识,初始为false,若执行过clear()方法则设置为true,执行reset()方式时重置为false。在执行commit()方法的时候判断clearOnCommit,若为true则清空缓存。在getObject()方法中,若发生错误clearOnCommit为true,则返回null。否则返回对应key的value值。这个类中还有一个entriesToAddOnCommit的map。在put值到缓存时,先put到entriesToAddOnCommit的map中,clear()方法也是清除entriesToAddOnCommit里面的对象。只有在执行commit()方法的时候,才将entriesToAddOnCommit里面的对象遍历放到缓存对象中(delegate)。在该对象中,还有一个Set对象entriesMissedInCache。entriesMissedInCache在getObject()方法中,get到的Object是null的时候,将value为null的key放到entriesMissedInCache中。并在commit()方法中遍历entriesMissedInCache,如果entriesToAddOnCommit里面没有这个key,则讲key put到缓存中,并赋值null。在执行回滚方法的时候,遍历entriesMissedInCache,并移除缓存中对应的key。从代码上看,entriesMissedInCache就是处理null的,但其深刻的意义,还在探索。

------------上面是基础装饰,下面的装饰类为缓存策略的装饰--------------

8、FifoCache,先进先出缓存。默认大小1024。这个缓存有一个队列,put值(key和value)到缓存中的时候,先把key放入队列中的队尾。(若队列满了,则把队列和缓存中,队首的元素移除)

9、LruCache(least recently used),最近最少使用缓存。这个缓存里有一个LinkedHashMap,在put缓存的时候,会把key放进map里面。这个缓存的策略是,在缓存满了的时候,移除最少使用的缓存。具体实现逻辑如下:在初始化的时候(构造方法),设置默认缓存大小为1024,setSize(1024)。在setSize的时候,初始化LinkedHashMap,并重写removeEldestEntry方法,当缓存大小 不小于 1024的时候(那个触发点应该就是size大小,1024的时候,刚好剩最后一个位置的时候,把eldestKey赋值。所以在put的时候,检测的eldestKey的方法放在设置缓存的后面),把最少使用的key赋值给全局变量eldestKey。而在每次put缓存的时候,都会检查eldestKey是否为null,若不为null,则根据eldestKey去移除缓存,并继续讲eldestKey设置为null。这样就实现了最少使用的策略

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值