AsyncCache предлагает представление synchronous()
для предоставления кэша, блокирующего до завершения асинхронного вычисления.
/**
* Returns a view of the entries stored in this cache as a synchronous {@link Cache}. A mapping is
* not present if the value is currently being loaded. Modifications made to the synchronous cache
* directly affect the asynchronous cache. If a modification is made to a mapping that is
* currently loading, the operation blocks until the computation completes.
*
* @return a thread-safe synchronous view of this cache
*/
Cache<K, V> synchronous();
Это может быть удобно для выполнения операций, таких как invalidate(key)
, которые не имеют асинхронного аналога. Он также обеспечивает доступ к статистике и метаданным политики.
AsyncCache<Integer, Integer> cache = Caffeine.newBuilder()
.maximumSize(10_000)
.recordStats()
.buildAsync();
// Perform application work
for (int i = 0; i < 4; i++) {
cache.get(1, key -> key);
}
// Statistics can be queried and reported on
System.out.println(cache.synchronous().stats());
В этом случае мы ожидаем, что первая ошибка загрузит запись, так что последующие поиски будут хитом.
CacheStats{hitCount=3, missCount=1, loadSuccessCount=1, loadFailureCount=0, totalLoadTime=8791091, evictionCount=0, evictionWeight=0}