關於通訊協議,見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)後,必須要等待回應到達之後才能發送下一個命令? 這樣對客戶端來說 效率是否低了點?
這是普通的TCP流傳輸方式。
你對於」客戶端來說 效率低「 只是你空想而已吧?有數據做支援嗎?沒有任何數據做支持,只憑主觀的感覺能夠判斷正確?
還有就是效率與業務的關係,一般而言,只有當效率不支持業務的時候,才會開始考慮效率的問題,你現在什麼都還沒做就考慮這個效率,是不是有點過早了?
最後補充一下。 。這就是tcp協定裡面定義,如果還有什麼不清楚,http://en.wikipedia.org/wiki/Transmission_Control_Protocol 到這裡了解tcp規格。 。
可能這個問題變成:redis一次請求中是否只能發送一個指令? 會更好
結論: 無論採用哪種redis請求協議,都支援在一個請求中發送多個命令
redis請求協定
非標準redis請求協定格式(又稱Inline):
標準的redis請求協定格式:
所以當我們需要把鍵name的值設定成diaocow,可以使用上述兩種協定格式完成(有興趣的讀者可以自己使用telnet或nc指令測試)
Redis請求協定如何支援批次執行? (也就是大家常說的pipeline模式)
譬如,我需要批次執行以下兩個指令:
set name diaocow
set country china
那麼在一次請求中資料會是這樣(假設我們使用標準協定): *3rn$3rnsetrn$4rnnamern$7rndiaocowrn*3rn$3rnsetrn$7rncountryrn$5rnchinarn
然後在redis內部,它會這樣解析,偽代碼:
parseCommandInfo會根據不同協定來解析:若第一個位元組為'*',則採用標準協定
備註: 所有redis客戶端在實現批量發送命令功能,無非就是把多個命令按照我們剛才說的格式,一併發送給redis,有興趣的讀者可以參看自己熟悉語言的客戶端