Есть ли встраиваемая Java-альтернатива Redis?
Согласно этой теме, Jedis - лучшее, что можно использовать, если я хочу использовать Redis из Java.
Однако мне было интересно, есть ли какие-либо библиотеки/пакеты, обеспечивающие аналогичные эффективные операции с наборами, которые уже существуют в Redis, но могут быть непосредственно встроены в приложение Java без необходимости устанавливать отдельные серверы. (то есть, используя Jetty для веб-сервера).
Чтобы быть более точным, я хотел бы иметь возможность сделать следующее эффективно:
- Существует большой набор пользователей M (M не известен заранее).
- Существует большой набор из N элементов.
- Мы хотим, чтобы пользователи просматривали элементы, один пользователь/элемент за раз, который создает сохраненный результат (в обычной базе данных.)
- Каждый раз, когда пользователь приходит, мы хотим назначить этому пользователю элемент с наименьшим количеством существующих результатов, которые пользователь еще не видел раньше. Это дает приблизительное округленное распределение элементов по всем прибывающим пользователям, когда мы просто заботимся о том, чтобы все предметы просматривались примерно столько же раз.
Вышеприведенное происходит параллельно. Когда M и N являются большими, Redis выполняет вышеупомянутое гораздо более эффективно, чем SQL-запросы. Есть ли способ сделать это, используя вложенную библиотеку Java, которая немного легче, чем запуск сервера Redis?
Я понимаю, что можно написать кучу кода, используя библиотеки Java concurrency, которые примерно приблизили бы это (и в некоторой степени, я это сделал), но это не совсем то, что я ищу здесь.
Ответы
Ответ 1
Посмотрите проект voldemort. Это распределенное хранилище ключей, созданное Linked-In, и оно поддерживает возможность встраивания.
В кратком руководстве по началу работы приведен небольшой пример запуска сервера, встроенного в автономный режим.
VoldemortConfig config = VoldemortConfig.loadFromEnvironmentVariable();
VoldemortServer server = new VoldemortServer(config);
server.start();
Я мало знаю о Redis, поэтому я не могу сравнить их функцию с функцией. В проекте мы использовали Волдеморт, мы использовали его для чтения в резервном хранилище с отличными результатами. Это позволило нам "предварительно скомпилировать" базу данных на двухдневной основе в нашем вычислительном центре обработки данных и "отправить ее" в пограничные центры обработки данных. Таким образом, каждый краевой центр обработки данных имел локальную копию этого набора данных.
EDIT: перечитав ваш вопрос, я хотел добавить Таблица Gauva - Эта таблица DataStructure может также быть чем-то, что вы ищете и является simlar к тому, что вы получаете со многими базами данных no-sql.
Ответ 2
Hazelcast предоставляет ряд реализаций распределенной структуры данных, которые могут использоваться как чистая Java-альтернатива сервисам Redis. Затем вы можете отправить отдельную "банку" со всеми необходимыми зависимостями для запуска вашего приложения. Возможно, вам придется настроить несколько отличающихся примитивов относительно Redis в своем приложении.
Коммерческие решения в этом пространстве включают Teracotta Enterprise Ehcache и Oracle Coherence.
Ответ 3
Взгляните на lmdb (база данных Lightning Memory), потому что мне нужно точно то же самое. Я развертываю приложение dropwizard в контейнер, и добавление redis или другая внешняя зависимость болезненна. Это, кажется, хорошо работает, имеет хорошую активность. fyi, хотя, я еще не использовал это в производстве.
https://github.com/lmdbjava/lmdbjava
Ответ 4
Google Guava Library предоставляет дружественные версии того же (и более) набора операторов, которые предоставляет redis.
https://code.google.com/p/guava-libraries/wiki/CollectionUtilitiesExplained
например.
Guava Redis
Sets.intersection(a,b) sinter a b
a.count() scard a
Sets.difference(a,b) sdiff a b
Sets.union(a,b) sunion a b
Multisets - достаточно простой прокси для отсортированных наборов redis.