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。
觉得有用,点个关注。欢迎关注同名公众号【码农小麦】,感谢老铁。