RESP协议
什么是RESP?
RESP 是redis客户端和服务端之前使用的一种通讯协议;
RESP底层采用的是TCP的连接方式,通过tcp进行数据传输,然后根据解析规则解析相应信息;
RESP 的特点: 实现简单、快速解析、可读性好。
RESP协议说明
RESP支持以下数据类型的序列化:简单字符串,错误类型,整数,批量字符串和数组。
RESP的信息规则:
- 简单字符串:回复的第一个字节是 “+”
- 错误类型:回复的第一个字节是 “-“
- 整形数字:回复的第一个字节是 “:”
- 批量字符串:回复的第一个字节是 “$”
- 数组:回复的第一个字节是 “*”
- 每行信息已\r\n结尾
RESP验证
**分析:**redis-cli作为官方提供的Redis客户端,必然遵循了RESP协议;而我们使用redis-cli操作redis-server,可以推断肯定是redis-cli基于RESP和redis-server的6379端口进行了通信。
- 建立一个demo程序(SocketListener),监听本地的6379端口,接收到数据就打印;
- 使用redis-cli客户端执行set key value,看看向6379端口发送了什么。
ps:SocketListener先运行,再在redis-cli窗口执行命令。
public class SocketListener {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(6379);
Socket socket = serverSocket.accept();
byte[] bytes = new byte[1024];
socket.getInputStream().read(bytes);
System.out.println(new String(bytes));
}
}
给出拦截到的TCP数据:
SET key value #对应的resp通信协议串
*3
$3
SET
$3
key
$5
value
拦截到的数据的含义:
*3 //表示返回了一个数组,长度为3
$3 //表示这是一个多行字符串,实际信息字符串长度为3
SET //为上面$3描述的实际字符串
$3 //表示这是一个多行字符串,实际信息字符串长度为3
key //为上面$3描述的实际字符串
$5 //表示这是一个多行字符串,实际信息字符串长度为5
value //为上面$5描述的实际字符串