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

Редиссон против Джедис для redis

Теперь мне нужно использовать java-клиент для redis. Я встретил Jedis и Redisson.

РЕДАКТИРОВАТЬ: переосмысление, поскольку вопрос был скорее основан на мнениях.

Что более эффективно с точки зрения скорости? Любые тесты?

Кто из них может предоставить следующее?

  • Распределенные блокировки (и обновление некоторых ключей на карте)

  • Уведомление об истечении срока действия автоматического ключа, но я хочу, чтобы это было получено только одним конкретным абонентом из группы абонентов (аналогично концепции группы потребителей в Apache Kafka). Как это может быть достигнуто?

PS: Не указывайте его как дубликат этого.

4b9b3361

Ответ 1

Этот вопрос основан на мнениях, но позволяет получить в нем объективные моменты:

TL; DR:

Выбор драйвера зависит от нескольких вещей:

  • Дополнительные зависимости
  • Модель программирования
  • Масштабируемость
  • Будучи самоуверенным в отношении реализации функций высокого уровня
  • Перспектива вашего проекта, направление, в котором вы хотите эволюционировать

Объяснение

Дополнительные зависимости

Некоторые проекты высказываются в отношении дополнительных зависимостей и переходных зависимостей при добавлении библиотеки.

Jedis почти без зависимостей, для пула соединений требуется Apache Commons Pool 2.

Redisson требует Netty, API JCache и Project Reactor в качестве основных зависимостей. Он расширяемый, поскольку он интегрируется с множеством других библиотек (хранилище сеансов Tomcat).

Модель программирования

Как вы взаимодействуете с клиентом Redis. Он также определяет уровень абстракции.

Jedis - это низкоуровневый драйвер, отображающий API Redis как вызовы методов Java:

Jedis jedis = …;

jedis.set("key", "value");

List<String> values = jedis.mget("key", "key2", "key3");

Redisson - это клиент высокого уровня, который предоставляет свои функции через различные объекты API:

Redisson redisson = …

RMap map = redisson.getMap("my-map"); // implement java.util.Map

map.put("key", "value");

map.containsKey("key");

map.get("key");

Каждый вызов вызывает один или несколько вызовов Redis, некоторые из них реализованы с помощью Lua (Redis "Scripting" ).

Масштабируемость

В Java есть несколько драйверов, которые поставляются с различными свойствами, которые могут соответствовать вашему проекту. Масштабируемость играет и в этом. Глядя на водителей, это сводится к тому, как драйверы работают со своими ресурсами и какие модели программирования они поддерживают.

Jedis использует блокировку ввода-вывода, а вызовы методов синхронны. Ваш программный поток необходим, чтобы ждать, пока с помощью сокетов будут выполняться операции ввода-вывода. Там нет асинхронных (Future, CompletableFuture) или реактивной поддержки (RxJava Observable или реактивных потоков Publisher).

Экземпляры клиента Jedis не являются потокобезопасными, поэтому им требуется объединение пулов (Jedis-экземпляр для каждого потока вызовов).

Redisson использует неблокирующий ввод-вывод и связанный с событиями уровень связи с netty. Вызов метода синхронный, асинхронный или реактивный (через Project Reactor 2.0 или 3.1). Соединения объединены, но сам API является потокобезопасным и требует меньше ресурсов. Я не совсем уверен, но, возможно, вы даже можете работать с одним соединением. Это самый эффективный способ работы с Redis.

Мнение о реализации клиента

В этих параграфах рассматриваются способы реализации клиентов.

Оба клиента имеют отличное покрытие функций, и вы можете выполнять свои требования в обеих библиотеках.

Jedis - это простая реализация, которая просто записывает команды в OutputStream и анализирует ответы. Не более того.

Если вам нужны высокоуровневые функции, вам необходимо реализовать их с помощью Redis API. Он дает вам полный контроль над командами, которые вы вызываете, и результатом. Реализация ваших функций может потребовать дополнительных усилий.

Redisson - это клиент высокого уровня, который предоставляет функции через свои абстракции. Хотя вы можете использовать эти объекты, не зная, что они поддерживаются Redis (Map, List, Set,...), каждый вызов API переводит на один или несколько вызовов Redis, некоторые - на выполнение Lua script.

Вам может понравиться или не нравится то, как ведет себя Редиссон и как он реализует функции, но в конце концов, вы не можете с этим поделать. Использование функций Redissons на высоком уровне может снизить ваши усилия по внедрению.

Outlook

Этот раздел полностью зависит от того, куда вы направляетесь. Jedis поддерживает все команды API Redis, Redis Standalone, Redis Sentinel и Redis Cluster. Нет никаких ведомых чтений в установках master-slave, но я предполагаю, что только вопрос времени, пока jedis не предоставит эти функции.

С помощью jedis вы не можете переходить на асинхронный режим и использовать расширенные функции AWS ElastiCache или чтение ведомых устройств требует вашей собственной реализации.

Redisson имеет широкий спектр различных настроек. Он поддерживает все функции, поддерживаемые Jedis, и предоставляет стратегии чтения для настроек Master/Slave, улучшенная поддержка AWS ElastiCache.