目录

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

参考: https://www.cmsblogs.com/article/1391390753212731392

分类: redis
标签: