Подтвердить что ты не робот

Есть ли встраиваемая Java-альтернатива Redis?

Согласно этой теме, Jedis - лучшее, что можно использовать, если я хочу использовать Redis из Java.

Однако мне было интересно, есть ли какие-либо библиотеки/пакеты, обеспечивающие аналогичные эффективные операции с наборами, которые уже существуют в Redis, но могут быть непосредственно встроены в приложение Java без необходимости устанавливать отдельные серверы. (то есть, используя Jetty для веб-сервера).

Чтобы быть более точным, я хотел бы иметь возможность сделать следующее эффективно:

  • Существует большой набор пользователей M (M не известен заранее).
  • Существует большой набор из N элементов.
  • Мы хотим, чтобы пользователи просматривали элементы, один пользователь/элемент за раз, который создает сохраненный результат (в обычной базе данных.)
  • Каждый раз, когда пользователь приходит, мы хотим назначить этому пользователю элемент с наименьшим количеством существующих результатов, которые пользователь еще не видел раньше. Это дает приблизительное округленное распределение элементов по всем прибывающим пользователям, когда мы просто заботимся о том, чтобы все предметы просматривались примерно столько же раз.

Вышеприведенное происходит параллельно. Когда M и N являются большими, Redis выполняет вышеупомянутое гораздо более эффективно, чем SQL-запросы. Есть ли способ сделать это, используя вложенную библиотеку Java, которая немного легче, чем запуск сервера Redis?

Я понимаю, что можно написать кучу кода, используя библиотеки Java concurrency, которые примерно приблизили бы это (и в некоторой степени, я это сделал), но это не совсем то, что я ищу здесь.

4b9b3361

Ответ 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.