【问题标题】:Simple Java caching library or design pattern? [closed]简单的 Java 缓存库或设计模式? [关闭]
【发布时间】:2012-10-20 22:52:39
【问题描述】:

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

我正在考虑类似的事情

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

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

【问题讨论】:

    标签: java design-patterns caching memcached ehcache


    【解决方案1】:

    你可以试试SimplCache,它接受缓存数据库和持久数据库的实现,为缓存系统提供一个简单的实现。

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      恭喜您意识到编写自己的代码可能会更麻烦!

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

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

      【讨论】:

        【解决方案4】:

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

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

        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;    
          }
        }
        

        希望对你有帮助

        【讨论】:

        • 驱逐在哪里?这个缓存会不断增长,直到出现 OutOfMemoryError?
        【解决方案5】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-10-09
          • 2016-04-14
          • 1970-01-01
          • 1970-01-01
          • 2010-09-13
          • 1970-01-01
          相关资源
          最近更新 更多