我想要一个像这样工作的缓存:
- A. 如果请求没有被缓存:加载并返回结果。
- B. 如果请求被缓存,尚未过期:返回结果。
- C. 如果请求已缓存,已过期:立即返回旧结果,开始重新加载结果(异步)
- D. 如果请求已缓存、已过期、重新加载已在运行:立即返回旧结果。
- E.如果重新加载失败(异常):继续向请求返回之前成功加载的结果。
(重新加载失败后(情况 E),下一个请求将按照情况 C 进行处理。)
(如果情况A以异常结束,则抛出异常)
有谁知道现有的实现,还是我必须自己实现?
In cache2k我完全实现了您上面描述的行为。以下是如何使用这些功能构建缓存:
CacheBuilder.newCache(Key.class, Value.class)
.name("myCache")
.source(new YourSourceImplementation())
.backgroundRefresh(true)
.suppressExceptions(true)
.maxSize(7777) // maximum entries in the cache
.expiryDuration(60, TimeUnit.SECONDS)
.exceptionExpiryDuration(15, TimeUnit.SECONDS)
.build();
The exipryDuration
是插入或修改值后被认为有效的持续时间。单独设置为exceptionExpiryDuration
是发生异常后直到尝试下一次刷新的时间。
如果发生异常,但没有有效条目,则异常将被缓存并重新抛出exceptionExpiryDuration
time.
您还可以动态计算到期时间,例如基于异常类型。博客条目中有更多信息关于缓存异常
With backgroundRefresh
条目过期后会刷新。当刷新后在过期时间内没有发生访问时,该条目将不再刷新,最终被驱逐。
不幸的是,我在正确记录所有这些有用的功能方面确实落后了。如果您还有任何疑问,可以使用标签cache2k
。如果您喜欢一些改进,请在 GitHub 上提出问题。
该代码在我们的生产应用程序中运行良好大约一年了。实际上,suppressExceptions
始终是默认值。它很有帮助,例如如果出现短暂的网络中断。
顺便说一句:同时,我将这些语义纳入术语缓存弹性.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)