Java 我正在缓存中存储某些项目,这些项目太昂贵,无法实时查询。如何更新这些缓存元素?

Java 我正在缓存中存储某些项目,这些项目太昂贵,无法实时查询。如何更新这些缓存元素?,java,caching,thread-safety,ehcache,Java,Caching,Thread Safety,Ehcache,我需要每半小时更新一次缓存元素,以防止它过时。在更新过程中,我需要确保getelement不会返回null,因为我不希望实时查询重新生成元素,因为这会非常昂贵,并且会使实时API超时。我在一个中等并发环境中工作~5 req/s 在更新时,我希望在更新之前仍然能够访问旧的缓存元素。本质上,我不希望缓存返回null,更新时的最终一致性对我来说是完全好的。如何使用ehcache实现类似的功能?对于这种情况,ehcache中没有内置的支持。您必须通过在缓存外部处理过期和更新来实现它 另一种选择是使用re

我需要每半小时更新一次缓存元素,以防止它过时。在更新过程中,我需要确保getelement不会返回null,因为我不希望实时查询重新生成元素,因为这会非常昂贵,并且会使实时API超时。我在一个中等并发环境中工作~5 req/s


在更新时,我希望在更新之前仍然能够访问旧的缓存元素。本质上,我不希望缓存返回null,更新时的最终一致性对我来说是完全好的。如何使用ehcache实现类似的功能?

对于这种情况,ehcache中没有内置的支持。您必须通过在缓存外部处理过期和更新来实现它

另一种选择是使用read-through,即在get计算值时让缓存块位于get上,以便其他读取器等待,而不是重新计算值


但是,这不是100%的要求,因为您将阻塞而不是返回稍微过时的值。

是的,阻塞将成为一个问题,因为它是一个大对象,放入对象本身需要一些时间。我认为一种方法是将对象复制为A&B。如果存在A,则刷新B,然后使A无效。当正常读取发生时,我将简单地检查a/B,无论哪个返回非null,我都将使用它。如果两者都返回非null,那么也可以使用旧的。如果两者都返回null,那么我将被迫进行计算,但从编程角度看,除非缓存本身过期,否则不会发生这种情况,我会处理缓存本身