我使用Guava Cache
来缓存我的数据。如果几分钟内未使用缓存中的数据,则将清除缓存中的数据。
如果我修改我的数据,我将更新缓存中的数据,并标记数据"脏"(因为它被修改,并且与数据库中的数据不同)。 每隔5分钟,我就会推动#34;脏"数据到数据库(即,更新数据库中的数据)。
问题是,有一个"脏"数据A.在将数据A推送到数据库之前,数据A首先被清理,然后我将丢失"脏"数据A.
因此,我在清理数据后向RemovalListener
添加了Guava Cache
,RemovalListener
会注意到我,我会回调函数。在该函数中,我尝试将数据放回缓存中。但在多线程环境中,它无法保证数据的正确性。
例如:
1)缓存:清理数据A
2)线程1:获取数据A,缓存中的数据A已被清除,因此缓存将从数据库中获取数据A.而数据库中的数据A不是最新的。因此,线程1获取的数据A不正确。
3)cache:运行RemovalListener回调。
那么,我如何处理脏数据,以便我可以保证在多线程中数据总是正确的?谢谢!
答案 0 :(得分:1)
一种可能的解决方案是在RemovalListener
中写入脏数据。如果完成此操作,则同步条目上的其他操作将被阻止,并且不会显示任何不一致的状态。根据数据库的延迟,这可能会影响缓存上的其他操作,请参阅Guavas文档中的警告。
一般来说,你喜欢做的是所谓的"写后面的缓存"。有一些内置此功能的缓存产品。请查看现有解决方案。