# redis-06-通信协议RESP

# 简介

redis的通信协议是Redis Serialization Protocol,简称RESP,有如下特性:

是二进制安全的
在TCP层
基于请求-响应的模式

需注意的是:RESP是redis客户端和服务端通信的协议,节点交互不使用这个协议。

# RESP描述

RESP有五种最小的单元类型,单元结束时统一加上回车换行符号\r\n。

单行字符串 以 + 符号开头。
多行字符串 以 $ 符号开头,后跟字符串长度。
整数值 以 : 符号开头,后跟整数的字符串形式。
错误消息 以 - 符号开头。
数组 以 * 号开头,后跟数组的长度。

如: 单行字符串

+hello world\r\n

错误消息

-WRONGTYPE Operation against a key holding the wrong kind of value\r\n

整数值

:1024\r\n

多行字符串

$11\r\nhello world\r\n

数组[1,2,3]

*3\r\n:1\r\n:2\r\n:3\r\n

# 客户端->服务端

客户端向服务器发送的指令只有一种格式,多行字符串数组

比如一个简单的 set 指令set author codehole会被序列化成下面的字符串。

*3\r\n$3\r\nset\r\n$6\r\nauthor\r\n$8\r\ncodehole\r\n

# 服务器 -> 客户端

服务器向客户端回复的响应支持多种数据结构,即以上 5 中基本类型的组合。

# 抓包看看

我们用wireshark来抓下包,看看实际的RESP。

在redis上增加个key

127.0.0.1:6379> set hi 'hello world'
OK

1. 客户端发送给服务端

redis-resp-1.png

看data段的数据,整个数据结构是RESP的多行字符串结构,以*3开头,后面两个字节是0d,0a,对应ASCII是回车键和换行键,即\r和\n,后面的结构都符合多行字符串结构。

2. 服务端发送给客户端

redis-resp2.png

服务端返回的是ok,结构是单行字符串的,即

+ok\r\n

感兴趣的话,可以再抓抓其他的数据结构。