Cache的实现类也有四个:ThreadLocalCache、ExpiringCache、LruCache、JCache。
LruCache
LruCache按照最近最少使用原则删除多余缓存。
public LruCache(URL url) {
final int max = url.getParameter("cache.size", 1000);
this.store = new LRUCache<>(max);
}
cache.size表示最多缓存多少对象,默认1000。store存储缓存,LruCache对缓存数据的存取都委托给了LRUCache。
LRUCache继承自LinkedHashMap,重写了removeEldestEntry方法,当插入数据时,会调用removeEldestEntry方法判断缓存对象个数是否超过了容量限制,如果超过了,会从链表的头部开始删除缓存对象。最近最少使用的缓存对象位于链表的头部。
ThreadLocalCache
为每个线程创建一个缓存,缓存使用HashMap。如果线程终止,会将对应的缓存删除。不同的线程不能共用缓存。
public ThreadLocalCache(URL url) {
this.store = ThreadLocal.withInitial(HashMap::new);
}
从上面代码可以看出,属性store是ThreadLocal对象,这保证了每个线程对应一个HashMap,每个线程只能访问自己的缓存。
ExpiringCache
ExpiringCache对存入缓存的每个对象都记录时间,当超过过期时间后,后台启动线程将超过过期时间的缓存对象删除。
public ExpiringCache(URL url) {
// cache time (second)
final int secondsToLive = url.getParameter("cache.seconds", 180);
// Cache check interval (second)
final int intervalSeconds = url.getParameter("cache.interval", 4);
ExpiringMap<Object, Object> expiringMap = new ExpiringMap<>(secondsToLive, intervalSeconds);
expiringMap.getExpireThread().startExpiryIfNotStarted();
this.store = expiringMap;
}
cache.seconds表示超时时间,默认是180s,cache.interval后台监测线程启动的间隔时间,默认是每4ms检测一次缓存中是否有过期对象。
ExpiringMap实现了Map接口,内含ExpireThread线程对象。ExpireThread设置为后台线程。
public ExpireThread() {
expirerThread = new Thread(this, "ExpiryMapExpire-" + expireCount.getAndIncrement());
expirerThread.setDaemon(true);
}
JCache
JCache提供了一套缓存API,是一个JCP标准,各个不同的缓存供应商实现这组API。dubbo直接使用了标准的名字JCache作为类名字。使用类JCache需要接入缓存供应商的实现才可以使用。大家可以参考下面的文章,了解一下JCahce。
https://blog.csdn.net/boonya/article/details/54632129