国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Redis - Redis:我是如何與客戶端進行通信的

Redis:我是如何與客戶端進行通信的

2021-06-22 23:37碼農參上Dr Hydra Redis

我是一個Redis服務,最引以為傲的就是我的速度,我的 QPS 能達到10萬級別。在我的手下有數不清的小弟,他們會時不時到我這來存放或者取走一些數據,我管他們叫做客戶端,還給他們起了英文名叫 Redis-client。

Redis:我是如何與客戶端進行通信的

江湖上說,天下武功,無堅不摧,唯快不破,這句話簡直是為我量身定制。

我是一個Redis服務,最引以為傲的就是我的速度,我的 QPS 能達到10萬級別。

在我的手下有數不清的小弟,他們會時不時到我這來存放或者取走一些數據,我管他們叫做客戶端,還給他們起了英文名叫 Redis-client。

有時候一個小弟會來的非常頻繁,有時候一堆小弟會同時過來,但是,即使再多的小弟我也能管理的井井有條。

有一天,小弟們問我。

Redis:我是如何與客戶端進行通信的

想當年,為了不讓小弟們拖垮我傲人的速度,在設計和他們的通信協議時,我絞盡腦汁,制定了下面的三條原則:

  • 實現簡單
  • 針對計算機來說,解析速度快
  • 針對人類來說,可讀性強

為什么這么設計呢?先來看看一條指令發出的過程,首先在客戶端需要對指令操作進行封裝,使用網絡進行傳輸,最后在服務端進行相應的解析、執行。

Redis:我是如何與客戶端進行通信的

這一過程如果設計成一種非常復雜的協議,那么封裝、解析、傳輸的過程都將非常耗時,無疑會降低我的速度。什么,你問我為什么要遵循最后一條規則?算是對于程序員們的饋贈吧,我真是太善良了。

我把創造出來的這種協議稱為 RESP (REdis Serialization Protocol)協議,它工作在 TCP 協議的上層,作為我和客戶端之間進行通訊的標準形式。

說到這,我已經有點迫不及待想讓你們看看我設計出來的杰作了,但我好歹也是個大哥,得擺點架子,不能我主動拿來給你們看。

所以我建議你直接使用客戶端發出一條向服務器的命令,然后取出這條命令對應的報文來直觀的看一下。話雖如此,不過我已經被封裝的很嚴實了,正常情況下你是看不到我內部進行通訊的具體報文的,所以,你可以偽裝成一個Redis的服務端,來截獲小弟們發給我的消息。

實現起來也很簡單,我和小弟之間是基于 Socket 進行通訊,所以在本地先啟動一個ServerSocket,用來監聽Redis服務的6379端口:

  1. public static void server() throws IOException { 
  2.     ServerSocket serverSocket = new ServerSocket(6379); 
  3.     Socket socket = serverSocket.accept(); 
  4.     byte[] bytes = new byte[1024]; 
  5.     InputStream input = socket.getInputStream(); 
  6.     while(input.read(bytes)!=0){ 
  7.         System.out.println(new String(bytes)); 
  8.     } 

然后啟動redis-cli客戶端,發送一條命令:

  1. set key1 value1 

這時,偽裝的服務端就會收到報文了,在控制臺打印了:

  1. *3 
  2. $3 
  3. set 
  4. $4 
  5. key1 
  6. $6 
  7. value1 

看到這里,隱隱約約看到了剛才輸入的幾個關鍵字,但是還有一些其他的字符,要怎么解釋呢,是時候讓我對協議報文中的格式進行一下揭秘了。

我對小弟們說了,對大哥說話的時候得按規矩來,這樣吧,你們在請求的時候要遵循下面的規則:

  1. *<參數數量> CRLF 
  2. $<參數1的字節長度> CRLF 
  3. <參數1的數據> CRLF 
  4. $<參數2的字節長度> CRLF 
  5. <參數2的數據> CRLF 
  6. ... 
  7. $<參數N的字節長度> CRLF 
  8. <參數N的數據> CRLF 

首先解釋一下每行末尾的CRLF,轉換成程序語言就是\r\n,也就是回車加換行。看到這里,你也就能夠明白為什么控制臺打印出的指令是豎向排列了吧。

在命令的解析過程中,set、key1、value1會被認為是3個參數,因此參數數量為3,對應第一行的*3。

第一個參數set,長度為3對應$3;第二個參數key1,長度為4對應$4;第三個參數value1,長度為6對應$6。在每個參數長度的下一行對應真正的參數數據。

看到這,一條指令被轉換為協議報文的過程是不是就很好理解了?

Redis:我是如何與客戶端進行通信的

當小弟對我發送完請求后,作為大哥,我就要對小弟的請求進行指令回復了,而且我得根據回復內容進行一下分類,要不然小弟該搞不清我的指示了。

簡單字符串

 

簡單字符串回復只有一行回復,回復的內容以+作為開頭,不允許換行,并以\r\n結束。有很多指令在執行成功后只會回復一個OK,使用的就是這種格式,能夠有效的將傳輸、解析的開銷降到最低。

Redis:我是如何與客戶端進行通信的

錯誤回復

 

在RESP協議中,錯誤回復可以當做簡單字符串回復的變種形式,它們之間的格式也非常類似,區別只有第一個字符是以-作為開頭,錯誤回復的內容通常是錯誤類型及對錯誤描述的字符串。

錯誤回復出現在一些異常的場景,例如當發送了錯誤的指令、操作數的數量不對時,都會進行錯誤回復。在客戶端收到錯誤回復后,會將它與簡單字符串回復進行區分,視為異常。

Redis:我是如何與客戶端進行通信的

整數回復

 

整數回復的應用也非常廣泛,它以:作為開頭,以\r\n結束,用于返回一個整數。例如當執行incr后返回自增后的值,執行llen返回數組的長度,或者使用exists命令返回的0或1作為判斷一個key是否存在的依據,這些都使用了整數回復。

Redis:我是如何與客戶端進行通信的

批量回復

 

批量回復,就是多行字符串的回復。它以$作為開頭,后面是發送的字節長度,然后是\r\n,然后發送實際的數據,最終以\r\n結束。如果要回復的數據不存在,那么回復長度為-1。

Redis:我是如何與客戶端進行通信的

多條批量回復

 

當服務端要返回多個值時,例如返回一些元素的集合時,就會使用多條批量回復。它以*作為開頭,后面是返回元素的個數,之后再跟隨多個上面講到過的批量回復。

Redis:我是如何與客戶端進行通信的

到這里,基本上我和小弟之間的通訊協議就介紹完了。剛才你嘗試了偽裝成一個服務端,這會再來試一試直接寫一個客戶端來直接和我進行交互吧。

  1. private static void client() throws IOException { 
  2.     String CRLF="\r\n"
  3.  
  4.     Socket socket=new Socket("localhost", 6379); 
  5.     try (OutputStream out = socket.getOutputStream()) { 
  6.         StringBuffer sb=new StringBuffer(); 
  7.         sb.append("*3").append(CRLF) 
  8.                 .append("$3").append(CRLF).append("set").append(CRLF) 
  9.                 .append("$4").append(CRLF).append("key1").append(CRLF) 
  10.                 .append("$6").append(CRLF).append("value1").append(CRLF); 
  11.         out.write(sb.toString().getBytes()); 
  12.         out.flush(); 
  13.  
  14.         try (InputStream inputStream = socket.getInputStream()) { 
  15.             byte[] buff = new byte[1024]; 
  16.             int len = inputStream.read(buff); 
  17.             if (len > 0) { 
  18.                 String ret = new String(buff, 0, len); 
  19.                 System.out.println("Recv:" + ret); 
  20.             } 
  21.         } 
  22.     } 

運行上面的代碼,控制臺輸出:

  1. Recv:+OK 

上面模仿了客戶端發出set命令的過程,并收到了回復。依此類推,你也可以自己封裝其他的命令,來實現一個自己的Redis客戶端,作為小弟,來和我進行通信。

不過記住,要叫我大哥。

原文鏈接:https://mp.weixin.qq.com/s/3YiQGDHpLl3Zcrsw_kr0tQ

延伸 · 閱讀

精彩推薦
  • Redisredis 交集、并集、差集的具體使用

    redis 交集、并集、差集的具體使用

    這篇文章主要介紹了redis 交集、并集、差集的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友...

    xiaojin21cen10152021-07-27
  • RedisRedis全量復制與部分復制示例詳解

    Redis全量復制與部分復制示例詳解

    這篇文章主要給大家介紹了關于Redis全量復制與部分復制的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Redis爬蟲具有一定的參考學習...

    豆子先生5052019-11-27
  • RedisRedis 事務知識點相關總結

    Redis 事務知識點相關總結

    這篇文章主要介紹了Redis 事務相關總結,幫助大家更好的理解和學習使用Redis,感興趣的朋友可以了解下...

    AsiaYe8232021-07-28
  • Redis詳解Redis復制原理

    詳解Redis復制原理

    與大多數db一樣,Redis也提供了復制機制,以滿足故障恢復和負載均衡等需求。復制也是Redis高可用的基礎,哨兵和集群都是建立在復制基礎上實現高可用的...

    李留廣10222021-08-09
  • RedisRedis的配置、啟動、操作和關閉方法

    Redis的配置、啟動、操作和關閉方法

    今天小編就為大家分享一篇Redis的配置、啟動、操作和關閉方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    大道化簡5312019-11-14
  • Redisredis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    redis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    這篇文章主要給大家介紹了關于redis中如何使用lua腳本讓你的靈活性提高5個逼格的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具...

    一線碼農5812019-11-18
  • Redisredis實現排行榜功能

    redis實現排行榜功能

    排行榜在很多地方都能使用到,redis的zset可以很方便地用來實現排行榜功能,本文就來簡單的介紹一下如何使用,具有一定的參考價值,感興趣的小伙伴們...

    乘月歸5022021-08-05
  • RedisRedis如何實現數據庫讀寫分離詳解

    Redis如何實現數據庫讀寫分離詳解

    Redis的主從架構,能幫助我們實現讀多,寫少的情況,下面這篇文章主要給大家介紹了關于Redis如何實現數據庫讀寫分離的相關資料,文中通過示例代碼介紹...

    羅兵漂流記6092019-11-11
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 久久久久久免费精品 | 国产高清自拍 | 一区二区免费在线播放 | 国产一区二区三区精品久久久 | 在线a免费| 欧美日韩在线播放 | 日韩欧美精品 | 在线成人av | 日韩欧美三级在线观看 | av网址在线 | 久热中文| 色视频免费在线观看 | 一区二区在线视频 | 亚洲精品字幕 | 男人的天堂在线视频 | 亚洲福利一区 | 成人影院av| 高清一区二区三区视频 | 91精品国产91久久综合桃花 | 成人h动漫精品一区二区器材 | 亚洲精品久久久久久下一站 | 亚洲第一视频 | 亚洲精品一区二区在线观看 | 久久久91 | 人人爽人人爽人人片av | 国产高清亚洲 | 国产精品区二区三区日本 | 成人免费在线视频播放 | 久久99精品久久久久 | 欧美精品亚洲精品 | av午夜电影 | 日韩欧美一区二区三区免费观看 | 久久久亚洲 | 国产精品爱久久久久久久 | 亚洲精品二区 | 久久精品成人 | 国产一区二区精品在线观看 | 免费日本视频 | 久久伊人中文字幕 | 国产精品久久久久久久久久妞妞 | 免费一级片在线观看 |