Redis 协议(上)协议介绍
2021-07-31 本文已影响0人
redexpress
Redis 协议的特点
Redis 协议在一下三个目标之间进行折中:
- 易于实现
- 可以高效地被计算机分析
- 可以很容易地被人类读懂
Redis 协议相当简单,当阅读Redis协议后,我有自己实现Redis协议的想法。本文主要介绍Redis协议,下篇会用Rust语言实现Redis。
Redis 的数据类型
本文使用\r
和\n
表示回车字符(ASCII码13)和换行字符(ASCII码10)。字符不用引号,使用Markdown的方框框住。
1. Null
空数据,发送内容$-1\r\n
。比如客户端发送GET key_not_exists,服务端返回(nil),发送的内容是$-1\r\n
。
2. 空数组
空数组,发送内容*-1\r\n
。
3. 简单字符串
简单字符串,发送内容以+
开头。比如回复OK,发送的内容是+OK\r\n
。简单的字符串适合返回可打印字符。
4. 错误字符串
错误字符串,发送内容以-
开头。比如某个回复发送的内容是-Expected 2 arguments for SET command\r\n
。
5. 整数
整数,发送内容以:
开头。用来发送一个整数,比如:21\r\n
,或者布尔类型,:0\r\n
表示假,:1\r\n
表示真。
6. 批量字符串
整数,发送内容以$
开头。批量字符串返回二进制安全的字符串。比如客户端发GET name,服务端返回yang。服务端传送的内容是$4\r\nyang\r\n
。其中,第一个是$
,接下来是实际回复长度的数字值4
,之后跟\r\n
,再后面跟实际回复数据,最后是\r\n
。
7. 批量数组
非空数组,发送内容以*
开头。比如客户端发送GET name,内容是*2\r\n$3\r\nget\r\n$4\r\nname\r\n
。表示批量数组长度是2,后面有两条数据。本例批量数组包含两个批量字符串。