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. 缓存填充策略
    (1) 手动加载
    每次get的时候指定一个同步的函数,如果key不存在就调用这个函数生成一个值
    (2) 同步加载
    构造Cache时候,build方法传入一个CacheLoader实现类。实现load方法,通过key加载value。
    (3) 异步加载
    使用Executor去调用方法并返回一个CompletableFuture。异步加载缓存使用了响应式编程模型。
    (4) 异步手动加载
    基于Executor计算条目,并返回一个CompletableFuture
  2. 回收策略
    (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);
        }
    }
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐