Redis是一个CS架构的软件,通信一般分两步(不包括pipeline和PubSub):
因此客户端发送命令的格式、服务端响应结果的格式必须有一个规范,这个规范就是通信协议。
而在Redis中采用的是 RESP(Redis Serialization Protocol)协议。
虽然 RESP3 协议非常强,但是它与 RESP2 的兼容性特别差,所以到目前来看仍然使用的是 RESP2 协议。
在RESP中,通过首字节的字符来区分不同数据类型,常用的数据类型包括5种:
单行字符串:首字节是 ‘+’ ,后面跟上单行字符串,以CRLF( “\r\n” )结尾。
例如服务端在返回"OK": “+OK\r\n”
错误(Errors):首字节是 ‘-’ ,与单行字符串格式一样,只是字符串是异常信息,以 CRLF 结尾。
例如:“-Error message\r\n”
数值:首字节是 ‘:’ ,后面跟上数字格式的字符串,以 CRLF 结尾。
例如:“:10\r\n”
多行字符串:首字节是 ‘$’ ,然后第二个为int型的整数,表示字符串的长度。总起来看他表示二进制安全的字符串,最大支持512MB,这个和 SDS(动态字符串)是比较像的。以 CRLW 来对字符串的开始和结尾进行一个包装。
第二位的int型:
● 如果大小为0,则代表空字符串:“$0\r\n\r\n”
● 如果大小为-1,则代表不存在:" $ -1\r\n"
例如:$5\r\nhello\r\n $表示为多行字符串,5表示字符串的长度为5,以CPLW来讲字符串包括起来。
数组:首字节是 ‘*’,后面跟上数组元素个数,再跟上元素,元素数据类型不限。
例子1:
*3\r\n
$3\r\nset\r\n
$4\r\nname\r\n
$6\r\n虎哥\r\n
例子2:
*3\r\n
:10\r\n
$5\r\nhello\r\n
*2\r\n$3\r\nage\r\n:10\r\n