2017-09-10 6 views
1

私はGuavaキャッシュについて説明するこのドキュメントを読んでいます:CachesExplained。私はrefreshAfterWriteとexpireAfterWriteが何をしているのか理解しています。ただし、refreshAfterWriteについて説明していますが、このドキュメントでは次のように説明しています。Guava LoadingCache:refreshAfterWriteとexpireAfterWriteを一緒に使用する理由

」たとえば、refreshAfterWriteとexpireAfterWriteの両方を同じキャッシュに指定すると、エントリの有効期限が盲目的にリセットされません。エントリがリフレッシュの対象となるため、リフレッシュの対象となった後にエントリがクエリされない場合は、有効期限が切れます。 "

これは私を混乱させる部分です。私の理解のために、キーを自動的にリフレッシュするには、refreshAfterWriteを指定する必要があります。 refreshAfterWriteが使用されているときに、expireAfterWriteを使用する必要があるのはなぜですか?

答えて

2

キャッシュされたエントリを関連させ、リフレッシュの持続時間を設定するシナリオがあります(これは実行後に完全にフェッチされずに異なるため)同時にキャッシュが制限されている場合は、エントリを削除する必要があります。これはexpireAfterWriteのためのものです。それらを両方とも設定することで、更新されたとしても一定時間後にエントリが削除されることを確認します。

はまた、両方のは、彼らが動作しているように異なっていることに注意してください:

リフレッシュ立ち退きと全く同じではありません。 LoadingCache.refresh(K)で指定されているように、キーをリフレッシュすると、キーの新しい値が読み込まれます。キーがリフレッシュされている間は古い値(存在する場合)が返されますが、これはエビクションとは対照的です。これにより、値が新たに読み込まれるまで取得を強制的に待機させます。

+0

意味があります。しかし、私もこの質問があります:私はちょうどexpireAfterWrite()を使用する場合は、それも十分なはずですか? expireAfterWrite()は古いエントリを削除します。 get()を呼び出すたびに、キャッシュによってロードされた新しい値か、値が期限切れになっているかどうかによってキャッシュ内の値が返されます。 refreshAfterWrite()について説明しているドキュメントでは、**このリフレッシュはエントリがクエリされたときにのみ実際に開始されます**。 refreshAfterWrite()を使用することのポイントは何ですか?あなたは私に例を教えていただけますか? –

+0

リフレッシュ操作はより軽く(非同期に)、次に追い出し後に完全にフェッチすることができます。私は答えの本文にこのメモを追加しました。 –

+0

リフレッシュすると、有効期限の書き込みタイムスタンプがリセットされます。その目的は、いくつかのエントリが非常に暑くなる可能性があり、期限が切れると、呼び出し側が負荷をブロックするときにユーザーが見ることができる待ち時間があることです。リフレッシュにより、このコストを負担せずにアクティブなエントリを再ロードすることができます。非アクティブであれば、期限切れになって退去する。 –

関連する問題