Redis 協(xié)議的特點
Redis 協(xié)議在一下三個目標之間進行折中:
- 易于實現(xiàn)
- 可以高效地被計算機分析
- 可以很容易地被人類讀懂
Redis 協(xié)議相當簡單,當閱讀Redis協(xié)議后,我有自己實現(xiàn)Redis協(xié)議的想法。本文主要介紹Redis協(xié)議,下篇會用Rust語言實現(xiàn)Redis。
Redis 的數(shù)據(jù)類型
本文使用\r和\n表示回車字符(ASCII碼13)和換行字符(ASCII碼10)。字符不用引號,使用Markdown的方框框住。
1. Null
空數(shù)據(jù),發(fā)送內(nèi)容$-1\r\n。比如客戶端發(fā)送GET key_not_exists,服務(wù)端返回(nil),發(fā)送的內(nèi)容是$-1\r\n。
2. 空數(shù)組
空數(shù)組,發(fā)送內(nèi)容*-1\r\n。
3. 簡單字符串
簡單字符串,發(fā)送內(nèi)容以+開頭。比如回復(fù)OK,發(fā)送的內(nèi)容是+OK\r\n。簡單的字符串適合返回可打印字符。
4. 錯誤字符串
錯誤字符串,發(fā)送內(nèi)容以-開頭。比如某個回復(fù)發(fā)送的內(nèi)容是-Expected 2 arguments for SET command\r\n。
5. 整數(shù)
整數(shù),發(fā)送內(nèi)容以:開頭。用來發(fā)送一個整數(shù),比如:21\r\n,或者布爾類型,:0\r\n表示假,:1\r\n表示真。
6. 批量字符串
整數(shù),發(fā)送內(nèi)容以$開頭。批量字符串返回二進制安全的字符串。比如客戶端發(fā)GET name,服務(wù)端返回yang。服務(wù)端傳送的內(nèi)容是$4\r\nyang\r\n。其中,第一個是$,接下來是實際回復(fù)長度的數(shù)字值4,之后跟\r\n,再后面跟實際回復(fù)數(shù)據(jù),最后是\r\n。
7. 批量數(shù)組
非空數(shù)組,發(fā)送內(nèi)容以*開頭。比如客戶端發(fā)送GET name,內(nèi)容是*2\r\n$3\r\nget\r\n$4\r\nname\r\n。表示批量數(shù)組長度是2,后面有兩條數(shù)據(jù)。本例批量數(shù)組包含兩個批量字符串。