• 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。

  • 相关阅读:
    [转]面向接口编程详解(二)——编程实例
    [转]面向接口编程详解(一)——思想基础
    [转] LINQ to SQL快速上手 step by step
    Java备份MySQl数据库,并备份图片数据
    用密码密码拦截
    引用 MySQL集群:主从数据库配置 实现查询负载
    Oracle 对表操作 提示:资源正忙,要求指定nowait
    Jquery一款非好的图片轮换效果
    CodeBlocks集成ObjectiveC开发 Windows下学习ObjectiveC
    查询指定库中所有表
  • 原文地址:https://www.cnblogs.com/aoximin/p/15170748.html
Copyright © 2020-2023  润新知