1.maven
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
<version>2.8.6</version>
</dependency>
2. API
- Caffeine 缓存类构造器
方法 | 描述 |
---|---|
newBuilder() | 静态方法,创建实体,可通过链式调用的方式设置属性 |
from(CaffeineSpec spec) from(String spec) | 静态方法,通过spec设置属性,spec的格式及配置 |
initialCapacity(int initialCapacity) | 设置初始容量 |
maximumSize(long maximumSize) | 设置缓存最大容量 |
expireAfterWrite(Duration duration) expireAfterWrite(long duration, TimeUnit unit) | 设置写入后的过期时间 |
expireAfterAccess(Duration duration) expireAfterAccess(long duration, TimeUnit unit) | 设置访问后的过期时间 |
expireAfter(Expiry<K1, V1> expiry) | 自定义过期处理策略 |
refreshAfterWrite(Duration duration) refreshAfterWrite(long duration, TimeUnit unit) | |
maximumWeight(long maximumWeight) | 设置最大权重 |
weakKeys() | 设置弱引用键 |
weakValues() | 设置弱引用值 |
softValues() | 设置软引用值 |
executor(Executor executor) | 设置执行者 |
scheduler(Scheduler scheduler) | 设置调度器 |
weigher(Weigher<K1, V1> weigher) | 设置权重处理 |
ticker(Ticker ticker) | 设置指定时间源 |
removalListener(RemovalListener<K1, V1> removalListener) | 移除监听器 |
writer(CacheWriter<K1, V1> writer) | 设置缓存写入器,可用于写入外部存储 |
recordStats() recordStats(Supplier<StatsCounter> statsCounterSupplier) | 设置记录统计 |
build() | 构建缓存对象Cache |
build(CacheLoader<K1, V1> loader) | 构建加载缓存对象LoadingCache |
buildAsync() | 构建异步缓存对象AsyncCache |
buildAsync(CacheLoader<K1, V1> loader) buildAsync(AsyncCacheLoader<K1, V1> loader) | 构建异步加载缓存AsyncLoadingCache |
- Cache 手动加载缓存
方法 | 描述 |
---|---|
getIfPresent(Object key) | 如果存在获取值,不存在返回null |
get(K var1,Function<K,V> var2) | |
getAllPresent(Iterable<?> var1) | 获取所有存在的值 |
put(K var1, V var2) | 添加缓存数据 |
putAll( Map<K, V> var1) | 添加多对缓存数据 |
invalidate(Object var1) | 移除缓存 |
invalidateAll(Iterable<?> var1) invalidateAll() | 移除多个或所有缓存 |
estimatedSize() | 缓存过的最多数据数量 |
stats() | 获取统计对象.构造对象时需配置recordStats |
asMap() | 获取缓存数据map |
cleanUp() | 清空缓存 |
policy() | 获取政策对象Policy,可以在运行时修改缓存配置 |
- LoadingCache Cache子接口,同步加载缓存
方法 | 描述 |
---|---|
get( K var1) | |
getAll(Iterable var1) | |
refresh(K var1) |
- AsyncCache 异步手动加载缓存
方法 | 描述 |
---|---|
getIfPresent(Object var1) | 如果存在则获取未完成数据对象CompletableFuture |
get(K var1,Function<K,V> var2) get(K var1,BiFunction<K, Executor, CompletableFuture> var2) | 获取未完成数据对象CompletableFuture |
put(K var1, CompletableFuture var2) | 设置未完成数据对象CompletableFuture |
asMap() | 获取缓存map |
synchronous() | 获取同步缓存接口 |
- AsyncLoadingCache AsyncCache子接口,异步加载缓存
方法 | 描述 |
---|---|
get( K var1) | 获取未完成数据对象CompletableFuture |
getAll(Iterable var1) | 获取多个未完成数据对象CompletableFuture |
- CacheStats 缓存统计状态对象
方法 | 描述 |
---|---|
empty() | 获取一个空的统计对象 |
requestCount() | 请求数量,获取缓存数据次数,requestCount=hitCount+missCount |
hitCount() | 命中数量,获取出缓存数据的次数 |
hitRate() | 命中率,hitRate=hitCount/requestCount |
missCount() | 遗失数量,没获取出缓存数据的次数 |
missRate() | 遗失率,missRate=missCount/requestCount |
loadCount() | |
loadSuccessCount() | |
loadFailureCount() | |
totalLoadTime() | |
averageLoadPenalty() | 加载新值所花费的平均时间 |
evictionCount() | 被驱逐的数据数量 |
evictionWeight() | 被驱逐的数据权重 |
2. 相关配置信息
- 缓存填充策略
(1) 手动加载
每次get的时候指定一个同步的函数,如果key不存在就调用这个函数生成一个值
(2) 同步加载
构造Cache时候,build方法传入一个CacheLoader实现类。实现load方法,通过key加载value。
(3) 异步加载
使用Executor去调用方法并返回一个CompletableFuture。异步加载缓存使用了响应式编程模型。
(4) 异步手动加载
基于Executor计算条目,并返回一个CompletableFuture- 回收策略
(1) 基于大小的过期方式
a. 缓存大小,通过 maximumSize 设置
b. 权重,通过 maximumWeight 设置
注: maximumWeight与maximumSize不可以同时使用
(2) 基于时间的过期方式
a. 在最后一次访问或者写入后开始计时,在指定的时间后过期 , 通过 expireAfterAccess 设置
b. 在最后一次写入缓存后开始计时,在指定的时间后过期, 通过 expireAfterWrite 设置
c. 自定义策略,过期时间由Expiry实现独自计算, 通过 expireAfter 设置
(3) 基于引用的过期方式
a. 当key和value都没有引用时驱逐缓存 , 通过 weakKeys与weakValues 设置
b. 当垃圾收集器需要释放内存时驱逐 , 通过 softValues 设置
注:AsyncLoadingCache不支持弱引用和软引用。weakValues()和softValues()不可以一起使用
3. spec的格式及配置
- spec格式
键值用等号(=)连接,多属性配置用逗号(,)连接,例如:initialCapacity=1,expireAfterWrite=2s,weakKeys,weakValues - spec配置属性
属性 | 描述 |
---|---|
initialCapacity | 初始容量,默认未为-1 |
maximumSize | 最大容量,默认未为-1 |
maximumWeight | 最大权重,默认未为-1 |
expireAfterWrite | 写入后过期时间,值为带dDhHmMsS单位的数字,例如: 1d |
expireAfterAccess | 访问后过期时间,值为带dDhHmMsS单位的数字,例如: 1d |
refreshAfterWrite | 写入后刷新时间,值为带dDhHmMsS单位的数字,例如: 1d |
weakKeys | 设置弱引用键 |
softValues | 设置软引用值 |
weakValues | 设置弱引用值 |
recordStats | 设置计数统计 |
4. 示例
@Test
void contextLoads() throws InterruptedException {
Cache<String, String> build = Caffeine
.newBuilder()
.initialCapacity(1)//初始缓存长度为1
.maximumSize(100)//最大长度为100
.expireAfterWrite(10, TimeUnit.SECONDS)//设置缓存策略在1天未写入过期缓存
.build();
build.put("key","value");
while (true){
System.out.println(build.getIfPresent("key"));
Thread.sleep(1000);
}
}