LoadingCache是一种自动加载的缓存。其和普通缓存不同的地方在于,
当缓存不存在/缓存已过期时,若调用get()方法,则会自动调用CacheLoad
er.load()方法加载最新值。调用getAll()方法将遍历所有的key调用get()
,除非实现了CacheLoader.loadAll()方法。使用LoadingCache时,需要
指定CacheLoader,并实现其中的load()方法供缓存缺失时自动加载。
在多线程情况下,当两个线程同时调用get(),则后一线程将被阻塞,直至
前一线程更新缓存完成。
LoadingCache<String, String> loadingCache = Caffeine.newBuilder()
//创建缓存或者最近一次更新缓存后经过指定时间间隔,刷新缓存;refreshAfterWri
te仅支持LoadingCache
.refreshAfterWrite(10, TimeUnit.SECONDS)
.expireAfterWrite(10, TimeUnit.SECONDS)
.expireAfterAccess(10, TimeUnit.SECONDS)
.maximumSize(10)
//根据key查询数据库里面的值,这里是个lamba表达式
.build(key -> new Date().toString());
1.3 Async Cache异步获取
AsyncCache是Cache的一个变体,其响应结果均为CompletableFuture,
通过这种方式,AsyncCache对异步编程模式进行了适配。默认情况下,缓
存计算使用ForkJoinPool.commonPool()作为线程池,如果想要指定线程池
,则可以覆盖并实现Caffeine.executor(Executor)方法。synchronous()
提供了阻塞直到异步缓存生成完毕的能力,它将以Cache进行返回。
在多线程情况下,当两个线程同时调用get(key, k ->
value),则会返回同一个CompletableFuture对象。由于返回结果本身不进
行阻塞,可以根据业务设计自行选择阻塞等待或者非阻塞。
AsyncLoadingCache<String, String> asyncLoadingCache = Caffeine.newBuilder()
//创建缓存或者最近一次更新缓存后经过指定时间间隔刷新缓存;仅支持LoadingCach
e
.refreshAfterWrite(1, TimeUnit.SECONDS)
.expireAfterWrite(1, TimeUnit.SECONDS)
.expireAfterAccess(1, TimeUnit.SECONDS)