Redis协议规范(译文)

2023-05-16

原文地址: haifeiWu的博客
博客地址:www.hchstudio.cn
欢迎转载,转载请注明作者及出处,谢谢!

Redis客户端使用名为RESP(Redis序列化协议)的协议与Redis服务器进行通信。 虽然该协议是专为Redis设计的,但它可以用于其他CS软件项目的通讯协议。

RESP是以下几方面的考虑:
- 易于实现
- 快速解析
- 可读性高

RESP可以序列化不同的数据类型,如整型,字符串,数组。 还有一种特定的错误类型。 请求将要执行的命令作为字符串数组从Redis客户端发送到Redis服务器。Redis使用特定数据类型的命令进行回复。

RESP是二进制安全的,不需要处理从一个进程传输到另一个进程的批量数据,因为它使用前缀长度来传输批量数据。

注意: 此处概述的协议仅用于客户端 - 服务器通信。 Redis Cluster使用不同的二进制协议,以便在节点之间交换消息。

网络层

客户端连接到Redis服务器,是创建TCP连接到端口6379。
虽然RESP在技术上是非TCP特定的,但在Redis的上下文中,协议仅用于TCP连接(或类似的面向流的连接,如Unix套接字)。

请求 - 响应模型

Redis接受由不同参数组成的命令。 收到命令后,将对其进行处理并将回复发送回客户端。
这是最简单的模型,但有两个例外:
- Redis支持流水线操作(本文档稍后介绍)。 因此,客户端可以一次发送多个命令,并等待稍后的回复。
- 当Redis客户端处于 Pub/Sub 时,协议会更改语义并成为推送协议,即客户端不再需要发送命令,因为服务器会在它们接收到命令时发自动向客户端发送新消息。

排除上述两个例外,Redis协议是一个简单的请求 - 响应协议。

RESP 协议描述

RESP协议在Redis 1.2中引入,但它成为与Redis 2.0中的Redis服务器通信的标准方式。 这是每一个Redis客户端中应该实现的协议。

RESP实际上是一个支持以下数据类型的序列化协议:单行字符串,错误信息,整型,多行字符串和数组。
RESP在Redis中用作请求 - 响应协议的方式如下:
- 客户端将命令作为字符串数组发送到Redis服务器。
- 服务器根据命令实现回复一种RESP类型数据。

在 RESP 中, 一些数据的类型通过它的第一个字节进行判断:

  • 单行回复:回复的第一个字节是 “+”

  • 错误信息:回复的第一个字节是 “-“

  • 整形数字:回复的第一个字节是 “:”

  • 多行字符串:回复的第一个字节是 “$”

  • 数组:回复的第一个字节是 “*”

此外,RESP能够使用稍后指定的Bulk Strings或Array的特殊变体来表示Null值。
在RESP中,协议的不同部分始终以“\ r \ n”(CRLF)结束。

RESP 单行字符串(简单字符串)

简单字符串按以下方式编码:加号字符,后跟不能包含CR或LF字符的字符串(不允许换行),由CRLF终止(即“\ r \ n”)。

Simple Strings用于以最小的开销传输非二进制安全字符串。 例如,许多Redis命令成功回复时只有“OK”,因为RESP 单行字符串使用以下5个字节进行编码:

"+OK\r\n"

为了发送二进制安全字符串,使用RESP 多行字符串代替。

当Redis使用Simple String回复时,客户端库应该向调用者返回一个字符串,该字符串由“+”之后的第一个字符组成,直到字符串结尾,不包括最终的CRLF字节。

RESP 错误信息

RESP具有错误的特定数据类型。 实际上错误与RESP 单行字符串完全相同,但第一个字符是减号’ - ‘字符而不是加号。

RESP中单行字符串和错误之间的真正区别在于客户端将错误视为异常,组成错误类型的字符串是错误消息本身。
基本格式如下:

"-Error message\r\n"

错误回复仅在发生错误时发送,例如,如果您尝试对错误的数据类型执行操作,或者命令不存在等等。 收到错误回复时,客户端应将异常抛出。

以下是错误回复的示例:

-ERR unknown command 'foobar'
-WRONGTYPE Operation against a key holding the wrong kind of value

“ - ”之后的第一个单词,直到第一个空格或换行符,表示返回的错误类型。 这只是Redis使用的约定,不是RESP错误格式的一部分。

例如,ERR是一般错误,而WRONGTYPE是一个更具体的错误,意味着客户端尝试对错误的数据类型执行操作。 这称为错误前缀,是一种允许客户端理解服务器返回的错误类型的方法,而不依赖于给定的确切消息,这可能随时间而变化。

客户端实现可以针对不同的错误返回不同类型的异常,或者可以通过直接将错误名称作为字符串提供给调用者来提供捕获错误的通用方法。

但是,这样的功能不应该被认为是至关重要的,因为它很少有用,并且有限的客户端实现可能只返回通用的错误条件,例如false。

RESP 整型数据

此类型只是一个CRLF终止的字符串,表示一个以“:”字节为前缀的整数。 例如“:0 \ r \ n”或“:1000 \ r \ n”是整数回复。
许多Redis命令返回RESP 整型,如INCR,LLEN和LASTSAVE。

返回的整数没有特殊含义,它只是INCR的增量编号,LASTSAVE的UNIX时间等等。 但是,返回的整数应保证在有符号的64位整数范围内。

整数回复也被广泛使用,以便返回真或假。 例如,EXISTS或SISMEMBER之类的命令将返回1表示true,0表示false。

如果实际执行操作,其他命令(如SADD,SREM和SETNX)将返回1,否则返回0。

以下命令将回复整数回复:SETNX,DEL,EXISTS,INCR,INCRBY,DECR,DECRBY,DBSIZE,LASTSAVE,RENAMENX,MOVE,LLEN,SADD,SREM,SISMEMBER,SCARD。

RESP 多行字符串

多行字符串用于表示长度最大为512 MB的单个二进制安全字符串。

多行字符串按以下方式编码:

  • 一个“$”字节后跟组成字符串的字节数(一个前缀长度),由CRLF终止。
  • 字符串数据。
  • 最终的CRLF。

所以字符串“foobar”的编码如下:

"$6\r\nfoobar\r\n"

当只是一个空字符串时:

"$0\r\n\r\n"

RESP 多行字符串也可用于使用用于表示Null值的特殊格式来表示值的不存在。 在这种特殊格式中,长度为-1,并且没有数据,因此Null表示为:

"$-1\r\n"

当服务器使用Null 多行字符串回复时,客户端库API不应返回空字符串,而应返回nil对象。 例如,Ruby库应返回’nil’,而C库应返回NULL(或在reply对象中设置特殊标志),依此类推。

RESP 数组

客户端使用RESP 数组将命令发送到Redis服务器。 类似地,某些Redis命令将元素集合返回给客户端使用RESP 数组是回复类型。 一个例子是LRANGE命令,它返回列表的元素。

RESP数组使用以下格式发送:

  • *字符作为第一个字节,后跟数组中的元素数作为十进制数,后跟CRLF。
  • 数组的每个元素的附加RESP类型。

所以空数组就是以下内容:

"*0\r\n"

那么两个RESP批量字符串“foo”和“bar”的数组编码为:

"*2\r\n$3\r\nfoo\r\n$3\r\nbar\r\n"

正如您在数组前面加上* CRLF部分之后所看到的那样,组成数组的其他数据类型将一个接一个地连接起来。 例如,三个整数的数组编码如下:

"*3\r\n:1\r\n:2\r\n:3\r\n"

数组可以包含混合类型,元素不必具有相同的类型。 例如,四个整数和批量字符串的列表可以编码如下:

*5\r\n
:1\r\n
:2\r\n
:3\r\n
:4\r\n
$6\r\n
foobar\r\n

服务器发送的第一行是* 5 \ r \ n,以指定将跟随五个回复。 然后发送构成多重回复项目的每个回复。

Null 数组的概念也存在,并且是指定Null值的替代方法(通常使用Null 多行字符串,但由于历史原因,我们有两种格式)。

例如,当BLPOP命令超时时,它返回一个计数为-1的Null数组,如下例所示:

"*-1\r\n"

当Redis使用Null数组回复时,客户端库API应返回空对象而不是空数组。 这是区分空列表和不同条件(例如BLPOP命令的超时条件)所必需的。

RESP中可以使用数组中嵌套数组。 例如,两个数组的数组编码如下:

*2\r\n
*3\r\n
:1\r\n
:2\r\n
:3\r\n
*2\r\n
+Foo\r\n
-Bar\r\n

第二个元素是Null。 客户端库应返回如下内容:

["foo",nil,"bar"]

注意,这不是前面部分中所述的例外,而只是进一步指定协议的示例。

发送命令到 Redis 服务端

既然熟悉RESP序列化格式,那么编写Redis客户端库的实现将很容易。 我们可以进一步讲述客户端和服务器之间的交互如何工作:

  • 客户端向Redis服务器发送仅由Bulk Strings组成的RESP阵列。
  • Redis服务器回复发送任何有效RESP数据类型作为回复的客户端。

因此,例如,典型的交互可以是以下所示。

客户端发送命令LLEN mylist以获取存储在密钥mylist中的列表长度,服务器回复一个Integer回复,如下例所示(C:是客户端,S:服务器)。

C: *2\r\n
C: $4\r\n
C: LLEN\r\n
C: $6\r\n
C: mylist\r\n
S: :48293\r\n

通常我们将协议的不同部分与换行符分开以简化,但实际的交互是客户端发送 * 2 \ r \ n 4 r nLLEN r n 4   r   n L L E N   r   n 6 \ r \ nmylist \ r \ n 整体。

小结

这是楼主第一次尝试翻译一篇技术文档,相对来说技术文档的英文阅读起来还是比较舒服的,相信有了第一次尝试,之后肯定会越来越顺利。由于楼主水平有限,文章中难免有纰漏,期望小伙伴的指出,感谢……。

参考链接

  • Redis Protocol specification
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis协议规范(译文) 的相关文章

  • Ubuntu 18之vnc连接不上问题(已解决)

    在配置vnc时所以的准备动作已经准备好了 xff0c 该配的文件也配好了 xff0c 但就是一直连接不上 在主机端报time out的错误 xff0c 后来查百度得知vncserver xff1a 1对应5901端口 xff0c 2就是59
  • 「自动化」聊起来简单,做起来难 | 谈效风生

    第4期 xff1a 自动化 聊起来简单 xff0c 做起来难 在上一期 如何找到现有研发体系的 内耗问题 中 xff0c 我们聊了评估现有研发体系 xff0c 正确的找到 体系内耗问题 xff0c 是改变研发体系的第一步 本期我们继续聊下一
  • GitChat·前端 | 从软件工程角度看大前端技术栈

    GitChat 作者 xff1a 韩亦乐 前言 我们都知道 xff0c 大学几乎是没有 Web 前端课的 以我所在的大学为例 xff0c 唯一引导我们了解 JavaScript 的也只是 人机界面 和 Web应用开发 选修课 再者 xff0
  • 当我说要做大数据工程师时他们都笑我,直到三个月后……

    作者 xff1a Fickr孫啟誠 原文 xff1a 三个月大数据研发学习计划实战解析 关注微信公众号 xff1a GitChat 技术杂谈 一本正经的讲技术 不要错过文末彩蛋 申明 xff1a 本文旨在为普通程序员 xff08 Java程
  • 原来这样做,才能向架构师靠近

    说在前面 xff1a 达人课是GitChat的一款轻阅读产品 xff0c 由特约讲师独家发布 每一个课程你都可获得6 12篇的深度文章 xff0c 同时可在读者圈与讲师互动交流 GitChat达人课 xff0c 让技术分享更简单 进入我的G
  • 带你从零开始,快速学会 Matlab GUI

    本文来自作者 木木小迷哥 在 GitChat 上分享 Matlab GUI 零基础学员快速入门 xff0c 阅读原文 查看交流实录 文末高能 编辑 洛肯 Matlab广泛地应用于数学分析 计算 自动控制 系统仿真 数字信号处理 图像处理 数
  • Cordova App 打包全揭秘

    运营专题 零预算引爆个人和企业品牌 原文链接 Selenium 自动化测试从零实战 原文链接 原来这样做 xff0c 才能向架构师靠近 原文链接 TensorFlow on Android xff1a 物体识别 原文链接 TensorFlo
  • Selenium 自动化测试从零实战

    运营专题 零预算引爆个人和企业品牌 原文链接 原来这样做 xff0c 才能向架构师靠近 原文链接 Cordova App 打包全揭秘 原文链接 TensorFlow on Android xff1a 物体识别 原文链接 TensorFlow
  • [运营专题]零预算引爆个人和企业品牌

    文章推荐 Selenium 自动化测试从零实战 原文链接 原来这样做 xff0c 才能向架构师靠近 原文链接 Cordova App 打包全揭秘 原文链接 TensorFlow on Android xff1a 物体识别 原文链接 Tens
  • 图解敏捷教练和 ScrumMaster

    运营专题 零预算引爆个人和企业品牌 原文链接 Selenium 自动化测试从零实战 原文链接 原来这样做 xff0c 才能向架构师靠近 原文链接 Cordova App 打包全揭秘 原文链接 TensorFlow on Android xf
  • TensorFlow on Android:物体识别

    运营专题 零预算引爆个人和企业品牌 原文链接 Selenium 自动化测试从零实战 原文链接 原来这样做 xff0c 才能向架构师靠近 原文链接 Cordova App 打包全揭秘 原文链接 TensorFlow on Android xf
  • Jetson Xavier NX can通信,拒绝误导!

    概述 最近在开发一个网关项目 xff0c 需要调试一些通信接口 网关底板是基于jetson xavier nx设计的 xff0c 所以硬件上许多相似 xff0c 所以我也会基于jetson xavier nx去做一些接口的测试 xff0c
  • TensorFlow on Android:训练模型

    文章推荐 运营专题 零预算引爆个人和企业品牌 原文链接 Selenium 自动化测试从零实战 原文链接 原来这样做 xff0c 才能向架构师靠近 原文链接 Cordova App 打包全揭秘 原文链接 TensorFlow on Andro
  • 深入理解 MySQL 底层实现

    本文来自作者 默默 在 GitChat 上分享 深入理解 MySQL 底层实现 xff0c 阅读原文 查看交流实录 文末高能 编辑 哈比 MySQL 的常用引擎 1 InnoDB InnoDB 的存储文件有两个 xff0c 后缀名分别是 f
  • 修改订单金额!?0.01 元购买 iPhoneX?| Web谈逻辑漏洞

    本文来自作者 肖志华 在 GitChat 上分享 Web 安全恩仇录 xff1a 再谈逻辑漏洞 xff0c 阅读原文 查看交流实录 文末高能 编辑 哈比 Web 漏洞里有 SQL 注入 XSS 等漏洞 xff0c 但是逻辑漏洞等问题也是一个
  • 如何开发一款游戏:游戏开发流程及所需工具

    本文来自作者 goto先生 在 GitChat 上分享 如何开发一款游戏 xff1a 游戏开发流程及所需工具 编辑 哈比 游戏作为娱乐生活的一个方面 xff0c 参与其中的人越来越多 xff0c 而大部分参与其中的人都是以玩家的身份 他们热
  • 如何用 Python 做自动化测试

    本文来自作者 Vant 在 GitChat 上分享 如何用 Python 做自动化测试 编辑 哈比 一 Selenium 环境部署 1 window 环境部署 1 1 当前环境 Win10 64 位系统 xff1b Python3 6 2
  • 我真的要做一辈子的程序员吗?

    本文来自作者 王鹏 在 GitChat 上分享 程序员跳槽时 xff0c 如何正确做好职业规划 xff1f 阅读原文 查看交流实录 编辑 贝吉塔 经常听一些同学说 xff1a 不知道下一份工作该去哪类公司做些什么 xff0c 我的职场人际一
  • 20万到100万年薪的算法工程师有什么区别?

    公元七世纪 xff0c 在车迟国国家气象局组织的一次求雨活动中 xff0c 虎力 鹿力 羊力三位大仙成功地祈下甘霖 xff0c 救黎民于水火中 老国王虽然不明就里 xff0c 却从此尊他们为国师 xff0c 奉道教为圭臬 本世纪 xff0c
  • 在win7下安装ubuntu

    安装VMware 从官网下载VMware workstation full 10 0 4 2249910 exe文件 xff0c 一直点击下一步 xff0c 直到安装成功 安装成功的界面如图所示 xff1a 安装Ubuntu 1 获取发行版

随机推荐

  • 带参数的宏定义 #define

    main c C语言学习 include lt stdio h gt 求和函数 int sum int v1 int v2 return v1 43 v2 宏定义 define 代表要定义一个宏 SUM 宏的名称 v1 v2 参数 xff0
  • 串口编程项目— PX4FLOW 传感器数据接收处理(英文paper直接贴过来)

    写在前面 xff1a 七月份初 xff0c 结束交流生项目 xff0c 向导师申请了个项目 xff0c 关于PX4FLOW传感器的 xff0c serial programming 的java编程 xff0c 下午刚刚提交完paper 写个
  • 电路城(www.cirmall.com)-基于HS1101LF和TC1047A 温湿度传感器模块(硬件+源码+设计说明等)

    电路城 xff08 www cirmall com xff09 本次分享的温湿度传感器模块采用瑞萨电子生产的 R7F0C802 单片机作为控制单元 xff0c 采集温度传感器 TC1047A 输出的电压信号和湿度传感器HS1101LF 电路
  • 服务器后端开发,学什么编程语言?

    服务器后端开发 xff0c 学什么编程语言 xff1f 技术 后台开发 xff0c 目前主流的编程语言是Java xff0c Go语言 xff0c C 43 43 xff0c python 以及php 个人建议学Java xff0c 主流中
  • ROS基础:功能包的创建与编译

    创建 如果你使用的是catkin编译系统 xff0c 那么可以很容易地创建一个功能包 首先进入你的工作空间的src目录下 xff1a cd catkin ws src 然后运行catkin create pkg命令 xff1a catkin
  • 关于TF转换信息(Transforms)的理解

    本文主要内容参考自ROS wiki tf Overview Transformations xff0c 在加入了自己的一些理解的同时 xff0c 我也对原文进行了适当的修改 原文使用Creative Commons Attribution
  • RealSense SDK 开发笔记(一)环境配置

    转载请注明出处 2017 以后的SDK结构必然趋于稳定 xff0c 也就会多一些新特性和新设备的支持 xff0c 配置流程不再变化 2016 2 xff1a 目前SDK版本是2016R1 xff0c 配置过程一模一样 xff0c SDK主要
  • 闭包方法的学习

    相关链接 swift中使用 64 noescape的正确姿势 文档闭包 闭包可以捕获和存储其在上下文中任意常量和变量的引用 被称为包裹常量和变量 Swift会为你管理在捕获过程中涉及到的所有内存操作 在函数章节中介绍的全局和嵌套函数也是特殊
  • CMakeLists常用方法

    我们在编译一个C C 43 43 项目时有时候是需要我们阅读编译脚本来确定编译时的参数 CMakeLists txt是比较常见的编译脚本 xff0c 这里简单介绍几个常用的函数 cmake minimum required 设置cmake的
  • halcon中Image的像素类型

    在学习halcon算子sub image ImageMinuend ImageSubtrahend ImageSub Mult Add 时 xff0c 在样例中遇到了一个操作 This example demonstrates how to
  • GitHub Action构建并推送DockerHub

    前言 偶尔会构建一些自己用的容器 xff0c 之前一直用的是Docker提供的构建服务 xff0c 然而Docker开始收费了 xff0c 那只能另寻他法 之所以不本地构建推送 xff0c 是因为构建的时候经常因为网络问题 xff0c 访问
  • BIO与NIO的方式实现文件拷贝

    面试题 编程实现文件拷贝 xff08 这个题目在笔试的时候经常出现 xff0c 下面的代码给出了两种实现方案 xff09 span class hljs keyword import span java io FileInputStream
  • 一路(16)走来,一起(17)依然同行

    来个自我介绍吧 xff0c 我叫 xff0c 计算机科学与技术专业 xff0c 本科 xff0c 这句话应该是16年整整一年说过最多的 那么我去年整整一年我又有那些收获呢 xff0c so xff0c 我也来个年终总结 xff0c 年初展望
  • 电路城(www.cirmall.com)-学习IoT,BLE编程绝佳平台,nRF52832 BLE(蓝牙低能耗)开发板

    该nRF52832 BLE xff08 蓝牙低能耗 xff09 开发板是一款具有温度 xff0c 湿度 xff0c 环境光和加速度传感器的蓝牙低能耗开发板 该蓝牙开发板具有ARM Cortex M4F CPU的nRF52832 BLE So
  • Linux上jmeter-server启动失败

    贴个广告 楼主的博客已全部搬迁至自己的博客 xff0c 感兴趣的小伙伴请移步haifeiWu与他朋友们的博客专栏 Jmeter server启动失败 xff1a Cannot start Unable to get local host I
  • Mysql的七种join

    对于SQL的Join xff0c 在学习起来可能是比较乱的 我们知道 xff0c SQL的Join语法有很多inner的 xff0c 有outer的 xff0c 有left的 xff0c 有时候 xff0c 对于Select出来的结果集是什
  • shell脚本实现自动保留最近n次备份记录

    贴个广告 楼主的博客已全部搬迁至自己的博客 xff0c 感兴趣的小伙伴请移步haifeiWu与他朋友们的博客专栏 项目中出现的问题 某天上午服务器出现卡顿特别严重 xff0c 页面加载速度奇慢 xff0c 并且某些页面刷新出现404的问题
  • Java实现终止线程池中正在运行的定时任务

    贴个广告 楼主的博客已全部搬迁至自己的博客 xff0c 感兴趣的小伙伴请移步haifeiWu与他朋友们的博客专栏 源于开发 最近项目中遇到了一个新的需求 xff0c 就是实现一个可以动态添加定时任务的功能 说到这里 xff0c 有人可能会说
  • TCP 粘包问题浅析及其解决方案

    最近一直在做中间件相关的东西 xff0c 所以接触到的各种协议比较多 xff0c 总的来说有TCP xff0c UDP xff0c HTTP等各种网络传输协议 xff0c 因此楼主想先从协议最基本的TCP粘包问题搞起 xff0c 把计算机网
  • Redis协议规范(译文)

    原文地址 xff1a haifeiWu的博客 博客地址 xff1a www hchstudio cn 欢迎转载 xff0c 转载请注明作者及出处 xff0c 谢谢 xff01 Redis客户端使用名为RESP xff08 Redis序列化协