我Guava Cache
用来缓存我的数据。缓存中的数据如果数分钟未使用将被清除。
如果我修改我的数据,我会更新缓存中的数据,并将数据标记为“脏”(因为它是被修改的,并且与数据库中的数据不同)。每5分钟我会将“脏”数据推送到数据库(即更新数据库中的数据)。
问题是,有一个“脏”数据A。在将数据A推送到数据库之前,数据A已经被清理了,那么我将丢失“脏”数据A。
所以,我在数据被清理后添加了一个,它RemovalListener
会注意到我,我会添加一个回调函数。在函数中,我尝试将数据放回缓存。但在多线程环境中,它不能保证数据正确。Guava Cache
RemovalListener
例如:
1)缓存:清理数据A
2)线程1:获取数据A,缓存中的数据A已被清理,因此缓存将从数据库中获取数据A。并且数据库中的数据A不是最新的。所以线程 1 得到一个不正确的数据 A。
3)缓存:运行RemovalListener回调。
那么,如何处理脏数据,以便在多线程中保证数据始终正确?谢谢!