聊聊Mybatis的缓存的其他装饰者

举报
周杰伦本人 发表于 2022/08/30 11:15:43 2022/08/30
【摘要】 聊聊Mybatis的缓存的其他装饰者 最近最少使用缓存装饰器 存放元素 先进先出策略的装饰器 存放元素 总结 聊聊Mybatis的缓存的其他装饰者上篇文章说了Mybatis的缓存的被装饰者接口和对应实现类,还说了装饰器BlockingCache的实现,我们看一下其他装饰器 最近最少使用缓存装饰器LruCache是最近最少使用缓存装饰器,它使用LinkedHashMap记录缓存的使用情况,L...

聊聊Mybatis的缓存的其他装饰者

上篇文章说了Mybatis的缓存的被装饰者接口和对应实现类,还说了装饰器BlockingCache的实现,我们看一下其他装饰器

最近最少使用缓存装饰器

LruCache是最近最少使用缓存装饰器,它使用LinkedHashMap记录缓存的使用情况,LinkedHashMap底层的通过数组存储,当当前key使用了的时候,LinkedHashMap会将key移动到尾部,这样,头部的就是最近最久没有使用的key,当超过size后删除头部key

public void setSize(final int size) {
    keyMap = new LinkedHashMap<Object, Object>(size, .75F, true) {
      private static final long serialVersionUID = 4267176411845948333L;

      @Override
      protected boolean removeEldestEntry(Map.Entry<Object, Object> eldest) {
        boolean tooBig = size() > size;
        if (tooBig) {
          eldestKey = eldest.getKey();
        }
        return tooBig;
      }
    };
  }

eldestKey用来存储需要删除的key,它重写LinkedHashMap的removeEldestEntry()方法,这个方法用来判断是否删除头部指针指向的key,如果超过size就把需要删除的key放入eldestKey中,LinkedHashMap删除key

存放元素

LruCache的putObject()方法:

    @Override
    public void putObject(Object key, Object value) {
        delegate.putObject(key, value);
        cycleKeyList(key);
    }
    private void cycleKeyList(Object key) {
        keyMap.put(key, key); 
        if (eldestKey != null) {
            delegate.removeObject(eldestKey);
            eldestKey = null;
        }
    }
    
  1. 调用被装饰者放入指定key,value存储,
  2. 把key放入LinkedHashMap中,如果eldestKey不为空的话删除缓存中key对应的value数据

先进先出策略的装饰器

FifoCache是先进先出策略的装饰器,它使用linkedList来记录key,并且有个size属性,默认1024,

存放元素

放缓存数据putObject()方法:

    @Override
    public void putObject(Object key, Object value) {
        cycleKeyList(key);
        delegate.putObject(key, value);
    }
    private void cycleKeyList(Object key) {
        keyList.addLast(key); 
        if (keyList.size() > size) {
            Object oldestKey = keyList.removeFirst();
            delegate.removeObject(oldestKey);
        }
    }
  1. 调用cycleKeyList()方法:把key添加到LinkedList的尾部,如果链表长度超过size,移除头部元素,这就是先进先出
  2. 调用被装饰者的putObject()方法

总结

本篇文章主要讲了Mybatis缓存包下的两个装饰器缓存,LruCache是最近最久未使用的缓存装饰器,也就是它淘汰掉最近最少未使用的key,原理是利用的LinkedHashMap的removeEldestEntry()方法,他把对应的key都保存在LinkedHashMap中,用到的key会放到尾部,最近最久未使用的在头部,删除的时候就把头部的key淘汰了。另外一个装饰器缓存是FifoCache,它是先进先出的淘汰策略,原理是利用LinkedList来进行存储key,putObject()方法把可以放入尾部,超过最大限制删除头部key。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。