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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值