Redis 通讯协议(RESP)

      最后更新:2022-03-03 05:33:52 手机定位技术交流文章

      RESP 协议

      微信公众号:运维开发故事,作者:老郑

      Redis 基于 RESP (Redis Serialization Protocal)协议来完成客户端和服务端通讯的。RESP 本质是一种文本协议,实现简单、易于解析。如下表所示:

      类型

      协议描述

      实例

      网络层

      客户端和服务端通过 tcp/流式套接字来进行通讯,为了 防止粘包 因此命令或数据均以 rn (CRLF) 结尾

      +okrn

      请求

      *<参数数量> CR LF
      <参数字节数量 > CR LF

      <参数的数据> CR LF

      <参数 N 的字节数量 >CR LF
      <参数 N 的数据> CR LF

      *2rn3rngetrn$13rnusername:1234rn。

      见 callSendCommond -> redis AppendConnadnArgv -> redisFromatCommandArgv

      简单字符串回复

      第一个字节+

      +okrn

      错误回复

      第一个字节-

      -ERR unknown command 'sa' rn

      整数回复

      第一个字节:

      :0rn

      批量回复

      第一个字节$

      $6rnfoobarrn 空回复 $-1

      多条批量

      回复

      第一个字节*

      5rn:1rn:2rn:3rn:4rn$6rnfoobarrn, 空回复0rn

      如果客户端和服务端在一台机器上。那么会对通讯协议进行优化,直接走本地回环

      我们可以通过 tcpdump 命令来抓取客户端和服务端请求、响应的数据包, 命令如下:

      我们以一条 `set msg100 1` 这条命令测试一下 ( 我本机是 mac 环境):

      服务端抓包结果如下所示:

      redis-cli 客户端效果:

      图片

      客户端是对显示结果做了转化,在 redis-cli.c 文件中下面是它的部分源码

      我们也可以使用 nc 命令来替代 redis-cli 命令行:

      错误代码

      • Redis 常见的错误代码定义如下:
      • 字符串错误信息 - 共享对象

      命令对象

      redis 命令是使用的是 redisCommand 数据结构来管理的。

      针对sflag标示,这里可以看看 《redis 设计与实现》

      图片

      flag 记录的是 flag 值与 sflag 进行运算的结果,见populateCommandTable函数

      具体命令比较多

      以 set 为例子 {“set”,setCommand,-3, “write use-memory @string”, 0,NULL,1,1,1,0,0,0}

      图片

      参考资料

      • 《Redis 设计与实现》黄健宏

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/19351.html

          热门文章

          文章分类