轻量级Java对象缓存API 问题:

轻量级Java对象缓存API 问题:,java,caching,Java,Caching,我正在寻找一个Java内存中对象缓存API。有什么建议吗?您过去使用过哪些解决方案 现在的 现在,我只是在用地图: Map cache = new HashMap<String, Object>(); cache.put("key", value); Map cache=newhashmap(); cache.put(“key”,value); 要求 我需要扩展缓存以包括以下基本功能: 最大尺寸 活下去的时间 但是,我不需要更复杂的功能,如: 从多个进程访问(缓存服务器)

我正在寻找一个Java内存中对象缓存API。有什么建议吗?您过去使用过哪些解决方案

现在的 现在,我只是在用地图:

Map cache = new HashMap<String, Object>();
cache.put("key", value);
Map cache=newhashmap();
cache.put(“key”,value);
要求 我需要扩展缓存以包括以下基本功能:

  • 最大尺寸
  • 活下去的时间
但是,我不需要更复杂的功能,如:

  • 从多个进程访问(缓存服务器)
  • 持久性(到磁盘)
建议 内存缓存:

  • CacheBuilder-主动开发。看这个
  • -通过API进行配置。没有TTL。不是专门为缓存而构建的
  • -XML-config。邮件列表。上次更新日期为2006年
  • -XML-config。俄文文件。上次更新日期为2006年
企业缓存:

  • -属性配置。大量的文件
  • -XML-config。大量的文件。根据谷歌的点击量,目前为止最受欢迎的
    • 非常好。您可以创建内存缓存。查看他们的应用程序,以获取创建内存缓存的示例。您可以指定最大大小和生存时间

      EHCache确实提供了一些高级功能,但如果您对使用它们不感兴趣,请不要这样做。但如果你的需求发生变化,知道他们在那里是很好的

      这是一个内存缓存。在代码中创建,没有配置文件

      CacheManager cacheManager = CacheManager.getInstance();
      int oneDay = 24 * 60 * 60;
      Cache memoryOnlyCache = new Cache("name", 200, false, false, oneDay, oneDay);
      cacheManager.addCache(memoryOnlyCache);
      

      创建一个可容纳200个元素的高速缓存,其ttl为24小时。

      已尝试且为真。尽管缓存机制很简单,但您可能会深入实际代码,并在封面下模仿它们对HashMap所做的操作,以完全满足您的需要。你似乎很清楚自己在找什么

      您可以签出LinkedHashMap来实现一个没有第三方JAR的简单缓存:

          Map <String, Foo> cache = new LinkedHashMap<String, Foo>(MAX_ENTRIES + 1, .75F, true) {
      
              public boolean removeEldestEntry(Map.Entry<String, Foo> eldest) {
                  return size() > MAX_ENTRIES;
              }
          };
      

      作为练习留给读者:)

      您也可以在以下位置查看我的名为KittyCache的小型缓存库:

      与ehcache相比,有一些性能基准

      它在项目中用作二级缓存。

      我非常喜欢()

      JavaDoc有一个非常简洁的示例,演示了它的易用性和强大功能:

      ConcurrentMap<Key, Graph> graphs = new MapMaker()
         .concurrencyLevel(32)
         .softKeys()
         .weakValues()
         .expiration(30, TimeUnit.MINUTES)
         .makeComputingMap(
             new Function<Key, Graph>() {
               public Graph apply(Key key) {
                 return createExpensiveGraph(key);
               }
             });
      
      ConcurrentMap graphs=newmapmaker()
      .1级(32)
      .软键()
      .weakValues()
      .有效期(30,时间单位:分钟)
      .makeComputingMap(
      新函数(){
      公共图形应用(密钥){
      返回createExpensiveGraph(键);
      }
      });
      

      此外,Guava的10.0版引入了更广泛的客户端(有一个)。缓存服务器需要单独的进程,但功能强大。

      Guava的已被其类取代。

      我认为此方法没有TTL容量。不过,这将是一个很好的开始。是的,我将把TTL的内容作为读者练习的一部分:p-当然,第三方LIB的测试将远远超过您自己的。我想您的意思是,缓存机制还不够简单?不过,它似乎是最流行的企业解决方案之一。EHCache是只引用对象,还是序列化然后反序列化对象?EHCache是重量级解决方案吗?我们正在研究现有的缓存解决方案,以便在Android上实现API缓存。这对Android来说太重了。我正在使用Kitty cache,它太完美了@Stevet K,我很晚才知道这个缓存技术,但我想getInstance()已经被删除或更改了。很好,但如果它有TTL的话。谢谢!只是在我想检查是否有人已经开源之前输入的代码:)@RosdiKasim它确实有TTL-actual-on-put()调用,例如:cache.put(“mykey”,value,500);500是TTL。@TravisR嗯…,当时没有TTL…:pAhh,我不知道那个评论是多久以前的事了。你能编辑内存缓存部分的建议,将番石榴缓存包括在内吗?我一直在寻找一个像你一样的轻量级缓存机制,发现了这个问题,但没有找到Guava,因为它已经过时了。现在我使用了番石榴缓存包,这真是太棒了。完成:-)很高兴你喜欢它!也许你也想考虑添加相对较新的。在他们的网站上,据说它的性能比ehcache和番石榴好得多。请尝试
      @Cacheable
      发件人:@mxtie:谢谢,我已经添加了链接,请随意建议编辑类似的内容。
      ConcurrentMap<Key, Graph> graphs = new MapMaker()
         .concurrencyLevel(32)
         .softKeys()
         .weakValues()
         .expiration(30, TimeUnit.MINUTES)
         .makeComputingMap(
             new Function<Key, Graph>() {
               public Graph apply(Key key) {
                 return createExpensiveGraph(key);
               }
             });