redis通信协议RESP
李羽秋
2022年03月01日 · 阅读 1,352
redis通信协议RESP
1.什么是RESP?
是基于TCP的应用层协议RESP(REdis Serialization Protocol),RESP底层采用的是TCP的连接方式,通过tcp进行数据传输,然后根据解析规则解析相应信息,Redis 的客户端和服务端之间采取了一种独立名为 RESP(REdis Serialization Protocol) 的协议。
2.特征
- 在TCP层
- 是二进制安全的
- 基于请求-响应模式
- 简单、易懂
3.RESP描述
Redis协议将传输的数据结构分为5种,单元结束时统一加上回车换行符号\r\n
- 单行字符串,第一个字节为
+
- 错误消息,第一个字节为
-
- 整型数字,第一个字节为
:
,后跟整数的字符串 - 多行字符串,第一个字节为
$
,后跟字符串的长度 - 数组,第一个字节为
*
,后跟跟着数组的长度
4. 编写一个简单的客户端
public class RedisClient {
private static Socket socket;
private static OutputStream write;
private static InputStream read;
public static void main(String[] args) throws IOException {
socket = new Socket("127.0.0.1",6379);
write = socket.getOutputStream();
read = socket.getInputStream();
Scanner scan = new Scanner(System.in);
// 判断是否还有输入
while (scan.hasNextLine()) {
String str = scan.nextLine();
// 构造协议
String commannd = buildCommand(str);
System.out.println("发送命令为:\r\n" + commannd);
String result = sendCommand(commannd);
System.out.println("响应命令为:" + result);
}
scan.close();
}
private static String sendCommand(String commannd) throws IOException {
write.write(commannd.toString().getBytes());
byte[] bytes = new byte[1024];
read.read(bytes);
return new String(bytes,"UTF-8");
}
private static String buildCommand(String str) {
if (str != null && !"".equals(str)) {
String[] strs = str.split(" ");
StringBuilder builder = new StringBuilder();
builder.append("*").append(strs.length).append("\r\n");
for (String str1 : strs) {
builder.append("$").append(str1.length()).append("\r\n");
builder.append(str1).append("\r\n");
}
return builder.toString();
}
return null;
}
}
运行结果:
set name chenssy
发送命令为:
*3
$3
set
$4
name
$7
chenssy
响应命令为:+OK
get name
发送命令为:
*2
$3
get
$4
name
响应命令为:$7
chenssy
分类:
redis
标签:
无