Redis 通信协议

0.前言

Redis作者任务数据库系统的瓶颈一般不在于流量,而是在于数据库自身内部的处理逻辑上,所以即使Redis使用了比较浪费流量的文本协议,但是依旧获取极高的访问性能。

1. RESP

RESP是Redis的序列化协议(Redis Serialization Protocol),是一种直观的文本协议,优势在于实现过程异常简单,解析性能较好。

Redis协议将传输的数据结构分为5中最小单元类型,单元结束时统一加上回车换行符号\r\n

  1. 单行字符串以+符号开头。
  2. 多行字符串以$符号开头,后紧接着字符串的长度。
  3. 整数值以:符号开头,后面接着整数的字符串形式。
  4. 错误消息以-符号开头。
  5. 数组以*符好投,后面接着数组的长度。
# 单行字符串 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