本文主要是介绍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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!