0

Guava Cache用来缓存我的数据。缓存中的数据如果数分钟未使用将被清除。

如果我修改我的数据,我会更新缓存中的数据,并将数据标记为“脏”(因为它是被修改的,并且与数据库中的数据不同)。每5分钟我会将“脏”数据推送到数据库(即更新数据库中的数据)。

问题是,有一个“脏”数据A。在将数据A推送到数据库之前,数据A已经被清理了,那么我将丢失“脏”数据A。

所以,我在数据被清理后添加了一个,它RemovalListener会注意到我,我会添加一个回调函数。在函数中,我尝试将数据放回缓存。但在多线程环境中,它不能保证数据正确。Guava CacheRemovalListener

例如:

1)缓存:清理数据A

2)线程1:获取数据A,缓存中的数据A已被清理,因此缓存将从数据库中获取数据A。并且数据库中的数据A不是最新的。所以线程 1 得到一个不正确的数据 A。

3)缓存:运行RemovalListener回调。

那么,如何处理脏数据,以便在多线程中保证数据始终正确?谢谢!

4

1 回答 1

1

一种可能的解决方案是将脏数据写入RemovalListener. 如果这是同步完成的,则同一条目上的其他操作将被阻止,并且不会出现不一致的状态。根据数据库的延迟,这也可能会影响缓存上的其他操作,请参阅 Guavas 文档中的警告。

一般来说,您喜欢做的是所谓的“缓存后写入”。有内置此功能的缓存产品。看看现有的解决方案。

于 2016-12-08T10:30:12.323 回答