Есть ли решение для кеша с открытым исходным кодом для Java?
Есть ли альтернатива Open Source для Terracotta BigMemory?
На самом деле мне даже не удалось найти какую-либо коммерческую альтернативу. Меня интересует чистое решение Java, которое будет работать внутри JVM без каких-либо решений JNI и C-backed.
Ответы
Ответ 1
Существует очень хорошее решение для кеша 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");
Ответ 2
Я разрабатываю решение намного быстрее, но я бы не предлагал вам использовать его только пока, поскольку это просто доказательство концепции на этом этапе.
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 не будет работать для вас?
Ответ 3
Похоже, есть предложение на apache:
http://wiki.apache.org/incubator/DirectMemoryProposal
Ответ 4
У меня сам был этот вопрос, поэтому я собираюсь обновить предыдущие ответы своими выводами.
Я нашел эту тему от 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 Serialization с акцентом на использование памяти без использования памяти - http://ruedigermoeller.github.io/fast-serialization/
Однако мне было бы интересно также найти достаточно большое приложение, которое использует любой из этих трех: directmemory, SpyMemcached, xmemcached. Должен ли я найти его, я обновлю этот ответ.
Ответ 5
https://github.com/raffaeleguidi/DirectMemory
Ответ 6
Хотя это не решение, руководство по использованию ByteBuffers для вашего случая использования написано Китом Грегори. Посмотрите http://www.kdgregory.com/programming/java/ByteBuffer_JUG_Presentation.pdf для обзора и http://www.kdgregory.com/index.php?page=java.byteBuffer для подробных подробностей.
Ответ 7
Эта реализация кеша java off-heap использует прямую память и обеспечивает хорошую производительность в легкой Java-библиотеке:
https://github.com/snazy/ohc
Взгляните на раздел бенчмаркинга для номеров производительности. Он лицензирован под Apache 2.