在 Caffeine 中使用 AsyncCache 手动加载和删除条目

Manual load and removal of entries with AsyncCache in Caffeine

我只是 Caffeine 缓存的初学者,需要对一些用例进行说明。

  1. 我看到 Caffeine 仅支持同步缓存的 invalidate/invalidateAll 功能。我想知道为什么 AsyncCache 不支持 invalidate 函数?
asyncCache.synchronous().invalidate(key) //supported for synchronous cache                                    
asyncCache.invalidate(key)// not supported for async cache
  1. 还想弄清楚AsyncCache中的put方法是否异步加载缓存入口?我想手动将条目列表添加到 AsyncCache 中。不确定 asyncCache.asMap().putAll() 或使用 asyncCache.put() 迭代和添加条目是否异步完成作业?

有人可以详细说明一下吗?

  1. 由于该方法在 synchronous() 视图中可用,因此它只是进行相同调用的便捷默认方法。由于 invalidate 不是 return 值,因此在从基础 Map 中删除未来后,它不需要阻塞。如果需要删除阻塞,可以通过 synchronous().asMap().remove(key) 获得。它似乎没有承载它的重量。

  2. 一个 AsyncCache 存储一个 CompletableFuture 作为条目的值。未来的 put 只会阻塞足够长的时间来执行 ConcurrentHashMap 操作,从而允许独立解决未来。如果 future 作为错误或空结果完成,则 whenComplete 处理程序将其从缓存中删除。这种方式建立Map入口是同步的,但是加载future的值是异步的。

Caffeine 可以被认为是一个有界的 Map,带有方便的 API 以解决缓存问题。当显式使用 ConcurrentHashMap 时,它的行为应该与您预期的一样。因此,Cache<K, V> ~= Map<K, V>AsyncCache<K, V> ~= Map<K, CompletableFuture<V>>。当缓存 api 限制太多时,使用 asMap 视图可提供缓存接口实现 类 使用的所有功能。