Редиссон против джедаев за редис

Теперь я должен использовать Java-клиент для Redis. Я встречал джедаев и редиссонов.

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

Что является более эффективным с точки зрения скорости? Какие-нибудь критерии?

Кто из них способен обеспечить следующее?

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

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

PS: Пожалуйста, не отмечайте это как дубликат этого.

1 ответ

Решение

Этот вопрос основан на мнении, но давайте рассмотрим некоторые объективные моменты:

TL; DR:

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

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

объяснение

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

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

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

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

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

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

Jedis - это низкоуровневый драйвер, представляющий Redis API как вызовы методов 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.

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

прогноз

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

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

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

Другие вопросы по тегам