2

Guava で LoadingCache を使用した特定のユースケースがあります。

  1. アクセスされていないキーは 30 分で期限切れになります
  2. キーがキャッシュにある限り、アクセスに関係なく最新の状態に保つ

私はこれらのセマンティクスにたどり着くことができたのは、外部からのクラッジを使用した場合だけでした。 https://gist.github.com/kashyapp/5309855

ここに投稿して、人々がより良いアイデアを提供できるかどうかを確認します。

問題

  1. refreshAfterWrite() はアクセス時にのみトリガーされます
  2. cache.refresh() -> CacheLoader.reload()
    • oldValue を返しても、アクセス/書き込みのタイマーを更新します
    • immediateCancelledFuture() を返すと、見苦しいログが発生します
    • 基本的に reload() が何も変わっていないと言う方法はありません

解決

  1. キャッシュに expireAfterAccess を設定する
  2. 外部エグゼキュータ サービスを使用してすべてのキーの refreshJob をスケジュールする
  3. refreshJob.run() は、キャッシュにまだキーがあるかどうかを確認します
    • (asMap().containsKey()) はアクセス時間を更新しません
  4. アップストリームにクエリを実行し、変更された値がある場合にのみ cache.put() を実行します

もうすぐそこ

しかし、これはまさに私がやろうとしていることではありませんが、十分に近いものです。アップストリームが変更されていない場合、アクセスされていないキーは期限切れになります。アップストリームで変更されるキーは、キャッシュ内で期限切れになりません。

4

0 に答える 0