Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有针对Java的开源堆外缓存解决方案?_Java_Caching_Memory - Fatal编程技术网

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

是否有针对Java的开源堆外缓存解决方案?,java,caching,memory,Java,Caching,Memory,Terracotta BigMemory有开源的替代方案吗 事实上,我甚至没有找到任何商业替代品。我对纯Java解决方案感兴趣,它可以在JVM内部工作,而不需要任何JNI和C支持的解决方案。看起来apache有一个提议: 我正在开发一种更快的解决方案,但我不建议您现在就使用它,因为它只是现阶段的概念证明 但是,如果您有特定的需求,那么自己编写代码、使用直接字节缓冲区或内存映射文件可能会更容易 e、 g 对于内存映射文件,也可以执行类似的操作。内存映射文件不会计入直接内存限制,也不会占用交换空间

Terracotta BigMemory有开源的替代方案吗


事实上,我甚至没有找到任何商业替代品。我对纯Java解决方案感兴趣,它可以在JVM内部工作,而不需要任何JNI和C支持的解决方案。

看起来apache有一个提议:


我正在开发一种更快的解决方案,但我不建议您现在就使用它,因为它只是现阶段的概念证明

但是,如果您有特定的需求,那么自己编写代码、使用直接字节缓冲区或内存映射文件可能会更容易

e、 g

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


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

尽管它不是一个解决方案,但Keith Gregory已经为你的用例编写了一本关于如何使用ByteBuffers的指南。请看一看,了解概述和基本细节。

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

堆外缓存示例:

DB db = DBMaker.newDirectMemoryDB().make();
ConcurrentNavigableMap<Integer, String> map = db.getTreeMap("MyCache");
DB DB=DBMaker.newDirectMemoryDB().make();
ConcurrentNavigableMap=db.getTreeMap(“MyCache”);
或基于文件的持久缓存:

DB db = DBMaker.newFileDB(new File("/home/collection.db")).closeOnJvmShutdown().make();
ConcurrentNavigableMap<Integer,String> map = db.getTreeMap("MyCache");
DB DB=DBMaker.newFileDB(新文件(“/home/collection.DB”)).closeOnJvmShutdown().make();
ConcurrentNavigableMap=db.getTreeMap(“MyCache”);

我自己也有这个问题,所以我要用我的发现更新之前的答案

我在quora找到了这条线,它也谈到了同样的问题:

除了directmemory(去年没有真正更新过)之外,另一种似乎很适合的解决方案是

  • MapDB—这似乎是一个非常完整的解决方案,它比堆外缓存做得更多,并且支持很多功能
  • HugeCollections——这似乎比MapDB要简单得多,后者通过扩展ConcurrentMap和Map来分配堆外数据。其中一个以Java8为目标的fork项目是编年史地图。一篇关于这方面的好文章是
  • 这是一个非常简单的单线程实现,在github上享有良好声誉
  • xmemcached——这在github上也有着良好的声誉,但它似乎并没有得到太多的讨论
  • 快速序列化-还关注于重新实现Java序列化,重点是内存的堆外使用-

然而,我更感兴趣的是找到一个足够大的应用程序,可以使用这三种应用程序中的任何一种:directmemory、SpymeCached和xmemcached。如果我找到了,我将更新此答案。

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


查看基准测试部分,了解性能数据。它是根据Apache2授权的。

我想要一个免费的工具,这样BigMemory就不会出现问题。我自己编写代码并不容易,因为我需要从缓存中添加和删除数据,所以我必须在分配的缓冲区中编写一些类似于GC的复杂逻辑。快速向前6年,这个项目现在被称为@peter lawrey可以解决类似的问题:这个建议已经被接受。DirectMemory位于上。该项目的使用寿命不长,现在已退役。这与另一个答案相同,DirectMemory现在位于上。@javanna该项目现在退役:它是磁盘备份的解决方案。这并不是我想问的。值得一提的是,MapDB是在Kotlin中开发的,并且将对其运行时产生依赖。
DB db = DBMaker.newFileDB(new File("/home/collection.db")).closeOnJvmShutdown().make();
ConcurrentNavigableMap<Integer,String> map = db.getTreeMap("MyCache");