<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Redis 客戶端 Jedis、lettuce 和 Redisson 對比

          共 3807字,需瀏覽 8分鐘

           ·

          2020-10-18 04:28

          點擊上方藍色字體,選擇“標星公眾號”

          優(yōu)質文章,第一時間送達

          ? 作者?|??程序員自由之路

          來源 |? urlify.cn/YVvaUb

          66套java從入門到精通實戰(zhàn)課程分享

          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
          ArrayRESP數(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官方微信群



          感謝點贊支持下哈?

          瀏覽 75
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄色片免费一级 片 | 手机在线日本A V电影 | 亚洲成人网站免费在线观看 | 又黄又爽无遮挡 | 大鸡吧视频网 |