文章目录

  • 前言
  • 一、基于大小
  • 二、基于时间
  • 三、基于引用

前言

Caffeine提供了三种驱逐策略 - 基于大小、基于时间、基于引用。


一、基于大小

使用固定大小的容量maximumSize或者maximumWeight,一旦超出将基于recently or very often(最近最少)策略,驱逐元素。

1. maximumSize

要求maximumSize与maximumWeight只能设置一个。此外,maximumSize必须大于0。

e.g.

Cache<Object, Object> cache = Caffeine.newBuilder().maximumSize(10).build();
List<Object> list = new ArrayList<>(100);
for (int i = 0; i < 100; i++) {cache.put(i, i);list.add(i);
}
Map<Object, Object> map = cache.getAllPresent(list);
map.forEach((k, v) -> {System.out.println(k + ":" + v);
})
System.out.println(cache.estimatedSize());

2. maximumWeight

要求maximumSize与maximumWeight只能设置一个。此外,maximumWeight必须大于0。

要求一个Caffeine实例只设置一个weigher(…)方法,maximumWeight必须设置。

e.g.

Cache<Object, Object> cache = Caffeine.newBuilder().maximumWeight(10).weigher(new Weigher<Object, Object>() {@Overridepublic @NonNegative int weigh(@NonNull Object key, @NonNull Object value) {if (value instanceof Integer) {Integer v = (Integer) value;return v;}return 0;}}).build();
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 100; i++) {cache.put(i, i);list.add(i);
}Map<Object, Object> map = cache.getAllPresent(list);
map.forEach((k, v) -> {System.out.println(k + ":" + v);
});System.out.println(cache.estimatedSize());

二、基于时间

1. expireAfterAccess

在创建、更新、读取之后的一段时间剔除。

Cache.asMap().get(Object)、Cache.asMap().put(K, V)等方法会触发访问时间重置,但是Cache.asMap()方法不会。

e.g.

public class FakeTicker implements Ticker {private final AtomicLong nanos = new AtomicLong();public FakeTicker advance(long time, TimeUnit unit) {this.nanos.getAndAdd(unit.toNanos(time));return this;}// Returns the number of nanoseconds elapsed since this ticker's // fixed point of reference.@Overridepublic long read() {return this.nanos.get();}}
FakeTicker ticker = new FakeTicker();
Cache<Object, Object> cache = Caffeine.newBuilder().ticker(ticker).expireAfterAccess(Duration.ofSeconds(5)).build();
cache.put("hello", "world");
System.out.println(cache.getIfPresent("hello"));
fakeTicker.advance(5, TimeUnit.SECONDS);
System.out.println(cache.getIfPresent("hello"));
System.out.println(cache.estimatedSize());

2. expireAfterWrite

在创建、更新之后的一段时间剔除。

3. expireAfter

Expiry



可以返回Long.MAX_VALUE,表示不剔除的语义。


三、基于引用


Caffeine使用篇 - Eviction相关推荐

  1. Caffeine使用篇 - Cleanup

    文章目录 前言 一.CleanUp 前言 默认情况下,在一个值失效之后,Caffeine没有自动或者立刻执行清理.驱逐值.相反,它在写操作之后或者读操作(写操作很少的情况)之后执行少量的维护工作.如果 ...

  2. Caffeine - Caches - Eviction

    Caffeine - Caches - Eviction 剔除策略 基于容量的剔除 基于时间的剔除 基于引用的剔除 剔除策略 Caffeine提供了三种类型的提出方式:基于容量的剔除.基于时间的剔除和 ...

  3. Caffeine实战教程篇

    [干货点] 该篇文章是前三篇文章Caffeine系列的总结,算是全网最全的实战教程了,每个知识点都有相关demo和应用场景,以及相关的坑,这些都一一声明了,看完该篇文章,你就能够入门Caffeine了 ...

  4. Caffeine Eviction策略

    Caffeine缓存剔除策略有三个: 基于容量剔除 基于时间剔除 基于引用剔除 基于容量剔除 // 如果缓存的条目大于maximumSize值时,caffeine将尝试剔除最近或很少使用的缓存条目 L ...

  5. Caffeine本地缓存详解(一篇就明白)

    结论:Caffeine 是目前性能最好的本地缓存,因此,在考虑使用本地缓存时,直接选择 Caffeine 即可. 先看一个小例子,明白如何创建一个 Caffeine 缓存实例. Caffeine ca ...

  6. Caffeine Cache~高性能 Java 本地缓存之王

    前面刚说到Guava Cache,他的优点是封装了get,put操作:提供线程安全的缓存操作:提供过期策略:提供回收策略:缓存监控.当缓存的数据超过最大值时,使用LRU算法替换.这一篇我们将要谈到一个 ...

  7. 本地缓存之王-Caffeine

    引言 随着业务体量的增长,使用的缓存方案一般会经过:1)无缓存直接查DB:2)数据同步+Redis:3)多级缓存 三个阶段. 第1阶段直接查DB只能用于小流量场景,随着QPS升高,需要引入缓存来减轻D ...

  8. 一文深入了解史上最强的Java堆内缓存框架Caffeine

    它提供了一个近乎最佳的命中率.从性能上秒杀其他一堆进程内缓存框架,Spring5更是为了它放弃了使用多年的GuavaCache 缓存,在我们的日常开发中用的非常多,是我们应对各种性能问题支持高并发的一 ...

  9. Caffeine (史上最全)

    文章很长,建议收藏起来,慢慢读! 备注:持续更新中- 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 + 涨薪必备 疯狂创客圈 ...

最新文章

  1. 记一个网络传输功能的实现过程
  2. 左斜杠和右斜杠有什么区别_「斜杠云」SEO推广和SEO优化有什么区别?
  3. 算法竞赛入门经典 第七章 总结
  4. Epic Games表示不服苹果垄断案裁决 继续提出上诉
  5. 数据结构 5-3-3 二叉树的线索化
  6. 条件控制语句 以及 循环语句
  7. html网页设计需求分析,网页设计需求分析方法
  8. 分布式光伏发电系统的组网与研究
  9. verilog 7段数码管译码器
  10. 图像处理​​​​​​​--十大经典算法
  11. UiBot 邮件群发
  12. 示例-Luat示例-MQTT
  13. 解决edge浏览器无法打开pdf文件问题
  14. 未来已来!阿里小蜜AI技术揭秘
  15. 最有价值证书——ITIL名列第三
  16. 关于Sublime text3 配置及插件整理
  17. 速卖通商品详情API接口(商品详情页面数据接口)
  18. js+css 灵活层叠 绝对/相对 定位 2
  19. openwrt STA+AP共存模式
  20. 反射(Reflection)

热门文章

  1. codeforces 1665A (GCD vs LCM)思维
  2. 纯电动汽车两档ATM变速箱simulink模型,模型实现了两档AMT换挡策略和换挡过程仿真
  3. Android面试必问!记录下我磕磕碰碰的三个月找工作经历,面试心得体会
  4. 磕磕碰碰搭建Nginx实现接口映射
  5. NR 5G 入网流程
  6. 校园网及入网计算机管理制度,校园网用户入网管理规定
  7. win10、win7系统64位oracle11g安装教程以及32位plsql连接教程
  8. Spring 微服务实战
  9. 统驭科目(Reconciliation account)
  10. 计算机选择u盘启动不了,win10系统u盘启动不了系统怎么办_win10无法进入u盘启动解决方法...