轻量级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下做的事情,正是你所需要的,而不是更多。 你似乎有一个很好的想法,你在找什么。
memcached有用于Java的客户端。 http://www.danga.com/memcached/要求单独的进程是一个caching服务器,但function强大的东西。;