Redis 通訊協議的疑問
怪我咯
怪我咯 2017-04-21 10:57:48
0
3
636

關於通訊協議,見https://redis.readthedocs.org/en/latest/topic/protocol.html

1)命令 set mykey myvalue 对应 要发送到Redis的字符串(要转化为二进制数据)是

"*3rn$3rnsetrn$5rnmykeyrn$7rnmyvaluern"

2)命令 get mykey 对应字符串是 "*2\r\n\r\nget\r\n\r\nmykey\r\n"

3)最后得到Redis发回的响应是 "+OK\r\n\r\nmyvalue\r\n"

我的问题是,Redis这样的响应格式,是否意味者 客户端发完命令(需要得到返回

值的命令如get)後,必須要等待回應到達之後才能發送下一個命令? 這樣對客戶端來說 效率是否低了點?

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回覆(3)
左手右手慢动作

這是普通的TCP流傳輸方式。

阿神

你對於」客戶端來說 效率低「 只是你空想而已吧?有數據做支援嗎?沒有任何數據做支持,只憑主觀的感覺能夠判斷正確?

還有就是效率與業務的關係,一般而言,只有當效率不支持業務的時候,才會開始考慮效率的問題,你現在什麼都還沒做就考慮這個效率,是不是有點過早了?

最後補充一下。 。這就是tcp協定裡面定義,如果還有什麼不清楚,http://en.wikipedia.org/wiki/Transmission_Control_Protocol 到這裡了解tcp規格。 。

迷茫

可能這個問題變成:redis一次請求中是否只能發送一個指令? 會更好

結論: 無論採用哪種redis請求協議,都支援在一個請求中發送多個命令


redis請求協定

非標準redis請求協定格式(又稱Inline):

指令名 參數1 參數2 ... 參數N

set name diaocow

標準的redis請求協定格式:

*CR LF
$CR LF CR LF
...
$CR LF
CR LF

*3rn$3rnsetrn$4rnnamern$7rndiaocowrn

所以當我們需要把鍵name的值設定成diaocow,可以使用上述兩種協定格式完成(有興趣的讀者可以自己使用telnet或nc指令測試)

Redis請求協定如何支援批次執行? (也就是大家常說的pipeline模式)

譬如,我需要批次執行以下兩個指令:

  1. set name diaocow

  2. set country china

那麼在一次請求中資料會是這樣(假設我們使用標準協定): *3rn$3rnsetrn$4rnnamern$7rndiaocowrn*3rn$3rnsetrn$7rncountryrn$5rnchinarn

然後在redis內部,它會這樣解析,偽代碼:

def processInputBuffer(client): 
    while (len(client.querybuf) > 0): 
        # 获取命令名,参数个数,参数数组以及当前读取到querybuf位置 
        cmd, argc, argv, pos = parseCommandInfo(client.querybuf) 
        # 执行命令 
        processCommand(cmd, argc, argv) 
        # 切换到下一个命令 
        client.querybuf = client.querybuf[pos:-1] 

parseCommandInfo會根據不同協定來解析:若第一個位元組為'*',則採用標準協定

備註: 所有redis客戶端在實現批量發送命令功能,無非就是把多個命令按照我們剛才說的格式,一併發送給redis,有興趣的讀者可以參看自己熟悉語言的客戶端

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板