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 に答える