Lru cache不会写?看看Mybatis

Lru (least recently used) 最近最少使用,常用于缓存淘汰机制,当缓存容量不足时,最先淘汰最不活跃的那些缓存,何为最不活跃?这里当然是指最近最少使用到的缓存了。

缓存最基本的操作就是put/get,Cache接口定义了缓存标准。

public interface Cache {
    
    
  String getId();
  void putObject(Object key, Object value);
  Object getObject(Object key);
  Object removeObject(Object key);
  void clear();
  int getSize();
}

Mybatis中Lru的实现是借助LinkedHashMap,可以轻松实现缓存Entry按照access-order访问顺序,可以轻松删除eldestEntry最过时的Entry。当缓存容量超过初始化容量时,找出最古老的Entry然后从缓存中删掉即可。

public LruCache(Cache delegate) {
    
    
  this.delegate = delegate;
  setSize(1024);
}
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;
    }
  };
}

看到这是不是有些迷了,这只是Lru cache淘汰机制的实现,真正的缓存的存取在哪里呢?Mybatis为我们提供了默认的缓存实现方式,同样是使用map存取缓存key/value。

public class PerpetualCache implements Cache {
    
    
  private final String id;
  private Map<Object, Object> cache = new HashMap<>();
}

基本思路就是使用HashMap来存放缓存key/value,使用LinkedHashMap来记录最古老的Entry,在缓存容量达到初始化容量时,删除最古老的Entry。

觉得有用,点个关注。欢迎关注同名公众号【码农小麦】,感谢老铁。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43275277/article/details/115352559
今日推荐