Caffeine - Caches - Eviction

2024-04-25 18:48
文章标签 caffeine caches eviction

本文主要是介绍Caffeine - Caches - Eviction,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Caffeine - Caches - Eviction

    • 剔除策略
      • 基于容量的剔除
      • 基于时间的剔除
      • 基于引用的剔除

剔除策略

Caffeine提供了三种类型的提出方式:基于容量的剔除、基于时间的剔除和基于引用的剔除。

基于容量的剔除

// Evict based on the number of entries in the cache
LoadingCache<Key, Graph> graphs = Caffeine.newBuilder().maximumSize(10_000).build(key -> createExpensiveGraph(key));// Evict based on the number of vertices in the cache
LoadingCache<Key, Graph> graphs = Caffeine.newBuilder().maximumWeight(10_000).weigher((Key key, Graph graph) -> graph.vertices().size()).build(key -> createExpensiveGraph(key));

如果您的缓存不应超过特定大小,使用Caffeine.maximumSize(long)。 缓存将尝试剔除最近或很少使用的条目。

或者,如果不同的缓存条目具有不同的权重(例如,如果您的缓存值具有完全不同的内存占用量),你可以使用Caffeine.weigher(Weigher)指定权重函数,并使用Caffeine.maximumWeight(long)指定最大的缓存权重。除了与maximumSize相同的说明外,请注意,权重是在条目创建和更新时计算的,此后是静态的,并且在进行剔除选择时并不考虑权重因素。

基于时间的剔除

// Evict based on a fixed expiration policy
LoadingCache<Key, Graph> graphs = Caffeine.newBuilder().expireAfterAccess(5, TimeUnit.MINUTES).build(key -> createExpensiveGraph(key));
LoadingCache<Key, Graph> graphs = Caffeine.newBuilder().expireAfterWrite(10, TimeUnit.MINUTES).build(key -> createExpensiveGraph(key));// Evict based on a varying expiration policy
LoadingCache<Key, Graph> graphs = Caffeine.newBuilder().expireAfter(new Expiry<Key, Graph>() {public long expireAfterCreate(Key key, Graph graph, long currentTime) {// Use wall clock time, rather than nanotime, if from an external resourcelong seconds = graph.creationDate().plusHours(5).minus(System.currentTimeMillis(), MILLIS).toEpochSecond();return TimeUnit.SECONDS.toNanos(seconds);}public long expireAfterUpdate(Key key, Graph graph, long currentTime, long currentDuration) {return currentDuration;}public long expireAfterRead(Key key, Graph graph,long currentTime, long currentDuration) {return currentDuration;}}).build(key -> createExpensiveGraph(key));

Caffeine提供了三种方法进行基于时间的剔除。

  • expireAfterAccess(long, TimeUnit): 自条目最后一次读取或写入的时点开始、如果超过了方法指定的时长,标记条目过期。在缓存数据与session绑定并在不交互时过期的场景下使用比较理想。
  • expireAfterWrite(long, TimeUnit): 自条目创建或最后一次值替换的时点开始、如果超过了方法指定的时长,标记条目过期。如果经过一段时间后缓存数据过时,则可能需要这么做。
  • expireAfter(Expiry): 在可变持续时间过去之后标记条目过期。在条目的过期时间由外部资源决定的场景下使用比较理想。

过期处理是在写入期间和偶尔的读取期间进行的。到期事件的调度和触发的时间复杂度为 O(1)。

为了迅速到期,而不是依靠其他缓存活动来触发例行维护,请使用Scheduler接口和Caffeine.scheduler(Scheduler)方法在缓存构建器中指定一个调度线程。 Java 9+用户可能更喜欢使用Scheduler.systemScheduler()来利用专用的系统范围的调度线程。

测试过期剔除不需要在挂钟的时间消逝中等待。使用Ticker接口和Caffeine.ticker(Ticker)方法在缓存构建器中指定一个时间源,而不必等待系统时钟。为此,Guava的testlib提供了一个方便的实现FakeTicker。

基于引用的剔除

// Evict when neither the key nor value are strongly reachable
LoadingCache<Key, Graph> graphs = Caffeine.newBuilder().weakKeys().weakValues().build(key -> createExpensiveGraph(key));// Evict when the garbage collector needs to free memory
LoadingCache<Key, Graph> graphs = Caffeine.newBuilder().softValues().build(key -> createExpensiveGraph(key));

Caffeine可以对keys或values使用弱引用,可以对values使用软引用,以此设置的缓存可以通过垃圾回收机制实现条目的回收。请注意,AsyncCache不支持弱引用和软引用。

Caffeine.weakKeys() 使用弱引用存储key。如果没有对key的强引用,缓存条目即可被垃圾回收掉。由于垃圾回收仅依赖identity equality,因此在进行key比较时只需要使用 == 即可,而不需要使用 equals()。

Caffeine.weakValues() 使用弱引用存储value。如果没有对value的强引用,缓存条目即可被垃圾回收掉。由于垃圾回收仅依赖identity equality,因此在进行value比较时只需要使用 == 即可,而不需要使用 equals()。

Caffeine.softValues() 使用软引用存储value。响应内存需求,软引用对象会以全局最近最少使用的方式进行垃圾回收。由于使用软引用会对性能产生影响,所以我们通常建议使用更可预测的设置最大缓存大小的方式来替代。使用softValues() 将导致value的比较是基于 == 而不是 equals()。

这篇关于Caffeine - Caches - Eviction的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/935497

相关文章

Linux - 利用/proc/sys/vm/drop_caches实现手工清理系统缓存

文章目录 现象`buff/cache` 的作用和含义分析 `buff/cache` 占用大量内存的原因是否需要清理缓存及其方法 命令清理缓存方法1. `sync` 命令2. `echo 3>/proc/sys/vm/drop_caches` 命令 注意事项小结 现象 使用free 命令,看到 buff/cache 占用很多 。 free 命令用于显示系统内存的使用情

「Spring 缓存最佳实践」Caffeine 与 Redis 分层缓存架构

在现代的应用程序中,缓存是提升系统性能和响应速度的关键手段。Spring 框架为我们提供了非常强大的缓存抽象,使我们可以方便地集成并使用各种缓存技术。本文将重点介绍如何在 Spring 应用中构建基于 Caffeine 和 Redis 的分层缓存架构,并分享一些最佳实践。 缓存层次设计 在构建缓存解决方案时,通常采用分层缓存的设计模式。将本地缓存(如 Caffeine)作为一级缓存,并将远程缓

Caffeine - Caches - Writer

Caffeine - Caches - Writer 写入器可能的用例写入模式分层同步监听器 参考 写入器 LoadingCache<Key, Graph> graphs = Caffeine.newBuilder().writer(new CacheWriter<Key, Graph>() {@Override public void write(Key key, Grap

Caffeine - Caches - Refresh

Caffeine - Caches - Refresh 刷新 刷新 LoadingCache<Key, Graph> graphs = Caffeine.newBuilder().maximumSize(10_000).refreshAfterWrite(1, TimeUnit.MINUTES).build(key -> createExpensiveGraph(key));

Caffeine - Caches - Removal

Caffeine - Caches - Removal 移除明确移除移除监听 移除 术语: 剔除是指基于剔除策略的移除无效只是被调用者手工移除移除是剔除和无效的后续操作 明确移除 在任何时候,您都可以显式的使缓存条目无效,而不必等待条目被剔除。 // individual keycache.invalidate(key)// bulk keyscache.inv

Caffeine - Caches - Population

Caffeine - Caches - Population 填充策略手动加载自动加载异步手动加载异步自动加载 填充策略 Caffeine提供了4中填充策略:手动加载、同步加载以及异步变体(异步手工、异步加载)。 手动加载 Cache<Key, Graph> cache = Caffeine.newBuilder().expireAfterWrite(10, TimeUn

Caffeine - Home

Caffeine - Home 1. 缓存条目自动加载2. 缓存条目异步加载3. 根据访问频率和新近度的剔除策略4. 基于最后访问时间的剔除策略5. 条目删除(移除)通知6. 条目写入传播到外部资源7. 缓存累积访问量统计 Caffeine是基于Java 8的高性能缓存库,可提供接近最佳的命中率。 缓存与ConcurrentMap类似,但又不尽相同。其中最根本的区别是Concur

Java本地缓存技术选型(Guava Cache、Caffeine、EhCache)

前言 对一个java开发者而言,提到缓存,第一反应就是Redis。利用这类缓存足以解决大多数的性能问题了,我们也要知道,这种属于remote cache(分布式缓存),应用的进程和缓存的进程通常分布在不同的服务器上,不同进程之间通过RPC或HTTP的方式通信。这种缓存的优点是缓存和应用服务解耦,支持大数据量的存储,缺点是数据要经过网络传输,性能上会有一定损耗。 与分布式缓存对应的是本地缓存,缓

本地缓存Caffeine在springBoot的简单介绍与使用

Caffeine 是一个高性能的 Java 缓存库,它提供了灵活的缓存策略,比如自动加载、大小限制、时间过期和引用回收等。这个库是基于 Google Guava 缓存设计而来,但在性能上进行了大幅优化,是当前 Java 应用中常用的缓存解决方案之一。         其实就是操作本地缓存而已,用起来和redis差不多,但是会快很多,因为是本地的,没有网络开销。 导入依赖: <depen

文献阅读(80)Caffeine

文章目录 1 缩写 & 引用2 abstract & introduction3 卷积加速器3.1 对带宽的优化 4 自动化流程 题目:Caffeine: Towards uniformed representation and acceleration for deep convolutional neural networks时间:2019期刊:TCAD研究机构:Chen Zh