Redis 客戶端 Jedis、lettuce 和 Redisson 對比
點擊上方藍色字體,選擇“標星公眾號”
優(yōu)質文章,第一時間送達
? 作者?|??程序員自由之路
來源 |? urlify.cn/YVvaUb
Redis 支持多種語言的客戶端,下面列舉了部分 Redis 支持的客戶端語言,大家可以通過官網(wǎng)查看 Redis 支持的客戶端詳情。
C語言
C++
C#
Java
Python
Node.js
PHP
Redis 是用單線程來處理多個客戶端的訪問,因此作為 Redis 的開發(fā)和運維人員需要了解 Redis 服務端和客戶端的通信協(xié)議,以及主流編程語言的 Redis 客戶端使用方法,同時還需要了解客戶端管理的相應 API 以及開發(fā)運維中可能遇到的問題。
Redis 客戶端通信協(xié)議
Redis制定了RESP(Redis Serialization Protocol,Redis序列化協(xié)議)實現(xiàn)客戶端與服務端的正常交互,這種協(xié)議簡單高效,既能夠被機器解析,又容易被人類識別。
RESP可以序列化不同的數(shù)據(jù)類型,如整型、字符串、數(shù)組還有一種特殊的Error類型。需要執(zhí)行的Redis命令會封裝為類似于字符串數(shù)組的請求然后通過Redis客戶端發(fā)送到Redis服務端。Redis服務端會基于特定的命令類型選擇對應的一種數(shù)據(jù)類型進行回復。
1. RESP 發(fā)送命令格式
在RESP中,發(fā)送的數(shù)據(jù)類型取決于數(shù)據(jù)報的第一個字節(jié):
單行字符串的第一個字節(jié)為
+。錯誤消息的第一個字節(jié)為
-。整型數(shù)字的第一個字節(jié)為
:。定長字符串的第一個字節(jié)為
$。RESP數(shù)組的第一個字節(jié)為*。
| 數(shù)據(jù)類型 | 本文翻譯名稱 | 基本特征 | 例子 |
|---|---|---|---|
Simple String | 單行字符串 | 第一個字節(jié)是+,最后兩個字節(jié)是\r\n,其他字節(jié)是字符串內容 | +OK\r\n |
Error | 錯誤消息 | 第一個字節(jié)是-,最后兩個字節(jié)是\r\n,其他字節(jié)是異常消息的文本內容 | -ERR\r\n |
Integer | 整型數(shù)字 | 第一個字節(jié)是:,最后兩個字節(jié)是\r\n,其他字節(jié)是數(shù)字的文本內容 | :100\r\n |
Bulk String | 定長字符串 | 第一個字節(jié)是$,緊接著的字節(jié)是內容字符串長度\r\n,最后兩個字節(jié)是\r\n,其他字節(jié)是字符串內容 | $4\r\ndoge\r\n |
Array | RESP數(shù)組 | 第一個字節(jié)是*,緊接著的字節(jié)是元素個數(shù)\r\n,最后兩個字節(jié)是\r\n,其他字節(jié)是各個元素的內容,每個元素可以是任意一種數(shù)據(jù)類型 | *2\r\n:100\r\n$4\r\ndoge\r\n |
發(fā)送的命令格式如下,CRLF代表"\r\n":
*<參數(shù)數(shù)量>?CRLF
$<參數(shù)1的字節(jié)數(shù)量>?CRLF
<參數(shù)1>?CRLF
...
$<參數(shù)N的字節(jié)數(shù)量>?CRLF
<參數(shù)N>?CRLF
以set hello world這個命令為例,發(fā)送的內容就是這樣的:
*3
$3
SET
$5
hello
$5
world
第一行*3表示有3個參數(shù),$3表示接下來的一個參數(shù)有3個字節(jié),接下來是參數(shù),$5表示下一個參數(shù)有5個字節(jié),接下來是參數(shù),$5表示下一個參數(shù)有5個字節(jié),接下來是參數(shù)。
所以set hello world最終發(fā)送給redis服務器的命令是:
*3\r\n$3\r\nSET\r\n$5\r\nhello\r\n$5\r\nworld\r\n
2. RESP 響應內容
Redis的返回結果類型分為以下五種:
????????正確回復:在RESP中第一個字節(jié)為"+"
????????錯誤回復:在RESP中第一個字節(jié)為"-"
????????整數(shù)回復:在RESP中第一個字節(jié)為":"
????????字符串回復:在RESP中第一個字節(jié)為"$"
????????多條字符串回復:在RESP中第一個字節(jié)為"*"
(+)?表示一個正確的狀態(tài)信息,具體信息是當前行+后面的字符。
(-)??表示一個錯誤信息,具體信息是當前行-后面的字符。
(*)?表示消息體總共有多少行,不包括當前行,*后面是具體的行數(shù)。
($)?表示下一行數(shù)據(jù)長度,不包括換行符長度\r\n,$后面則是對應的長度的數(shù)據(jù)。
(:)?表示返回一個數(shù)值,:后面是相應的數(shù)字節(jié)符。


有了這個協(xié)議,我們就可以編寫程序來和 Redis 服務端進行通信。由于 Redis 的流行,已經(jīng)存在了很多流行的開源客戶端。本文主要選擇 Java 領域 Redis 官方推薦的客戶端進行介紹。
Redis 的 Java 客戶端
Redis 官方推薦的 Java 客戶端有Jedis、lettuce 和 Redisson。
1. Jedis
Jedis 是老牌的 Redis 的 Java 實現(xiàn)客戶端,提供了比較全面的 Redis 命令的支持,其官方網(wǎng)址是:http://tool.oschina.net/uploads/apidocs/redis/clients/jedis/Jedis.html。
優(yōu)點:
支持全面的 Redis 操作特性(可以理解為API比較全面)。
缺點:
使用阻塞的 I/O,且其方法調用都是同步的,程序流需要等到 sockets 處理完 I/O 才能執(zhí)行,不支持異步;
Jedis 客戶端實例不是線程安全的,所以需要通過連接池來使用 Jedis。
2. lettuce
lettuce ([?let?s]),是一種可擴展的線程安全的 Redis 客戶端,支持異步模式。如果避免阻塞和事務操作,如BLPOP和MULTI/EXEC,多個線程就可以共享一個連接。lettuce 底層基于 Netty,支持高級的 Redis 特性,比如哨兵,集群,管道,自動重新連接和Redis數(shù)據(jù)模型。lettuce 的官網(wǎng)地址是:https://lettuce.io/
優(yōu)點:
支持同步異步通信模式;
Lettuce 的 API 是線程安全的,如果不是執(zhí)行阻塞和事務操作,如BLPOP和MULTI/EXEC,多個線程就可以共享一個連接。
3. Redisson
Redisson 是一個在 Redis 的基礎上實現(xiàn)的 Java 駐內存數(shù)據(jù)網(wǎng)格(In-Memory Data Grid)。它不僅提供了一系列的分布式的 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) Redisson 提供了使用Redis 的最簡單和最便捷的方法。Redisson 的宗旨是促進使用者對Redis的關注分離(Separation of Concern),從而讓使用者能夠將精力更集中地放在處理業(yè)務邏輯上。Redisson的官方網(wǎng)址是:https://redisson.org/
優(yōu)點:
使用者對 Redis 的關注分離,可以類比 Spring 框架,這些框架搭建了應用程序的基礎框架和功能,提升開發(fā)效率,讓開發(fā)者有更多的時間來關注業(yè)務邏輯;
提供很多分布式相關操作服務,例如,分布式鎖,分布式集合,可通過Redis支持延遲隊列等。
缺點:
Redisson 對字符串的操作支持比較差。
4. 使用建議
結論:lettuce + Redisson
Jedis 和 lettuce 是比較純粹的 Redis 客戶端,幾乎沒提供什么高級功能。Jedis 的性能比較差,所以如果你不需要使用 Redis 的高級功能的話,優(yōu)先推薦使用 lettuce。
Redisson 的優(yōu)勢是提供了很多開箱即用的 Redis 高級功能,如果你的應用中需要使用到 Redis 的高級功能,建議使用 Redisson。具體 Redisson 的高級功能可以參考:https://redisson.org/
參考
RESP協(xié)議1:https://www.cnblogs.com/4a8a08f09d37b73795649038408b5f33/p/9998245.html
RESP協(xié)議2:https://my.oschina.net/u/2474629/blog/913805
RESP協(xié)議3:https://www.cnblogs.com/throwable/p/11644790.html
Redis的三個框架:Jedis,Redisson,Lettuce:https://www.cnblogs.com/williamjie/p/11287292.html
redis客戶端選型-Jedis、lettuce、Redisson:https://blog.csdn.net/a5569449/article/details/106891111/
粉絲福利:108本java從入門到大神精選電子書領取
???
?長按上方鋒哥微信二維碼?2 秒 備注「1234」即可獲取資料以及 可以進入java1234官方微信群
感謝點贊支持下哈?
