Caffeine - Caches - Writer

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

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

Caffeine - Caches - Writer

    • 写入器
      • 可能的用例
        • 写入模式
        • 分层
        • 同步监听器
    • 参考

写入器

LoadingCache<Key, Graph> graphs = Caffeine.newBuilder().writer(new CacheWriter<Key, Graph>() {@Override public void write(Key key, Graph graph) {// write to storage or secondary cache}@Override public void delete(Key key, Graph graph, RemovalCause cause) {// delete from storage or secondary cache}}).build(key -> createExpensiveGraph(key));

CacheWrite允许缓存充当基础资源外观的角色,并且当与CacheLoader结合使用时,所有的读写操作都可以通过缓存进行。写入器会将缓存的原子操作扩展到与外部资源的同步上。这意味着在写入操作完成前,缓存将阻塞该条目的后续修改操作,并且所有的读操作都会返回先前的值。如果写入失败,映射将保持不变,并且异常会传播到调用方。

当条目被创建、修改、删除时会通知CacheWriter。映射被加载(如LoadingCache.get)、重新加载(如LoadingCache.refresh)或计算(如Map.computeIfPresent)不会通知CacheWriter。

请注意,CacheWriter不能与弱引用key或AsyncLoadingCache结合使用。

可能的用例

CacheWriter是为复杂的工作流准备的扩展点,这些工作流需要借助外部资源来观察给定key的修改顺序。Caffeine支持这种用法,但不是与生俱来的。

写入模式

CacheWriter可用用来实现直写(write-through)缓存和回写(write-back)缓存。

在直写缓存中,所有操作同步执行,只有在写入操作成功完成后才会更新缓存。这避免了资源更新和缓存更新作为独立原子操作时竞态条件的发生。

在回写缓存中,对外部资源的操作是在缓存更新后异步执行的。这样提升了写入吞吐量,但存在数据不一致的风险,如当写入失败时,缓存中就会存在无效状态。该方法在指定时间延迟写、限制写速率及批量写操作时很有用。

回写扩展可以实现以下部分或全部功能:

  • 批处理和合并操作
  • 将操作延迟到一个时间窗口
  • 如果超过阈值大小,在执行定期刷新前执行批处理
  • 如果操作尚未刷新,则从后写缓冲区(write-back buffer)加载数据
  • 根据外部资源的特征处理重试、限流和并发

有关使用RxJava的简单示例,请参见write-behind-rxjava。

分层

CacheWriter可以用于集成多层缓存。

分层缓存从记录系统支持的外部缓存加载和写入数据。这样就可以创建一个以大而慢的缓存为依托的小而快的缓存。典型的层有堆外、基于文件的和远程缓存。

受害者缓存(victim cache)是分层缓存的变体,被剔除的条目会写到二级缓存。delete(K, V, RemovalCause) 允许检查为什么移除该条目并做相应的处理。

同步监听器

CacheWriter可以用于发布到同步监听器。

同步监听器按照 指定key在缓存中的操作发生的 顺序接收事件通知。监听器或者阻塞缓存操作,或者将事件入队以异步方式执行。这种类型的监听器最常用于复制或构建分布式缓存。

参考

Cache写机制:Write-through与Write-back

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



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

相关文章

DataX的如何使用hdfsreader/writer

说明:DataX的hdfs读取或写入一般用的比较少,国内用datax通常都是用它完成数据仓库之间的数据迁移,很少以文件的形式直接迁移,对于hdfs来讲,datax提供了hdfsreader和hdfswriter,本篇以文件的方式导入或导出hive数据为例,展示datax的hdfsreader/writer怎么用,因为整体的技术大环境下使得datax提供的hdfsreader/writer也是以结构

android java BufferedWriter writer 如果每次都在 原有的数据上追加数据怎么实现?就是先读取,然后再写入

在Android Java中,如果你想要使用`BufferedWriter`在原有数据的基础上追加数据,你需要确保在打开文件时使用`FileWriter`的构造函数,并传入一个布尔值参数`true`,表示以追加模式打开文件。以下是实现这一功能的步骤: 1. **创建`BufferedWriter`实例**:    使用`FileWriter`的构造函数,并传入追加模式的标志。 2. **读取现

【FlinkX】两个issue分析:reader和writer的通道数不一致+获取JobId

文章目录 issue详情reader和writer的通道数不一致获取JobId 代码分析#issue145配置说明源码分析: #issue148 最近准备再花点时间优化一下之前的FlinkX版本,特地去看了一下项目的issues区域,发现两个自己比较关注的issue。 issue详情 reader和writer的通道数不一致 异构数据源reader和writer设置不

45-Javareader和Writer文本IO操作的解析

Java中的Reader和Writer是处理字符流的抽象类,它们是所有字符流读写器的基类。以下是使用Reader和Writer进行文本IO操作的简单示例。 import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.io.Reader;import java.io.W

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

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

writer.h

在研究writer类之前,我们需要看下WriterBase,因为class Writer : public WriterBase 此处为语雀内容卡片,点击链接查看:https://www.yuque.com/u28554159/onrdis/vkq1w4hg2ahl1q6f writer.h里面定义了一个Transmit类的share_ptr,实现了write方法,讲消息通过tansmitt

go语言中io操作中的 io.Reader 和 io.Writer的获取方法 总结

我们在对文件进行io操作的时候,经常看到需要我们传递一个 io.Reader 或者 io.Writer 对象作为读写的入参, 那么我们该如何或者这些个RW对象呢?  其实很简单,你只需要查找一下哪些对象实现了 Read或者 Writer方法,那么你只需要创建一个实现了这2个方法之一的对象 , 那他就可以是一个  io.Reader 或者 io.Writer 。 当然最常见的应该就是我们的 os.

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

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

Reader And Writer

原文链接 作者: Jakob Jenkov  译者: 李璟(jlee381344197@gmail.com) Java IO的Reader和Writer除了基于字符之外,其他方面都与InputStream和OutputStream非常类似。他们被用于读写文本。InputStream和OutputStream是基于字节的,Reader和Writer是基于字符的。 Reader Re

Go中如何将io.Writer转换成字符串(将两个管道连接的exec.Command输出的标准输出获取成字符串)

假设我们需要在Go中运行下面的命令: PS -A | grep wget 这里需要写成两个exec.Command,如下,第一个命令为cmd,第二个为cmd2: cmd := exec.Command("PS", "-A")cmd2 := exec.Command("grep", "wget") 然后使用管道连接二者的标准输出和标准输入,需要注意第一个命令cmd的标准输出应该使用cm