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

时间:2018-10-01 09:03:07

标签: java caching guava

我们想使用番石榴缓存来缓存第三方数据,以提高响应速度。需要通过执行一系列api调用来预加载缓存(要进行约4000个api调用)。 api响应包含缓存键及其值。需要从多个线程(即线程池)并行进行这些api调用,以加快缓存加载速度。 每个缓存项将有一个到期时间。可以使用expireAfterAccess()调用来设置。 缓存条目过期后,需要在后台自动刷新。还应该有一种方法(api),通过该方法我们可以停止此后台缓存刷新,以免我们不断进行api调用。在配置的时间间隔后停止获取用户请求后,我们将调用此api。

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

谢谢。

1 个答案:

答案 0 :(得分:1)

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

  

指定活动条目有资格自动刷新一次   条目创建后经过了固定的时间,或者最多   最近替换其值。 [...]当前自动刷新   当第一个陈旧的条目请求发生时执行。

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

此行为的问题是,在成功加载新值之前,您始终会多次读取过时的值。诸如cache2k之类的备用缓存实现会在持续时间之后立即开始刷新。后一种方法可获取更多最新数据,但可能会导致不必要的读取。在这里查看有关此问题的最新讨论:https://github.com/ben-manes/caffeine/issues/261