dubbo解析-服务结果缓存Cache实现类原理详解

本文基于dubbo 2.7.5版本代码

服务结果缓存Cache实现类原理详解


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。如果线程终止,JVM会将对应的缓存删除。不同的线程不能共用缓存。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值