是否有针对Java的开源堆外缓存解决方案?

Terracotta BigMemory有没有开源替代品?

实际上我甚至找不到任何商业选择。 我对纯Java解决方案很感兴趣,它可以在JVM中运行,而不需要任何JNI和C支持的解决方案。

有一个非常好的缓存解决方案,名为MapDB (以前是JDBM4)。 它支持HashMapTreeMap但它只是嵌入了应用程序。 它还支持基于持久文件的缓存。

关闭堆缓存的示例:

 DB db = DBMaker.newDirectMemoryDB().make(); ConcurrentNavigableMap map = db.getTreeMap("MyCache"); 

或基于持久文件的缓存:

 DB db = DBMaker.newFileDB(new File("/home/collection.db")).closeOnJvmShutdown().make(); ConcurrentNavigableMap map = db.getTreeMap("MyCache"); 

我自己一直在问这个问题,所以我只想用我的发现更新以前的答案。

我从quora找到了这个post,它也讨论了同样的问题:

http://www.quora.com/JVM/Whats-the-best-open-source-solution-for-java-off-heap-cache

除了directmemory(去年没有真正更新)之外,似乎更合适的不同解决方案是

  • MapDB – 这似乎是一个非常完整的解决方案,它可以做更多的堆外缓存并支持许多function
  • HugeCollections – 这似乎是比MapDB更复杂的应用程序,它专注于通过扩展ConcurrentMap和Map来分配堆外数据。 这个目标是针对Java 8的fork项目是Chronicle-Map。 一篇很好的文章是http://blog.shinetech.com/2014/08/26/using-hugecollections-to-manage-big-data/
  • SpyMemcached – 这是一个非常简单的单线程实现,在github上具有良好的声誉。
  • xmemcached – 这在github上也有一个公平的声誉,但似乎并没有被人们津津乐道。
  • 快速序列化 – 还专注于重新实现Java序列化,重点关注内存的堆外使用 – http://ruedigermoeller.github.io/fast-serialization/

但是,我还有兴趣找到一个足够大的应用程序,它使用以下三个中的任何一个:directmemory,SpyMemcached,xmemcached。 如果我找到一个,我会更新这个答案。

我正在开发一个更快的解决方案,但我不建议你使用它,因为它只是现阶段的概念certificate。

http://vanillajava.blogspot.com/2011/09/new-contributors-to-hugecollections.html

但是,如果您有特定要求,则可能更容易自己编码,使用直接ByteBuffers或内存映射文件。

例如

 // using native order speeds access for values longer than a byte. ByteBuffer bb = ByteBuffer.allocateDirect(1024*1024*1024).order(ByteOrder.nativeOrder()); // start at some location. bb.position(0); bb.put((byte) 1); bb.putInt(myInt); bb.putDouble(myDouble); // to read back. bb.position(0); byte b = bb.get(); int i = bb.getInt(); double d = bb.getDouble(); 

您可以对内存映射文件执行类似操作。 内存映射文件不计入直接内存限制,也不会耗尽交换空间。

你确定BigMemory不会为你做这个工作吗?

看起来apache有一个提案:

http://wiki.apache.org/incubator/DirectMemoryProposal

虽然它不是一个解决方案 ,但Keith Gregory已经写了一个如何使用ByteBuffers为您的用例提供指南。 请查看http://www.kdgregory.com/programming/java/ByteBuffer_JUG_Presentation.pdf获取概述,并访问http://www.kdgregory.com/index.php?page=java.byteBuffer了解详细信息。

这种java堆外缓存的实现使用直接内存,并在轻量级java库中提供良好的性能:

https://github.com/snazy/ohc

查看性能数字的基准测试部分。 它在Apache 2下获得许可。