【发布时间】:2011-10-09 19:15:35
【问题描述】:
Terracotta BigMemory 是否有任何开源替代方案?
实际上,我什至没有找到任何商业替代品。我对纯 Java 解决方案感兴趣,它可以在 JVM 中运行,无需任何 JNI 和 C 支持的解决方案。
【问题讨论】:
Terracotta BigMemory 是否有任何开源替代方案?
实际上,我什至没有找到任何商业替代品。我对纯 Java 解决方案感兴趣,它可以在 JVM 中运行,无需任何 JNI 和 C 支持的解决方案。
【问题讨论】:
此 Java 堆外缓存的实现使用直接内存并在轻量级 Java 库中提供良好的性能:
查看性能数据的基准测试部分。它在 Apache 2 下获得许可。
【讨论】:
有一个非常好的缓存解决方案,名为MapDB(以前是JDBM4)。它支持HashMap 和TreeMap 但它只是嵌入应用程序。它还支持基于持久文件的缓存。
堆外缓存示例:
DB db = DBMaker.newDirectMemoryDB().make();
ConcurrentNavigableMap<Integer, String> map = db.getTreeMap("MyCache");
或基于持久文件的缓存:
DB db = DBMaker.newFileDB(new File("/home/collection.db")).closeOnJvmShutdown().make();
ConcurrentNavigableMap<Integer,String> map = db.getTreeMap("MyCache");
【讨论】:
【讨论】:
我自己也有这个问题,所以我将用我的发现更新以前的答案。
我在 quora 上找到了这个帖子,它也谈到了同样的问题:
http://www.quora.com/JVM/Whats-the-best-open-source-solution-for-java-off-heap-cache
除了directmemory(去年还没有真正更新)之外,似乎很合适的不同解决方案是
但是,我还有兴趣找到一个足够大的应用程序,它使用以下三种中的任何一种:directmemory、SpyMemcached、xmemcached。如果我找到一个,我会更新这个答案。
【讨论】:
我正在开发一个更快的解决方案,但我不建议您立即使用它,因为它只是现阶段的概念证明。
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 不会为您完成这项工作吗?
【讨论】:
【讨论】:
虽然它不是一个解决方案,但 Keith Gregory 已经撰写了关于如何将 ByteBuffers 用于您的用例的指南。请查看http://www.kdgregory.com/programming/java/ByteBuffer_JUG_Presentation.pdf 以获取概述,查看http://www.kdgregory.com/index.php?page=java.byteBuffer 以获取详细信息。
【讨论】: