Существует ли решение для кэша вне кучи с открытым исходным кодом для Java? - PullRequest
25 голосов
/ 09 октября 2011

Есть ли альтернатива с открытым исходным кодом для Terracotta BigMemory?

На самом деле мне даже не удалось найти какую-либо коммерческую альтернативу.Я заинтересован в чистом Java-решении, которое будет работать внутри JVM без каких-либо решений на основе JNI и C.

Ответы [ 7 ]

19 голосов
/ 13 ноября 2012

Существует очень хорошее решение для кэширования, которое называется 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");
11 голосов
/ 17 сентября 2014

У меня был этот вопрос, поэтому я собираюсь обновить предыдущие ответы своими результатами.

Я нашел эту ветку от 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. Если я найду один, я обновлю этот ответ.

9 голосов
/ 10 октября 2011

Я разрабатываю решение, которое будет намного быстрее, но я бы не советовал вам его использовать, поскольку это просто доказательство концепции на данном этапе.

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

Однако, если у вас есть конкретное требование, может быть проще написать его самостоятельно, использовать прямые байтовые буферы или файлы с отображением в памяти.

например,

// 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 не выполнит эту работу за вас?

8 голосов
/ 10 октября 2011

Похоже, на apache есть предложение:

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

5 голосов
/ 10 октября 2011
4 голосов
/ 09 ноября 2011

Хотя это не решение , руководство по использованию ByteBuffers для вашего варианта использования было написано Китом Грегори.Взгляните на http://www.kdgregory.com/programming/java/ByteBuffer_JUG_Presentation.pdf для обзора и http://www.kdgregory.com/index.php?page=java.byteBuffer для мельчайших деталей.

3 голосов
/ 12 декабря 2015

Эта реализация кэша вне кучи Java использует прямую память и обеспечивает хорошую производительность в облегченной библиотеке Java:

https://github.com/snazy/ohc

Посмотрите в разделе сравнительного анализа цифры производительности. Он лицензирован под Apache 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...