简介
LocalCache是一款类似ConcurrentHashMap的本地缓存
特性
1、重写CacheLoader.load方法,自动加载数据;CacheLoader.reload方法异步刷新数据
2、缓存达到配置的最大数量时,LRU回收缓存
3、灵活过期时间设置
4、强弱引用
5、访问统计
6、分段锁
核心类
LocalCache
:整个缓存操作的核心类,extends AbstractMap,implements ConcurrentMap
CacheBuilder
:LocalCache.LocalManualCache建造者类
CacheLoader
:定义load、reload操作的抽象类
Cache:接口,定义get、put、invalidate等操作,这里只有缓存增删改的操作,没有数据加载的操作
LoadingCache:接口,继承自Cache。定义get、getUnchecked、getAll等操作,这些操作都会从数据源load数据
LocalManualCache:LocalCache内部静态类,实现Cache接口。其内部的增删改缓存操作全部调用成员变量localCache(LocalCache类型)的相应方法
LocalLoadingCache
:LocalCache内部静态类,继承自LocalManualCache类,实现LoadingCache接口。其所有操作也是调用成员变量localCache(LocalCache类型)的相应方法
核心参数
// guava线程池,用来产生ListenableFuture
private static ListeningExecutorService service = MoreExecutors.listeningDecorator(
Executors.newFixedThreadPool(10));
LoadingCache<String, String> cache = CacheBuilder.newBuilder()
.concurrencyLevel(4)
.maximumSize(1000)
//.refreshAfterWrite(1, TimeUnit.SECONDS)
.expireAfterWrite(1, TimeUnit.SECONDS)
//.expireAfterAccess(1,TimeUnit.SECONDS)
.build(new CacheLoader<String, String>() {
@Override
public String load(String key) throws Exception {
return value;
}
@Override
public ListenableFuture<String> reload(final String key, final String oldValue)
throws Exception
return service.submit(new Callable<String>() {
@Override
public String call() throws Exception {
return value;
}
});
}
});
maximumSize //缓存最大容量
concurrencyLevel = Math.min(builder.getConcurrencyLevel(), MAX_SEGMENTS);//默认并发水平是4
expireAfterAccessNanos = builder.getExpireAfterAccessNanos();
expireAfterWriteNanos = builder.getExpireAfterWriteNanos();
refreshNanos = builder.getRefreshNanos();
removalListener //移除元素监听器
defaultLoader //缓存加载器
过期策略
expireAfterWrite:当 创建 或 写之后的 固定 有效期到达时,数据会被自动从缓存中移除
expireAfterAccess:当 创建 或 写 或 读 之后的 固定值的有效期到达时,数据会被自动从缓存中移除。读写操作都会重置访问时间
refreshAfterWrite:是在指定时间内没有被创建/覆盖,则指定时间过后,再次访问时,会去刷新该缓存,在新值没有到来之前,始终返回旧值。刷新方法在LoadingCache接口的refresh()声明,实际最终调用的是CacheLoader的reload()
移除方式
1、基于大小的移除
LocalCache.Segment.evictEntries
2、 基于时间的移除
LocalCache.Segment.recordRead
LocalCache.Segment.recordWrite
LocalCache.Segment.recordLockedRead
每次访问或者写入都会记录时间
getLiveValue时会根据过期策略进行缓存移除
刷新:scheduleRefresh
3、基于引用的移除
基于JVM的垃圾回收机制,根据键或者值的引用关系决定移除
网友评论