Использование абстракции кэширования Spring, как я могу кэшировать обновление асинхронно, сохраняя при этом старую запись?Обновление асинхронного кэша с абстракцией весеннего кэша
Я пытаюсь использовать абстракцию кэширования Spring, чтобы создать систему кэширования, где после относительно короткого «мягкого» тайм-аута записи кэша становятся доступными для обновления. Затем, когда они запрашиваются, возвращается кешированное значение и запускается операция асинхронного обновления для обновления записи. Я бы также
Builder-хранилище Guava позволяет мне указать, что записи в кеше должны быть обновлены через определенное время. Метод reload() загрузчика кэша затем может быть переопределен асинхронной реализацией, позволяя вернуть устаревшее кэшированное значение до тех пор, пока не будет получен новый. Тем не менее, весеннее кэширование, похоже, не использует CacheLoader для лежащего в основе кэша Guava.
Возможно ли это обновление асинхронного кеша, используя абстракцию кэширования Spring?
Редактировать, чтобы уточнить: С помощью CacheBuilder от Guava я могу использовать 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;
}
}
});
Однако, я не могу видеть способ получить поведение refreshAfterWrite() с помощью @Cacheable абстракции Spring в.
как об этом. https://github.com/kimwz/caffeine-cache-annotation –