Ehcache 和 CacheWriter (write-behind) 关系
Posted
技术标签:
【中文标题】Ehcache 和 CacheWriter (write-behind) 关系【英文标题】:Ehcache and CacheWriter (write-behind) relation 【发布时间】:2019-11-30 09:12:17 【问题描述】:假设我们有一个配置了后写 CacheWriter 的 Cache。假设我们将一些对象放入缓存中,然后由于驱逐策略而删除了该对象。
关于写作有什么保证?更准确地说,write()
事件是否保证会发生在该对象上,即使它在“有机会”被写入之前被删除?
谢谢!
【问题讨论】:
【参考方案1】:不,write()
不保证会发生。在后写的情况下,所有写入都存储在一个队列中,而一些后台线程从该队列中读取以更新底层 SoR(记录系统,即:您的数据库)。该队列可以被同时读取或修改同一缓存的其他线程读取或修改。
例如,如果put()
发生在某个键上,write()
会将命令排入队列。如果在一个后台线程有机会在remove()
发生在同一个键上之前使用写入命令,则可以从队列中删除写入命令(注意此处的“可以”)。可以进行其他类似的优化(再次“可以”),这些可以更改并且可以在任何次要版本中添加新的优化,因为这都被视为实现细节,只要 Ehcache 提供的数据遵循其一般可见性保证。
这意味着 Write-Behind,更一般地说,所有 CacheWriter
s 都不得用于任何形式的会计,如果这是您想到的用例的话。
【讨论】:
我仍然可以收听删除事件,对吧?我的最终目标是将所有数据(最终)同步到数据库。我不介意数据库不会立即与缓存同步,但我不想丢失数据。 如果您的目标是将缓存与数据库同步,那么只需实现CacheLoaderWriter
并让 Ehcache 完成剩下的工作,因为它确实保证数据最终会写入数据库。也就是说,当然忽略了运行 Ehcache 的 JVM 的任何崩溃。除非您正在运行集群。
是的,这正是我所做的(实现CacheLoaderWriter
)。我写CacheWriter
(?) 可能把你弄糊涂了
我现在不清楚的是这两个语句是如何一起存在的:(1)“这意味着 Write-Behind,更一般地说,所有 CacheWriters 不得用于任何形式的会计”( 2)“因为它确实保证数据最终会被写入数据库”。你能详细说明一下吗?
我的猜测是这意味着(1)数据可能会丢失。 (2) 缓存可能与数据库不一致 - 因此,如果您正在实施需要交易的东西(如银行账户操作),请不要使用此解决方案以上是关于Ehcache 和 CacheWriter (write-behind) 关系的主要内容,如果未能解决你的问题,请参考以下文章