Redis竟然還有自定義網絡通信協議?
凡是網絡通信,皆需要雙方遵守一致的協議才能互聯。Redis協議在如下幾點之間做出了折衷:
- 實現簡單
- 被計算機快速解析
- 有一定的可讀性
網絡層
Redis在TCP端口6379上監聽到來的連接,客戶端連接到來時,Redis服務器為此創建一個TCP連接。在客戶端與服務器端之間傳輸的每個Redis命令或者數據都以\r\n結尾。
請求
Redis接收由不同參數組成的命令。一旦收到命令,將會立刻被處理,并響應給客戶端。
新的統一請求協議
新的統一協議在Redis 1.2中引入,在Redis 2.0中,成為與Redis服務器通訊的標準方式。
在這個統一協議里,發送給Redis服務端的所有參數都是二進制安全的。
如下是通用形式:
- *<number of arguments> CR LF
- $<number of bytes of argument 1> CR LF
- <argument data> CR LF
- ...
- $<number of bytes of argument N> CR LF
- <argument data> CR LF
示例:
- ➜ ~ nc localhost 6379
- keys *
- *2
- $18
- user:sign:5:202101
- $18
- seckill_vouchers:6
上面的命令看上去像是單引號字符串,所以可在查詢中看到每個字節的準確值:
- "*2\r\n$18\r\nuser:sign:5:202101\r\n$18\r\nseckill_vouchers:6\r\n"
在Redis的響應中也使用這樣的格式。批量回復時,這種格式用于每個參數。實際的統一請求協議是Redis用于返回列表項,并調用 Multi-bulk回復。僅僅是N個以以*\r\n為前綴的不同批量回復,是緊隨的參數(批量回復)數目。
響應
Redis用不同的響應類型回復命令。它可能從服務器發送的第一個字節開始校驗回復類型:
單行響應
響應的第一個字節將是+
- set java edge
- +OK
錯誤消息
響應的第一個字節是-
- keys*
- -ERR unknown command `keys*`, with args beginning with:
整型數字
響應的第一個字節將是:
批量響應
第一個字節將是$
- keys *
- *2
- $18
- user:sign:5:202101
- $18
- seckill_vouchers:6
多個批量響應
- 響應的第一個字節將是*