Caching Ehcache和CacheWriter(写后)关系

Caching Ehcache和CacheWriter(写后)关系,caching,concurrency,ehcache,ehcache-3,Caching,Concurrency,Ehcache,Ehcache 3,假设我们有一个配置了write-behind CacheWriter的缓存。假设我们将某个对象放在缓存中,然后由于逐出策略,该对象被删除 关于写作,什么是有保证的?更准确地说,是否保证该对象发生write() 谢谢 否,write()不一定会发生。在write-behind情况下,所有写操作都存储在一个队列中,而一些后台线程从该队列中读取以更新底层SoR(记录系统,即:您的数据库)。该队列可以由同时读取或修改同一缓存的其他线程读取或修改 例如,如果一个put()发生在某个键上,write()将命

假设我们有一个配置了write-behind CacheWriter的缓存。假设我们将某个对象放在缓存中,然后由于逐出策略,该对象被删除

关于写作,什么是有保证的?更准确地说,是否保证该对象发生
write()

谢谢

否,
write()
不一定会发生。在write-behind情况下,所有写操作都存储在一个队列中,而一些后台线程从该队列中读取以更新底层SoR(记录系统,即:您的数据库)。该队列可以由同时读取或修改同一缓存的其他线程读取或修改

例如,如果一个
put()
发生在某个键上,
write()
将命令排队。如果在同一个键上发生
remove()
之前,某个后台线程有机会使用write命令,则可以从队列中删除write命令(请注意此处的“can”)。还可以进行其他类似的优化(“can”),这些优化可以更改,也可以在任何小版本中添加新的优化,因为这些都被视为实现细节,只要Ehcache提供的数据遵循其一般可见性保证


这意味着Write Behind,更一般地说,所有的
CacheWriter
s都不能用于任何形式的记帐,如果这是您想到的用例的话。

我仍然可以监听删除事件,对吗?我的最终目标是将所有数据(最终)同步到数据库。我不介意数据库不会立即与缓存同步,但我不想丢失数据。如果您的目标是将缓存与数据库同步,那么只需实现
CacheLoaderWriter
并让Ehcache完成其余工作,因为它确实保证数据最终会写入数据库。也就是说,当然,忽略运行Ehcache的JVM的任何崩溃。除非您正在运行集群。是的,这正是我所做的(实现
CacheLoaderWriter
)。我写
CacheWriter
(?)可能会把你弄糊涂。现在我不清楚的是这两个语句是如何同时存在的:(1)“这意味着写在后面,更一般地说,所有CacheWriter都不能用于任何形式的记帐”(2)“因为它确实保证数据最终会写入数据库”。你能详细说明一下吗?我猜这意味着(1)数据可能会丢失。(2) 缓存可能与数据库不一致-因此,如果要实现需要事务性的东西(如银行帐户操作),请不要使用此解决方案