Redis客戶端
阿新 • • 發佈:2020-12-01
客戶端通訊協議
Redis制定了RESP(REdis Serialization Protocol, Redis序列化協議) 實現客戶端與服務端的正常互動, 這種協議簡單高效, 既能夠被機器解析, 又容易被人類識別。
示例:客戶端傳送一條set hello world命令給服務端。按照RESP的標準, 客戶端需要將其封裝為如下格式(每行用\r\n分隔):
*3 $3 SET $5 hello $5 world
返回:
+OK
RESP格式說明:
傳送命令格式
RESP的規定一條命令的格式如下, CRLF代表"\r\n" *<引數數量> CRLF $<引數1的位元組數量> CRLF<引數1> CRLF ... $<引數N的位元組數量> CRLF <引數N> CRLF
示例解說:以set hello world為例
*3 引數數量為3個,第一行為*3 $3 set有3個位元組,第二行為$3 SET 第一個引數set $5 hello有5個位元組,第三行為$5 hello 第二個引數hellot $5 world有5個位元組,第五行為$5 world 第三個引數world
上面只是格式化顯示的結果, 實際傳輸格式為如下程式碼:
*3\r\n$3\r\nSET\r\n$5\r\nhello\r\n$5\r\nworld\r\n
返回結果格式
Redis的返回結果型別分為以下五種
·狀態回覆: 在RESP中第一個位元組為"+"。 ·錯誤回覆: 在RESP中第一個位元組為"-"。 ·整數回覆: 在RESP中第一個位元組為": "。 ·字串回覆: 在RESP中第一個位元組為"$"。 ·多條字串回覆: 在RESP中第一個位元組為"*"。
redis-cli只能看到最終的執行結果, 那是因為redis-cli本身就是按照RESP進行結果解析的, 所以看不到中間結果。
例如執行set hello world, 返回結果是OK, 並不能看到加號:
127.0.0.1:6379> set hello world OK
為了看到Redis服務端返回的“真正”結果, 可以使用nc命令、 telnet命令、 甚至寫一個socket程式進行模擬。
示例:
使用nc命令連線redis:nc 127.0.0.1 6379 set hello world +OK sethx -ERR unknown command 'sethx' incr counter :1 get hello $5 world mget java python *2 $5 jedis $8 redis-py
無論是字串回覆還是多條字串回覆, 如果有nil值, 那麼會返回$-1
對一個不存在的鍵執行get操作, 返回結果為: get not_exist_key $-1 如果批量操作中包含一條為nil值的結果, 那麼返回結果如下: mget hello not_exist_key java *3 $5 world $-1 $5 jedis