1

私のユースケースは、サービスの上にキャッシュを実装する必要があり、(作成時から) 一定時間後にエントリを期限切れにする必要があることです。

また、エントリの有効期限が切れている場合は、サービス ルックアップを実行して最新のエントリを取得する必要があります。レッツコールはサービスリフレッシュです。

ただし、サービスの更新が失敗した場合、キャッシュ内の古いデータを使用できるはずです。

しかし、キャッシュは既に期限切れになっているため、そのエントリはありません。

そのため、キャッシュの有効期限を制御することを考えています。キャッシュ エントリは、サービスが最新のデータを取得できる場合にのみ有効期限が切れます。それ以外の場合は、そのエントリを削除しないでください。

私はGoogle Guavaキャッシュを調べていましたが、イベントを通知するremovalListenerのみを提供しますが、これで有効期限イベントを制御することはできません.

私の目的を果たすことができるサードパーティのキャッシュ実装はありますか?

4

1 に答える 1

1

この種の回復力と堅牢性のセマンティクスは、cache2kに実装されています。私たちはこれを本番環境でかなり長い間使用しています。セットアップは次のようになります

CacheBuilder.newCache(Key.class, Value.class)
  .name("myCache")
  .source(new YourSourceImplementation())
  .backgroundRefresh(true)
  .suppressExceptions(true)
  .expiryDuration(60, TimeUnit.SECONDS)
  .build();

実際にexceptionExpiryDurationは、再試行の間隔を短く設定できます。SO にも同様の質問があり、私も答えました。参照: Guava キャッシュ (または他のライブラリ) の動作を次のように構成することは可能ですか: リロードする時間がある場合は、前のエントリを返し、バックグラウンドでリロードします (仕様を参照)それについてのいくつかの詳細。

使用するキャッシュに関係なく、一般的な例外処理と、堅牢で回復力のあるアプリケーションの構築には、詳細にいくつかの考慮が必要であるため、多くの問題に遭遇します。

とはいえ、私はまだこのソリューションに完全に満足しているわけではありません。たとえば、古いデータを提供する期間など、もっと制御が必要だと思うからです。さらに、古いデータがキャッシュに含まれている場合、キャッシュには警告が必要です。ここでこれを改善する方法についていくつかの考えを述べました: https://github.com/cache2k/cache2k/issues/26

フィードバックは大歓迎です。

于 2016-03-04T08:22:45.913 に答える