Redis 客戶端 Jedis、lettuce 和 Redisson 對比


Redis 支持多種語言的客戶端,下面列舉了部分 Redis 支持的客戶端語言,大家可以通過官網查看 Redis 支持的客戶端詳情。

  • C語言
  • C++
  • C#
  • Java
  • Python
  • Node.js
  • PHP

Redis 是用單線程來處理多個客戶端的訪問,因此作為 Redis 的開發和運維人員需要了解 Redis 服務端和客戶端的通信協議,以及主流編程語言的 Redis 客戶端使用方法,同時還需要了解客戶端管理的相應 API 以及開發運維中可能遇到的問題。

Redis 客戶端通信協議

Redis制定了RESP(Redis Serialization Protocol,Redis序列化協議)實現客戶端與服務端的正常交互,這種協議簡單高效,既能夠被機器解析,又容易被人類識別。

RESP可以序列化不同的數據類型,如整型、字符串、數組還有一種特殊的Error類型。需要執行的Redis命令會封裝為類似於字符串數組的請求然后通過Redis客戶端發送到Redis服務端。Redis服務端會基於特定的命令類型選擇對應的一種數據類型進行回復。

1. RESP 發送命令格式

RESP中,發送的數據類型取決於數據報的第一個字節:

  • 單行字符串的第一個字節為+
  • 錯誤消息的第一個字節為-
  • 整型數字的第一個字節為:
  • 定長字符串的第一個字節為$
  • RESP數組的第一個字節為*
數據類型 本文翻譯名稱 基本特征 例子
Simple String 單行字符串 第一個字節是+,最后兩個字節是\r\n,其他字節是字符串內容 +OK\r\n
Error 錯誤消息 第一個字節是-,最后兩個字節是\r\n,其他字節是異常消息的文本內容 -ERR\r\n
Integer 整型數字 第一個字節是:,最后兩個字節是\r\n,其他字節是數字的文本內容 :100\r\n
Bulk String 定長字符串 第一個字節是$,緊接着的字節是內容字符串長度\r\n,最后兩個字節是\r\n,其他字節是字符串內容 $4\r\ndoge\r\n
Array RESP數組 第一個字節是*,緊接着的字節是元素個數\r\n,最后兩個字節是\r\n,其他字節是各個元素的內容,每個元素可以是任意一種數據類型 *2\r\n:100\r\n$4\r\ndoge\r\n

發送的命令格式如下,CRLF代表"\r\n":

*<參數數量> CRLF
$<參數1的字節數量> CRLF
<參數1> CRLF
...
$<參數N的字節數量> CRLF
<參數N> CRLF

set hello world這個命令為例,發送的內容就是這樣的:

*3
$3
SET
$5
hello
$5
world

第一行*3表示有3個參數,$3表示接下來的一個參數有3個字節,接下來是參數,$5表示下一個參數有5個字節,接下來是參數,$5表示下一個參數有5個字節,接下來是參數。

所以set hello world最終發送給redis服務器的命令是:

*3\r\n$3\r\nSET\r\n$5\r\nhello\r\n$5\r\nworld\r\n

2. RESP 響應內容

Redis的返回結果類型分為以下五種:
        正確回復:在RESP中第一個字節為"+"
        錯誤回復:在RESP中第一個字節為"-"
        整數回復:在RESP中第一個字節為":"
        字符串回復:在RESP中第一個字節為"$"
        多條字符串回復:在RESP中第一個字節為"*"

(+) 表示一個正確的狀態信息,具體信息是當前行+后面的字符。
(-)  表示一個錯誤信息,具體信息是當前行-后面的字符。
(*) 表示消息體總共有多少行,不包括當前行,*后面是具體的行數。
($) 表示下一行數據長度,不包括換行符長度\r\n,$后面則是對應的長度的數據。
(:) 表示返回一個數值,:后面是相應的數字節符。

有了這個協議,我們就可以編寫程序來和 Redis 服務端進行通信。由於 Redis 的流行,已經存在了很多流行的開源客戶端。本文主要選擇 Java 領域 Redis 官方推薦的客戶端進行介紹。

Redis 的 Java 客戶端

Redis 官方推薦的 Java 客戶端有Jedis、lettuce 和 Redisson。

1. Jedis

Jedis 是老牌的 Redis 的 Java 實現客戶端,提供了比較全面的 Redis 命令的支持,其官方網址是:http://tool.oschina.net/uploads/apidocs/redis/clients/jedis/Jedis.html。

優點:

  • 支持全面的 Redis 操作特性(可以理解為API比較全面)。

缺點:

  • 使用阻塞的 I/O,且其方法調用都是同步的,程序流需要等到 sockets 處理完 I/O 才能執行,不支持異步;
  • Jedis 客戶端實例不是線程安全的,所以需要通過連接池來使用 Jedis。

2. lettuce

lettuce ([ˈletɪs]),是一種可擴展的線程安全的 Redis 客戶端,支持異步模式。如果避免阻塞和事務操作,如BLPOP和MULTI/EXEC,多個線程就可以共享一個連接。lettuce 底層基於 Netty,支持高級的 Redis 特性,比如哨兵,集群,管道,自動重新連接和Redis數據模型。lettuce 的官網地址是:https://lettuce.io/

優點:

  • 支持同步異步通信模式;
  • Lettuce 的 API 是線程安全的,如果不是執行阻塞和事務操作,如BLPOP和MULTI/EXEC,多個線程就可以共享一個連接。

3. Redisson

Redisson 是一個在 Redis 的基礎上實現的 Java 駐內存數據網格(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),從而讓使用者能夠將精力更集中地放在處理業務邏輯上。Redisson的官方網址是:https://redisson.org/

優點:

  • 使用者對 Redis 的關注分離,可以類比 Spring 框架,這些框架搭建了應用程序的基礎框架和功能,提升開發效率,讓開發者有更多的時間來關注業務邏輯;
  • 提供很多分布式相關操作服務,例如,分布式鎖,分布式集合,可通過Redis支持延遲隊列等。

缺點:

  • Redisson 對字符串的操作支持比較差。

4. 使用建議

結論:lettuce + Redisson

Jedis 和 lettuce 是比較純粹的 Redis 客戶端,幾乎沒提供什么高級功能。Jedis 的性能比較差,所以如果你不需要使用 Redis 的高級功能的話,優先推薦使用 lettuce。

Redisson 的優勢是提供了很多開箱即用的 Redis 高級功能,如果你的應用中需要使用到 Redis 的高級功能,建議使用 Redisson。具體 Redisson 的高級功能可以參考:https://redisson.org/

參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM