私はGuava Cache
を使用してデータをキャッシュします。キャッシュ内のデータは、数分間使用されていなければクリーニングされます。グアバキャッシュの汚れたデータを処理する方法
データを変更した場合、キャッシュ内のデータを更新し、データを「ダーティ」にマークします(変更されるためデータベース内のデータと異なるため)。 5分ごとに、「汚れた」データをデータベースにプッシュします(つまり、データベースのデータを更新します)。
問題は「汚い」データAは、データのデータベースにプッシュされる前に存在し、ある、データAは、最初にクリーニングされた、そして私は、だから、「汚い」データA.
を失うことになりますデータが消去されたらRemovalListener
をGuava Cache
に追加します。RemovalListener
は私に気づき、コールバック機能を行います。この関数では、データをキャッシュに戻そうとします。しかし、マルチスレッド環境では、正しいデータを保証することはできません。
例:
1)キャッシュ:クリーンデータ
2)スレッド1:データAを取得し、キャッシュ内のデータAが清掃されたので、キャッシュはdatabase.AndからのデータAを取得しますデータベース内のデータAは最新ではありません。したがって、スレッド1は不正なデータを取得します。
3)キャッシュ:RemovalListenerコールバックを実行します。
このように、汚れたデータをどのように扱うことができますか?マルチスレッドの場合、データは常に正しいと私は約束できますか?ありがとう!
あなたは本当にデータベースの更新をそのように延期する必要がありますか?データベースへのコミットの正常なプロセス(およびそれが通過したことを確認すること)が重すぎますか? – Thilo
@Thiloデータベースを頻繁に更新すると、DB I/Oのパフォーマンスが低下します。私はちょうど5分ごとにデータベースを更新します。 – Gradle