简单的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 

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

恭喜你意识到写你自己的东西最初会出现问题!

我会查看Guava缓存解决方案。 Guava是一个经过validation的库,通过流畅的工厂API可轻松获得(并可配置)缓存。

所有Guava缓存,无论是否加载,都支持方法get(K,Callable )。 此方法返回与缓存中的键关联的值,或者从指定的Callable计算它并将其添加到缓存中。 在加载完成之前,不会修改与此高速缓存关联的可观察状态。 此方法提供了传统“if cached,return;否则create,cache和return”模式的简单替代。

我会看一下Google guava-libraries 。 大部分工作已经为您完成。

特别是一个名为Timed Eviction的部分,可能与你想要的有关。 https://github.com/google/guava/wiki/CachesExplained#timed-eviction

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

这里有一个很酷的例子,看起来很符合你的需求

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

如果您不想使用第三方库,只需创建一个包含键和值的静态地图。 使用密钥可以快速检索数据。

并编写方法将值添加到缓存,获取,删除。

 public SimpleCache{ private static Map simpleCache = new HashMap<>(); public static  T getValue(String key, Class type){ //todo check contains here, if map doesn't contains key, throw not found exception Object val = simpleCache.get(key); return (T)val; } } 

希望这可以帮助