轻量级Java对象cachingAPI

我正在寻找一个Java内存中的对象cachingAPI。 任何build议? 你以前用过什么解决scheme?

当前

现在,我只是使用一个地图:

Map cache = new HashMap<String, Object>(); cache.put("key", value); 

要求

我需要扩展caching以包含如下基本function:

  • 最大尺寸
  • 时间生活

不过,我不需要更复杂的function,如:

  • 从多个进程(caching服务器)
  • 持久性(到磁盘)

build议

内存中caching:

  • 番石榴 CacheBuilder – 积极发展。 看这个演示文稿 。
  • LRUMap – 通过APIconfiguration。 没有TTL。 不是为caching而构build的。
  • whirlycache – XMLconfiguration。 邮件列表。 最后更新2006年。
  • cache4j – XMLconfiguration。 俄文文档。 最后更新2006年。

企业caching:

  • JCS – 属性configuration。 广泛的文档。
  • Ehcache – XMLconfiguration。 广泛的文档。 到目前为止,根据谷歌命中最stream行。

EHCache非常好。 您可以创build一个内存caching。 查看他们的代码示例,了解如何创build内存caching。 你可以指定一个最大尺寸和一个生存时间。

EHCache确实提供了一些高级function,但如果您对使用它们不感兴趣 – 不要。 但是,如果您的要求发生变化,那么知道他们在那里真是太好了。

这是一个内存caching。 在代码中创build,没有configuration文件。

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

创build一个容纳200个元素的caching,并且具有24小时的ttl。

我非常喜欢Google Collections ( API )附带的MapMaker

JavaDoc有一个非常简洁的例子,展示了它的易用性和强大function:

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

此外, Guava 10.0发布了更广泛的com.google.common.cache软件包 。

你也可以看看我的小caching库叫做KittyCache:

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

有一些性能基准vs ehcache。

它在SimpleJPA项目中用作二级caching。

番石榴的MapMaker已经被他们的CacheBuilder类所取代。

你可以检查出LinkedHashMap来实现一个没有第三方jar的简单caching:

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

那么你可以像从caching中获取

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

rest留下作为练习为读者:)

JCS被尝试和真实。 尽pipe就caching机制而言它是轻量级的,但是你可能会深入到实际的代码中,并且模仿他们在HiddenMap下做的事情,正是你所需要的,而不是更多。 你似乎有一个很好的想法,你在找什么。