RESP
- RESP(Redis Serialization Protocol),Redis序列化协议,是一种直观的文本协议,实现简单,解析性能好
- Redis协议将传输的结构数据分为5种最小单元类型,单元结束时统一加上换行回车符号
\r\n
- 单行字符串:以
+
符号开头 - 多行字符串:以
$
符号开头,后跟字符串长度 - 整数值:以
:
符号开头,后跟整数的字符串形式 - 错误:以
-
符号开头 - 数组:以
*
符号开头,后跟数组的长度
- 单行字符串:以
单行字符串
1 | +hello world\r\n |
多行字符串
字符串长度为11
1 | $11\r\nhello world\r\n |
NULL
用多行字符串表示,但长度要写成-1
1 | $-1\r\n |
空串
用多行字符串表示,长度为0
,两个\r\n
之间隔的是空串
1 | $0\r\n\r\n |
整数
1 | :1024\r\n |
错误
1 | -WRONGTYPE Operation against a key holding the wrong kind of value\r\n |
数组
[1,2,3]
1 | *3\r\n:1\r\n:2\r\n:3\r\n |
客户端 -> 服务端
客户端向服务器发送的指令只有一种格式,即多行字符串数组,set author zhongmingmao
会被序列化成下面的字符串
1 | *3\r\n$3\r\nset\r\n$6\r\nauthor\r\n$12\r\nzhongmingmao\r\n |
服务端 -> 客户端
单行字符串
1 | 127.0.0.1:6379> set author zhongmingmao |
没有使用双引号括起来,是单行字符串响应
1 | +OK\r\n |
多行字符串
1 | 127.0.0.1:6379> get author |
使用双引号括起来,是多行字符串响应
1 | $12\r\nzhongmingmao\r\n |
错误
1 | 127.0.0.1:6379> incr author |
1 | -ERR value is not an integer or out of range\r\n |
整数
1 | 127.0.0.1:6379> incr books |
1 | :1\r\n |
数组
1 | 127.0.0.1:6379> hset info name zhongmingmao |
1 | *4\r\n$4\r\nname\r\n$12\r\nzhongmingmao\r\n$3\r\nage\r\n$2\r\n18\r\n |
嵌套
1 | 127.0.0.1:6379> scan 0 |
1 | *2\r\n$1\r\n0\r\n*3\r\n$6\r\nauthor\r\n$5\r\nbooks\r\n$4\r\ninfo\r\n |
小结
Redis协议中有大量冗余的回车换行符,但依然是非常受欢迎的文本协议,很多开源项目都使用了RESP协议