预加载和刷新缓存条目时的番石榴线程管理



我们希望使用番石榴缓存来缓存第三方数据,以获得更好的响应时间。需要通过进行一系列 api 调用来预加载缓存(将进行 ~ 4000 次 api 调用(。api 响应包含缓存键及其值。这些 api 调用需要从多个线程(即线程池(并行进行,以加快缓存加载速度。每个缓存条目都有一个到期时间。这可以使用 expireAfterAccess(( 调用来设置。 缓存条目过期后,需要在后台自动刷新。还应该有一种方法(api(,通过它我们可以停止这种后台缓存刷新,这样我们就不会无休止地进行api调用。一旦我们在配置的时间间隔后停止获取用户请求,我们将调用此 api。

是否可以将缓存加载和刷新的线程管理委托给番石榴? 即给定 api 调用、将 JSON 响应映射到 Java 对象的代码和缓存键值设计,guava 可以自行执行预加载和刷新吗?

谢谢。

Guava中的自动刷新可以通过CacheBuilder.refreshAfterWrite((启用。相关语义描述为:

指定活动条目符合自动刷新一次的条件 条目创建后经过了固定持续时间,或者最多 最近更换其价值。[ ... ]当前自动刷新 在发生对条目的第一个过时请求时执行。

重写方法CacheLoader.reload()时,可以使用线程池异步加载值。

此行为的问题在于,如果成功,则在新值加载之前,您总是会读取一些过时值。另一种缓存实现(如 cache2k(在持续时间结束后立即开始刷新。后一种方法会导致更新的数据,但可能会产生更多不必要的读取。在这里查看最近关于此的一些讨论:https://github.com/ben-manes/caffeine/issues/261

最新更新