Не завидуйте мандаринкам или бессмертным, а корректируйте строчку кода долго. Оригинал: 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, добро пожаловать в друзья для дальнейшего общения.