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