6

Google Guava Cache のドキュメントには次のように記載されています。

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

リフレッシュ中に例外がスローされた場合、古い値が保持され、例外がログに記録されて飲み込まれます。

このログと例外の飲み込みは、私の使用例では非常に悪いものです。これは、リフレッシュが例外をスローした場合、キャッシュのユーザーがキャッシュ内の古いデータを見つけ続けることを意味するためです。

リフレッシュで例外がスローされた場合、キャッシュが null を返すか、load メソッドの呼び出しを開始することを確認するにはどうすればよいですか?

4

2 に答える 2

8

古いデータを提供したくない場合は、invalidate(key)代わりに を呼び出す必要がありrefresh(key)ます。これは、 のキャッシュされた値keyが存在する場合は破棄します。

その後の への呼び出しはget(key)、値ローダーに同期的に委譲し、 によってスローされた例外を再スローし、CacheLoaderでラップされます(Unchecked)ExecutionException

于 2012-07-25T02:25:06.590 に答える
1

古いデータが問題になる場合は、expireAfterWrite古いデータが提供されないようにするために使用する必要があります。

于 2012-07-27T14:48:54.203 に答える