zoukankan      html  css  js  c++  java
  • redis 简单整理——客户端通信协议[十五]

    前言

    简单介绍一下客户端的通信协议。

    正文

    第 一,客户端与服务端之间的通信协议是在TCP协议之上构建的。

    第二, Redis制定了RESP(REdis Serialization Protocol,Redis序列化协议)实现客户端与服务端的正常交互,这种协议简单高效,既能够被机器解析,又容易 被人类识别。

    例如客户端发送一条set hello world命令给服务端,按照RESP 的标准,客户端需要将其封装为如下格式(每行用 分隔):

    这样Redis服务端能够按照RESP将其解析为set hello world命令,执行后 回复的格式如下:

    可以看到除了命令(set hello world)和返回结果(OK)本身还包含了 一些特殊字符以及数字,下面将对这些格式进行说明。

    1. 发送命令的格式

    RESP的规定一条命令的格式如下,CRLF代表" "。

    *<参数数量> CRLF
    $<参数1的字节数量> CRLF 
    
    <参数1> 
    
    CRLF ... 
    
    $<参数N的字节数量> CRLF 
    
    <参数N> CRLF
    

    参数数量为3个,因此第一行为:

    *3

    参数字节数分别是355,因此后面几行为:

    $3
    SET 
    $5
    hello
    $5
    world
    

    有一点要注意的是,上面只是格式化显示的结果,实际传输格式为如下代码:

    *3
    $3
    SET
    $5
    hello
    $5
    world
    
    

    返回格式:

    Redis的返回结果类型分为以下五种

    ·状态回复:在RESP中第一个字节为"+"。 
    ·错误回复:在RESP中第一个字节为"-"。 
    ·整数回复:在RESP中第一个字节为":"。
    ·字符串回复:在RESP中第一个字节为"$"。
    ·多条字符串回复:在RESP中第一个字节为"*"。
    
    static sds cliFormatReplyTTY(redisReply *r, char *prefix)
     { sds out = sdsempty(); 
    switch (r->type) 
      { 
         case REDIS_REPLY_ERROR: 
         // 处理错误回复 
         case REDIS_REPLY_STATUS: 
         // 处理状态回复 
        case REDIS_REPLY_INTEGER: 
        // 处理整数回复 
        case REDIS_REPLY_STRING: 
        // 处理字符串回复 
        case REDIS_REPLY_NIL: 
        // 处理空 
       case REDIS_REPLY_ARRAY: 
        // 处理多条字符串回复
        return out; 
    }
    

    那么直接用telnet和nc分别实现一下啊,直接弄用协议写一下。

    后面几个可以自己玩一下。

    有一点需要注意,无论是字符串回复还是多条字符串回复,如果有nil 值,那么会返回$-1。

    有了RESP提供的发送命令和返回结果的协议格式,各种编程语言就可 以利用其来实现相应的Redis客户端,后面两节将介绍Java和Python两个编程 语言的Redis客户端。

    下一节Java客户端Jedis。

  • 相关阅读:
    static关键字的定义与使用
    String类练习统计一个字符串中大小写字母及数字字符个数
    Java中String类的常用方法
    String类的特点和使用步骤
    HTB 渗透测试笔记-Lame
    消息认证-数字签名-报文鉴别-到底是什么
    docker pull 太慢了解决办法
    彻底解决Mac无线网络故障和网速慢的问题
    彻底-有效-解决-Github下载太慢的问题
    Linux中的docker报错 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
  • 原文地址:https://www.cnblogs.com/aoximin/p/15170748.html
Copyright © 2011-2022 走看看