简单的Java缓存库或设计模式?

时间:2012-10-31 13:05:28

标签: java design-patterns caching memcached ehcache

我需要经常访问耗时计算的结果。结果不经常更改,因此我不得不不时重新计算数据,但可以暂时使用过时的结果。最简单的方法是什么?现有的库方法或设计模式是什么?

我在想像

这样的东西
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

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

5 个答案:

答案 0 :(得分:14)

恭喜您意识到编写自己的内容最初会出现问题!

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

  

所有Guava缓存,无论是否加载,都支持get方法(K,   可调用< V&GT)。此方法返回与键关联的值   缓存,或者从指定的Callable计算它并将其添加到   缓存。没有修改与此高速缓存关联的可观察状态   直到加载完成。这种方法提供了简单的替代品   传统的“如果缓存,返回;否则创建,缓存和   返回“模式。

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:2)

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

并编写方法将值添加到cache,get,remove。

public SimpleCache{
    private static Map<String,Object> simpleCache = new HashMap<>();

    public static <T> 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;    
  }
}

希望这会有所帮助

答案 4 :(得分:0)

您可以尝试SimplCache,它接受​​Cache DB和持久性DB的实现,从而为Cache系统提供简单的实现。