Spring のキャッシングの抽象化を使用して、古いエントリを返しながらキャッシュに非同期的にエントリを更新させるにはどうすればよいですか?
Spring のキャッシング抽象化を使用して、比較的短い「ソフト」タイムアウトの後、キャッシュ エントリがリフレッシュの対象となるキャッシング システムを作成しようとしています。その後、クエリが実行されると、キャッシュされた値が返され、非同期更新操作が開始されてエントリが更新されます。私も
Guava のキャッシュ ビルダーを使用すると、一定時間後にキャッシュ内のエントリを更新するように指定できます。その後、キャッシュローダーの reload() メソッドを非同期実装でオーバーライドして、新しい値が取得されるまで古いキャッシュ値を返すことができます。ただし、春のキャッシュは、基になる Guava キャッシュの CacheLoader を使用していないようです
Spring のキャッシング抽象化を使用して、この種の非同期キャッシュ リフレッシュを行うことは可能ですか?
明確にするために編集: Guava の CacheBuilder を使用すると、 refreshAfterWrite() を使用して必要な動作を取得できます。例えばGuava Caches Explainedから:
LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()
.maximumSize(1000)
.refreshAfterWrite(1, TimeUnit.MINUTES)
.build(
new CacheLoader<Key, Graph>() {
public Graph load(Key key) { // no checked exception
return getGraphFromDatabase(key);
}
public ListenableFuture<Graph> reload(final Key key, Graph prevGraph) {
if (neverNeedsRefresh(key)) {
return Futures.immediateFuture(prevGraph);
} else {
// asynchronous!
ListenableFutureTask<Graph> task = ListenableFutureTask.create(new Callable<Graph>() {
public Graph call() {
return getGraphFromDatabase(key);
}
});
executor.execute(task);
return task;
}
}
});
ただし、Spring の @Cacheable 抽象化を使用して refreshAfterWrite() の動作を取得する方法がわかりません。