Is there a open-source off-heap cache solution for Java?
Terracotta BigMemory 是否有任何开源替代方案?
实际上,我什至没有设法找到任何商业替代品。我对纯 Java 解决方案感兴趣,它可以在 JVM 中运行,无需任何 JNI 和 C 支持的解决方案。
有一个非常好的缓存解决方案,叫做 MapDB(以前的 JDBM4)。它支持
堆外缓存示例:
1 2 | DB db = DBMaker.newDirectMemoryDB().make(); ConcurrentNavigableMap<Integer, String> map = db.getTreeMap("MyCache"); |
或基于持久文件的缓存:
1 2 |
我自己一直有这个问题,所以我将用我的发现更新以前的答案。
我从 quora 找到了这个帖子,它也谈到了同样的问题:
http://www.quora.com/JVM/Whats-the-best-open-source-solution-for-java-off-heap-cache
除了directmemory(去年还没有真正更新)之外,似乎很合适的不同解决方案是
- MapDB - 这似乎是一个非常完整的解决方案,它比堆外缓存做得更多,并且支持很多特性
-
HugeCollections - 这似乎是一个比 MapDB 简单得多的应用程序,它专注于通过扩展 ConcurrentMap 和 Map 来分配堆外数据。一个针对 Java 8 的分支项目是 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。如果我找到一个,我会更新这个答案。
我正在开发一个更快的解决方案,但我不建议您立即使用它,因为它只是现阶段的概念证明。
http://vanillajava.blogspot.com/2011/09/new-contributors-to-hugecollections.html
但是,如果您有特定要求,自己编写代码,使用直接 ByteBuffers 或内存映射文件可能会更容易。
例如
1 2 3 4 5 6 7 8 9 10 11 12 13 | // 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
https://github.com/raffaeleguidi/DirectMemory
虽然这不是一个解决方案,但 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 下获得许可。