1. 程式人生 > 實用技巧 >Redis客戶端

Redis客戶端

客戶端通訊協議

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