Guava Cache私は自分のデータをキャッシュするために使用します。数分間使用されていない場合、キャッシュ内のデータは消去されます。
データを変更すると、キャッシュ内のデータが更新され、データが「ダーティ」とマークされます (変更されるため、データベース内のデータとは異なるため)。そして、5分ごとに「ダーティ」データをデータベースにプッシュします(つまり、データベース内のデータを更新します)。
問題は、「ダーティ」データ A があることです。データ A がデータベースにプッシュされる前に、データ A が最初に消去され、「ダーティ」データ A が失われます。
そのため、データが消去されRemovalListenerたときに に を追加すると、は私に気づき、私はコールバック関数を実行します。関数では、データをキャッシュに戻そうとします。ただし、マルチスレッド環境では、データが正しいとは限りません。Guava CacheRemovalListener
例えば:
1) キャッシュ: クリーン データ A
2) スレッド 1: データ A を取得します。キャッシュ内のデータ A は消去されているため、キャッシュはデータベースからデータ A を取得します。データベース内のデータ A は最新ではありません。そのため、スレッド 1 は正しくないデータ A を取得します。
3) キャッシュ: RemovalListener コールバックを実行します。
では、マルチスレッドでデータが常に正しいことを約束できるように、ダーティ データを処理するにはどうすればよいでしょうか。ありがとう!