gpt4 book ai didi

java - 如何处理Guava Cache中的脏数据

转载 作者:行者123 更新时间:2023-12-01 09:09:05 24 4
gpt4 key购买 nike

我使用Guava Cache来缓存我的数据。缓存中的数据如果几分钟没有使用就会被清理。

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

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

因此,当数据被清理后,我向 Guava Cache 添加一个 RemovalListenerRemovalListener 会注意到我,我会回调函数。在该函数中,我尝试将数据放回到缓存中。但在多线程环境下,它不能保证数据的正确性。

例如:

1)缓存:清理数据A

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

3)缓存:运行RemovalListener回调。

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

最佳答案

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

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

关于java - 如何处理Guava Cache中的脏数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41034283/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com