Redis 通信协议
0.前言
Redis作者任务数据库系统的瓶颈一般不在于流量,而是在于数据库自身内部的处理逻辑上,所以即使Redis使用了比较浪费流量的文本协议,但是依旧获取极高的访问性能。
1. RESP
RESP是Redis的序列化协议(Redis Serialization Protocol)
,是一种直观的文本协议,优势在于实现过程异常简单,解析性能较好。
Redis协议将传输的数据结构分为5中最小单元类型,单元结束时统一加上回车换行符号\r\n
。
- 单行字符串以
+
符号开头。 - 多行字符串以
$
符号开头,后紧接着字符串的长度。 - 整数值以
:
符号开头,后面接着整数的字符串形式。 - 错误消息以
-
符号开头。 - 数组以
*
符好投,后面接着数组的长度。
# 单行字符串 hello world
+hello world\r\n
# 多行字符串 hello world
$11\r\nhello world\r\n
# 整数 1024
:1024\r\n
# 错误
-WRONGTYPE ERROR
# 数组 [1,2,3]
*3\r\n:1\r\n:2\r\n:3\r\n
# NULL表示
$-1\r\n
# 空串
$0\r\n\r\n # 这里的两个\r\n是因为两个\r\n之间隔的是空串
2. 客户端与服务器之间的响应
客户端->服务器
客户端向服务器发送的指令只有一种格式,多行字符串数组,比如一个简单的set指令set author leesure
会被序列化为下面的字符串。
*3\r\n$3\r\nset\r\n$6\r\nauthor\r\n$7\r\nleesure\r\n
服务器->客户端
服务器向客户端回复的响应要支持多种数据结构,一共有5种基本类型的组合。
#单行字符串 OK
+OK\r\n
# 错误响应
- ERR value is not an integer
# 整数响应 1
:1
# 多行字符串响应 leesure
$7\r\nleesure\r\n