轻量级Java对象缓存API

Cha*_*ert 96 java caching

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

当前

现在,我只是使用地图:

Map cache = new HashMap<String, Object>();
cache.put("key", value);
Run Code Online (Sandbox Code Playgroud)

要求

我需要扩展缓存以包括以下基本功能:

  • 最大尺寸
  • 生存的时间

但是,我不需要更复杂的功能,如:

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

建议

内存缓存:

  • Guava CacheBuilder - 积极开发.见这个演讲.
  • LRUMap - 通过API配置.没有TTL.不是专为缓存而构建的.
  • whirlycache - XML配置.邮件列表.上次更新2006.
  • cache4j - XML配置.俄文文件.上次更新2006.

企业缓存:

  • JCS - 属性配置.丰富的文档.
  • Ehcache - XML配置.丰富的文档.到目前为止谷歌最热门的点击率.

Ste*_*e K 55

EHCache非常好.您可以创建内存缓存.查看他们的代码示例,了解创建内存缓存的示例.您可以指定最大尺寸和生存时间.

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

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

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

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

  • EHCache是​​仅引用该对象还是序列化然后反序列化该对象? (2认同)
  • EHCache是​​重量级的解决方案吗?我们正在研究现有的缓存解决方案,以在Android上实现API缓存. (2认同)
  • 这对Android来说太沉重了.我正在使用Kitty缓存,它非常完美! (2认同)

Joa*_*uer 45

我非常喜欢Google Guava(API)MapMaker附带的内容

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);
         }
       });
Run Code Online (Sandbox Code Playgroud)

此外,番石榴10.0版本引入了更广泛的com.google.common.cache.

  • 哦,太棒了. (4认同)

Tra*_*der 10

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

https://github.com/treeder/kitty-cache

与ehcache有一些性能基准.

它在SimpleJPA项目中用作二级缓存.


Boh*_*ian 9

Guava的MapMaker已被其CacheBuilder类所取代.


Jee*_*Bee 8

您可以查看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;
        }
    };
Run Code Online (Sandbox Code Playgroud)

然后你就可以从缓存中获得

    Foo foo = cache.get(key);
    if (foo == null && !cache.containsKey(key)) {
        try {
            FooDAO fooDAO = DAOFactory.getFooDAO(conn);
            foo = fooDAO.getFooByKey(key);
            cache.put(key, foo);
        } catch (SQLException sqle) {
            logger.error("[getFoo] SQL Exception when accessing Foo", sqle);
        }
    }
Run Code Online (Sandbox Code Playgroud)

休息时留给读者锻炼:)

  • 我认为这种方法不具备TTL容量.不过,这将是一个很好的开始. (2认同)

Ich*_*rus 5

JCS是经过验证的.尽管就缓存机制而言很轻松,但您可能会深入了解实际代码并模仿他们使用HashMap做的事情,以确切地了解您的需求而不是更多.你似乎很清楚你在寻找什么.