GuavaCache源码剖析之实现框架
- CacheBuilder:类,缓存构建器。构建缓存的入口,指定缓存配置参数并初始化本地缓存。
CacheBuilder在build方法中,会把前面设置的参数,全部传递给LocalCache,它自己实际不参与
任何计算 - CacheLoader:抽象类。用于从数据源加载数据,定义load、reload、loadAll等操作
- Cache:接口,定义get、put、invalidate等操作,这里只有缓存增删改的操作,没有数据加载的
操作 - LoadingCache:接口,继承自Cache。定义get、getUnchecked、getAll等操作,这些操作都会
从数据源load数据 - LocalCache:类。整个guava cache的核心类,包含了guava cache的数据结构以及基本的缓存的
操作方法 - LocalManualCache:LocalCache内部静态类,实现Cache接口。其内部的增删改缓存操作全部调
用成员变量localCache(LocalCache类型)的相应方法 - LocalLoadingCache:LocalCache内部静态类,继承自LocalManualCache类,实现
LoadingCache接口。其所有操作也是调用成员变量localCache(LocalCache类型)的相应方法
LocalCache
LoadingCache这些类表示获取Cache的方式,可以有多种方式,但是它们的方法最终调用到
LocalCache的方法,LocalCache是Guava Cache的核心类。
class LocalCache<K, V> extends AbstractMap<K, V> implements ConcurrentMap<K, V>
LocalCache为Guava Cache的核心类 LocalCache的数据结构与ConcurrentHashMap很相似,都由多
个segment组成,且各segment相对独立,互不影响,所以能支持并行操作。
//Map的数组
final Segment<K, V>[] segments;
//并发量,即segments数组的大小
final int concurrencyLevel;
...
//访问后的过期时间,设置了expireAfterAccess就有
final long expireAfterAccessNanos;
//写入后的过期时间,设置了expireAfterWrite就有
final long expireAfterWriteNa就有nos;
//刷新时间,设置了refreshAfterWrite就有
final long refreshNanos;
//removal的事件队列,缓存过期后先放到该队列
final Queue<RemovalNotification<K, V>> removalNotificationQueue;
//设置的removalListener
final RemovalListener<K, V> removalListener;
...
每个segment由一个table和若干队列组成。缓存数据存储在table中,其类型为
AtomicReferenceArray。
GuavaCache源码剖析之CacheBuilder
缓存构建器。构建缓存的入口,指定缓存配置参数并初始化本地缓存。
主要采用builder的模式,CacheBuilder的每一个方法都返回这个CacheBuilder知道build方法的调用。
注意build方法有重载,带有参数的为构建一个具有数据加载功能的缓存,不带参数的构建一个没有数
据加载功能的缓存
GuavaCache源码剖析之Put流程
1、上锁
2、清除队列元素
清理的是keyReferenceQueue和valueReferenceQueue这两个队列,这两个队列是引用队列
如果发现key或者value被GC了,那么会在put的时候触发清理
3、setvalue方法了,它做的是将value写入Entry
GuavaCache源码剖析之Get流程
- 获取对象引用(引用可能是非alive的,比如是需要失效的、比如是loading的);
- 判断对象引用是否是alive的(如果entry是非法的、部分回收的、loading状态、需要失效的,则
认为不是alive)。 - 如果对象是alive的,如果设置refresh,则异步刷新查询value,然后等待返回最新value。
- 针对不是alive的,但却是在loading的,等待loading完成(阻塞等待)。
- 这里如果value还没有拿到,则查询loader方法获取对应的值(阻塞获取)。
GuavaCache源码剖析之过期重载
数据过期不会自动重载,而是通过get操作时执行过期重载。具体就是CacheBuilder构造的
LocalLoadingCache