简单的Java缓存库还是设计模式?[已关闭]

我需要经常访问耗时计算的结果。结果变化不多,所以我必须不时地重新计算数据,但可以使用过时的结果一段时间。最简单的方法是什么,是否有现有的库方法或设计模式?

我正在考虑类似的东西

private static List myCachedList = null;

...

// refresh list once in 3600 seconds
if (needsRefresh(myCachedList, 3600)) {
    // run the calculation
    myCachedList = ...
}
// use either updated or previous value from here on

一个正确的实现可能不是微不足道的,它可能必须处理线程安全,竞争条件等,所以我宁愿使用一个经过验证的实现,而不是在这里滚动我自己的。


答案 1

恭喜你意识到写你自己的可能会更麻烦,它最初出现!

我会看看番石榴缓存解决方案。番石榴是一个经过验证的库,缓存可以通过流畅的工厂API轻松获得(和配置)。

所有番石榴缓存,无论是否加载,都支持get(K,Callable<V>)方法。此方法返回与缓存中的键关联的值,或从指定的 Callable 计算该值并将其添加到缓存中。在加载完成之前,不会修改与此缓存关联的任何可观察状态。这种方法提供了一个简单的替代传统的“如果缓存,则返回;否则创建,缓存和返回“模式。


答案 2

我建议您使用代理设计模式,这样您就可以将缓存逻辑实现封装在代理类中

这里有一个很酷的例子,看起来可以满足您的需求

http://en.wikipedia.org/wiki/Proxy_pattern