Caffeine简介

Caffeine简介 Caffeine是基于JAVA 1.8 Version的高性能缓存库。Caffeine提供的内存缓存使用参考Google guava的API。Caffeine是基于Google Guava Cache设计经验上改进的成果。 Caffeine可以通过建造者模式灵活的组合以下特性:

Caffeine简介

Caffeine是基于JAVA 1.8 Version的高性能缓存库。Caffeine提供的内存缓存使用参考Google guava的API。Caffeine是基于Google Guava Cache设计经验上改进的成果。
Caffeine可以通过建造者模式灵活的组合以下特性:

  • 通过异步自动加载实体到缓存中
  • 基于大小的回收策略
  • 基于时间的回收策略
  • 自动刷新
  • key自动封装虚引用
  • value自动封装弱引用或软引用
  • 实体过期或被删除的通知
  • 写入外部资源
  • 统计累计访问缓存

依赖

<dependency>
      <groupId>com.github.ben-manes.caffeine</groupId>
      <artifactId>caffeine</artifactId>
</dependency>
@Configuration
public class CacheConfig {

    @Bean
    public Cache<String, Object> caffeineCache() {
        return Caffeine.newBuilder()
                // 设置最后一次写入或访问后经过固定时间过期
                .expireAfterWrite(60, TimeUnit.SECONDS)
                // 初始的缓存空间大小
                .initialCapacity(100)
                // 缓存的最大条数
                .maximumSize(1000)
                .build();
    }
}
// 先从缓存读取
        caffeineCache.getIfPresent(id);
        UserInfo userInfo = (UserInfo) caffeineCache.asMap().get(String.valueOf(id));
        if (userInfo != null){
            return userInfo;
        }
        // 如果缓存中不存在,则从库中查找
        log.info("get");
        userInfo = userInfoMap.get(id);
        // 如果用户信息不为空,则加入缓存
        if (userInfo != null){
            caffeineCache.put(String.valueOf(userInfo.getId()),userInfo);
        }

一、填充策略(Population)

Caffeine提供了3种加载策略:手动加载,同步加载,异步加载

1.1手动加载

cache手动
image-ciyw.png

1.2 同步加载

loadingCache同步
image-adow.png

1.3 异步加载

AsyncLoadingCache 是 LoadingCache 的变体, 可以异步计算实体在一个线程池(Executor)上并且返回 CompletableFuture.
image-ttqt.png

二、驱逐策略(Eviction)

  • 基于大小
  • 基于缓存容量
  • 基于权重
  • 基于时间
  • 实体被访问之后,在实体被读或被写后的一段时间后过期
    image-erik.png
  • 基于写之后,在实体被写入后的一段时间后过期
    image-tirf.png
  • 自定义策略Expiry,可以自定义在实体被读,被更新,被创建后的时间过期。
    image-bqdi.png

1.1基于引用

java种有四种引用:强引用,软引用,弱引用和虚引用,caffeine可以将值封装成弱引用或软引用。
软引用:如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。
弱引用:弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存
image-apqq.png

1.2 自动刷新

image-wmzr.png

三、监控(Monitor)

image-jbfe.png
通过使用Caffeine.recordStats(), 可以转化成一个统计的集合. 通过 Cache.stats() 返回一个CacheStats。CacheStats提供以下统计方法
hitRate(): 返回缓存命中率
evictionCount(): 缓存回收数量
averageLoadPenalty(): 加载新值的平均时间

四、移除通知(Notify)

通过removalListener添加实体移除监听器
image-qyaf.png

五、淘汰算法

Window TinyLFU(W-TinyLFU)算法将sketch作为过滤器,当新来的数据比要驱逐的数据高频时,这个数据才会被缓存接纳。这个许可窗口给予每个数据项积累热度的机会,而不是立即过滤掉。这避免了持续的未命中,特别是在突然流量暴涨的的场景中,一些短暂的重复流量就不会被长期保留。为了刷新历史数据,一个时间衰减进程被周期性或增量的执行,给所有计数器减半。
image-jtul.png
对于长期保留的数据,W-TinyLFU使用了分段LRU(Segmented LRU,缩写SLRU)策略。起初,一个数据项存储被存储在试用段(probationary segment)中,在后续被访问到时,它会被提升到保护段(protected segment)中(保护段占总容量的80%)。保护段满后,有的数据会被淘汰回试用段,这也可能级联的触发试用段的淘汰。这套机制确保了访问间隔小的热数据被保存下来,而被重复访问少的冷数据则被回收。

作者:但时间也偷换概念
链接:https://www.jianshu.com/p/3434991ad075
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Comment