使用Wireshark分析Redis通信

使用Wireshark分析Redis通信

說明

  1. 對於Wireshark的使用我這裡不會闡述,具體可以google一下;
  2. 本章內容會對redis的set, mset 請求進行分析;

實戰

1.SET

set("set_key","set_value");

set("set_key2","set_value2");

觀察抓取的數據,如下:

使用Wireshark分析Redis通信

紅框區域:SYN是TCP三次握手建立連接的;

黃框區域:PSH是發送數據,ACK是響應;

綠色區域:FIN表示關閉連接;

我們這裡只分析發送數據(即黃框區域的數據);

上面的set命令請求了兩次,我們可以想象一下這個過程:

客戶端發送數據 -> 服務端 (PSH)

服務端收到數據,發送回執 -> 客戶端 (ACK)

服務端發送數據 -> 客戶端 (PSH)

客戶端收到數據,發送回執 -> 服務端 (ACK)

是不是這樣呢,我們看下抓取的數據

使用Wireshark分析Redis通信

看起來是像我們上面說的那樣,但怎麼下面還有一遍這個步驟(下面還有PSH和ACK),我們可以先看下發送的數據是什麼樣的

使用Wireshark分析Redis通信

使用Wireshark分析Redis通信

從上圖中可以看到,客戶端請求了兩次(即發送了兩次數據),服務端也響應了兩次(即也是發送了兩次數據),所以上面的 1,2,3,4步驟會有兩遍,我們再觀察一下發送的數據格式:

*3 表示3個參數

$3 第一個參數的長度

SET 第一個參數的值 (要執行的Command = set)

$7 第二個參數的長度

set_key 第二個參數的值 (key)

$9 第三個參數的長度

set_value 第三個參數的值 (value)

+OK 執行結果

那你如果還不敢肯定,咱們繼續看

使用Wireshark分析Redis通信

使用Wireshark分析Redis通信

從圖中可以確認我們上面說的就是對的。

2.MSET

mset相比於set而言可以一次發送多個key,value(即一次發送多個命令),我們再抓取數據看一下

使用Wireshark分析Redis通信

根據上面說的,我們可以發現客戶端確實只發送了一次請求,服務端也發送了一下(響應數據),具體的請求內容如下:

使用Wireshark分析Redis通信

由此可以說明 mset比多次set減少了請求,縮短了時間。

如果想看其他命令是怎麼通信的,可以照此方法抓取一下數據就一目瞭然了。

補充:

我通過Wireshark 分析了Redis pipeline命令,發現客戶端Jedis和Lettuce是不一樣的(spring data redisTemplate 底層是使用的Lettuce)。

區別:

Jedis 使用pipeline,客戶端發送多個命令時會放到客戶端緩衝區(此時並沒有真實發送),最後發送一個請求(包含多個命令)給服務端,服務端是逐條執行命令,然後統一把每條執行結果放到一個Response中返回給客戶端;

Lettuce 使用pipeline發送命令,因為底層是使用Netty,每條命令執行時,直接異步發送(並非是合併所有命令一起發送)。


分享到:


相關文章: