Redis устаревает, какой старый клиент вы все еще используете?

Java Redis

Не завидуйте мандаринкам или бессмертным, а корректируйте строчку кода долго. Оригинал: Miss Sister Taste (идентификатор публичной учетной записи WeChat: xjjdog), добро пожаловать, пожалуйста, сохраните источник для перепечатки.

Несколько дней назад redis основатель Антирес объявил о своем личном блоге Redis закончит свою поездку!

Бог устал, Redis устарел, но Redis по-прежнему очень популярен.

Для Redis существует множество Java-клиентов, таких как jedis, redisson, lettuce и т. д.

Чем вы все пользуетесь?

Сегодня xjjdog провел небольшой опрос. Ниже приведены статистические данные. локальный файл://media/15940259145555/15940262979977.jpg

Видно, что джедаи занимают первое место с абсолютным преимуществом.

Ниже приведен краткий анализ.

jedis

localfile://media/15940259145555/15940301796032.jpg

Разница между jedis и redis всего 1 буква. Я обычно называю это комбинацией Redis и Java. Он имеет следующие особенности:

  • Очень легкий, лаконичный, очень легко модифицируется и интегрируется
  • Поддержка автономных, дозорных, кластерных и т. д., поддержка транзакций, конвейеров, скриптов lua и т. д. полное функционирование.
  • Не поддерживает разделение чтения-записи, нужно реализовать самостоятельно
  • При использовании модели BIO вызовы методов синхронны.
  • Экземпляр клиента jedis не является потокобезопасным и должен использовать пул соединений для использования
  • Поддержка пула соединений

Образцы кода.

Jedis jedis = null;
try {
  jedis = pool.getResource();
  /// ... do stuff here ... for example
  jedis.set("foo", "bar");
  String foobar = jedis.get("foo");
  jedis.zadd("sose", 0, "car"); jedis.zadd("sose", 0, "bike"); 
  Set<String> sose = jedis.zrange("sose", 0, -1);
} finally {
  // You have to close jedis object. If you don't close then
  // it doesn't release back to pool and you can't get a new
  // resource from pool.
  if (jedis != null) {
    jedis.close();
  }
}
/// ... when closing your application:
pool.close();

redisson

localfile://media/15940259145555/15940302787489.jpg

Обычно я называю его сыном Редиса. Поскольку это сын, некоторые функции не поддерживаются.

  • поставка分布式锁И другой пакет общих операций, а также распределенные и масштабируемые структуры данных Java, но не поддерживает некоторые основные функции собственного Redis.
  • Основанный на реализации Netty, он использует неблокирующий ввод-вывод и обладает высокой производительностью. Поддержка асинхронных запросов
  • Не поддерживает операции транзакций, вы можете использовать реализацию сценария Lua
  • Поддерживает разделение чтения-записи в режимах развертывания Master-Slave Reployment и кластера. На этой основе поддержка балансировки нагрузки на чтение операций
  • API является потокобезопасным, и одно соединение может выполнять несколько операций.
  • Он может быть интегрирован с весенним сеансом с общим сеансом
  • Поддержка пула соединений
  • Есть китайские документы О__О

Образцы кода.

// 1. Create config object
Config config = new Config();
config.useClusterServers()
       // use "rediss://" for SSL connection
      .addNodeAddress("redis://127.0.0.1:7181");

// or read config from file
config = Config.fromYAML(new File("config-file.yaml")); 

// 2. Create Redisson instance

// Sync and Async API
RedissonClient redisson = Redisson.create(config);

// RxJava2 API
RedissonRxClient redissonRx = Redisson.createRx(config);

// 3. Get Redis based Map
RMap<MyKey, MyValue> map = redisson.getMap("myMap");

RMapReactive<MyKey, MyValue> mapReactive = redissonReactive.getMap("myMap");

RMapRx<MyKey, MyValue> mapRx = redissonRx.getMap("myMap");

// 4. Get Redis based Lock
RLock lock = redisson.getLock("myLock");

RLockReactive lockReactive = redissonReactive.getLock("myLock");

RLockRx lockRx = redissonRx.getLock("myLock");

Lettuce

Значение салата должно быть тотемным, потому что я не могу придумать никакой связи с редисом. локальный файл://media/15940259145555/15940301291245.jpg

  • Уровень связи со событиями, основанный на каркасе Netty, вызовы методов также асинхронные
  • Нет необходимости учитывать пул потоков, высокую производительность, экологическое значение Spring по умолчанию.
  • API является потокобезопасным, и одно соединение может выполнять несколько операций.
  • Также поддерживает пул соединений

Кодовые случаи.

RedisClient client = RedisClient.create("redis://localhost");
StatefulRedisConnection<String, String> connection = client.connect();
RedisStringCommands sync = connection.sync();
String value = sync.get("key");

////////////////////
StatefulRedisConnection<String, String> connection = client.connect();
RedisStringAsyncCommands<String, String> async = connection.async();
RedisFuture<String> set = async.set("key", "value")
RedisFuture<String> get = async.get("key")

async.awaitAll(set, get) == true

set.get() == "OK"
get.get() == "value"

небольшой анализ

jedisОн поддерживает самые примитивные операции и может делать что угодно, но его семантика выражений ограничена, можно написать кучу гетсетов, но нужны комментарии, чтобы понять, что делает этот код. Но в то же время преимущество в том, что он обладает сильной пластичностью, и вы можете скрутить его в подходящую форму в соответствии с вашими потребностями. К тому же джедис все же БИО.Хотя БИО в целом медленный, сам редис очень быстрый и долго не заблокируется.В обычных проектах это не большая проблема.

redissonБыла выполнена более продвинутая инкапсуляция с одной функцией, но она позволяет пользователям больше сосредоточиться на бизнес-логике и инкапсулирует множество колес. Redisson не только предоставляет ряд распределенных общих объектов Java, которые можно в основном использовать с базовыми структурами данных Java, но также расширяет многие распределенные структуры данных, включая (BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue), Deque, BlockingDeque, Semaphore, Lock, AtomicLong, CountDownLatch, Publish/Subscribe, Bloom filter, Remote service, Spring cache, Executor service, Live Object service, Scheduler service). Он основан на Netty, поддерживает NIO и, естественно, быстрее. Я до сих пор знаю его по некоторым высокоуровневым API, которые он реализует, наиболее известным из которых является его распределенная блокировка, которую можно использовать как реентерабельную блокировку Java.

LettuceЭто означает салат, и это также базовая реализация Spring RedisTemplate по умолчанию. По сравнению с необходимостью jedis создавать физическое соединение для каждого экземпляра для обеспечения безопасности потоков, lettuce действительно хорош. Он имеет относительно высокую производительность и поддерживает асинхронность. Хотя производительность высока, модель программирования более сложная и менее интуитивная, и многим это не нравится.


В настоящее время большинство проектов по-прежнему используют jedis BIO, что не является проблемой. Jedis имеет полные функции, API относительно прост и легко настраивается, а производительность также может удовлетворить потребности. Что еще более важно, это предубеждение и стало стандартом для многих людей.

Если функция и производительность уже выполняли требования, какую причину заменить его новым? Это боль в заднице?

Меч позорный тяжело вложить в ножны, а меч гордый не возвращается на фронт? несуществующий.

Если слой инкапсуляции Spring защищает эти болезненные операции переключения, почему бы не перейти на более быстрый?

Об авторе:Мисс сестра вкус(xjjdog), публичная учетная запись, которая не позволяет программистам идти в обход. Сосредоточьтесь на инфраструктуре и Linux. Десять лет архитектуры, десятки миллиардов ежедневного трафика, обсуждение с вами мира высокой параллелизма, дающие вам другой вкус. Мой личный WeChat xjjdog0, добро пожаловать в друзья для дальнейшего общения.​