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协议规范(译文) 的相关文章

  • Zabbix 5.4客户端安装

    通过前面的操作 xff0c 相信大家的zabbix server已经能够正常的运行起来了 xff0c 但是仅有zabbix server是不完整的 xff0c server的目标是监控其他的主机 xff0c 而并非只监控自身 xff0c 所
  • Linux中kill -2、kill -9等区别 && kill signal汇总

    xfeff xfeff kill号令用于终止指定的过程 xff08 terminate a process xff09 xff0c 是Unix Linux下过程经管的常用号令 凡是 xff0c 我们在须要终止某个或某些过程时 xff0c 先
  • Linux下查找文件(find、grep命令)

    目录 一 find命令 1 按文件名 2 按文件类型查询 3 按照文件大小查找 4 按照文件日期查找 4 1按照创建日期查找 4 2按照修改日期查找 4 3按照访问日期查找 5 按深度查找 5 1查找起始点以下n层的目录 xff0c 不超过
  • 深度剖析数据在内存中的存储

    小编认为要想成为一个好的程序员 xff0c 不能仅仅只做到会使用 xff0c 而要做到理解其本质 做到可持续发展 接下来小编会向大家介绍数据在内存中究竟是如何存储与运算的 xff0c 也算是修炼内功了吧 目录 一 数据类型介绍 1 整型家族
  • Linux下进程控制详解

    目录 一 进程创建 1 1 初识fork 1 2 函数返回值 1 3 写时拷贝技术 1 4 fork函数的使用场景 1 5 fork函数的失败原因 二 进程终止 2 1 进程退出场景 2 2 进程退出码 2 3 进程正常退出方法 2 3 1
  • 基础IO详解

    目录 一 系统文件IO 1 1 open 1 1 1 open的第一个参数 1 1 2 open的第二个参数 1 1 3 open的第三个参数 1 1 4 open的返回值 1 2 close 1 3 write 1 4 read 二 文件
  • HTTPS协议

    一 HTTPS介绍 HTTPS是 个应用层协议 xff0c 是在HTTP协议的基础上引入了加密层 HTTP协议内容都是按照文本的方式明文传输 xff0c 这就导致在传输过程中可能出现被篡改的情况 二 加密 2 1 加密概念 加密就是把明文
  • 传输层 — UDP协议

    目录 一 传输层 1 1 端口号 1 2 关于端口的常见问题 1 3 netstat amp amp pidof 二 UDP协议 2 1 UDP协议格式 2 2 UDP协议特点 2 3 UDP缓冲区 2 4 基于UDP的应用层协议 一 传输
  • 传输层——TCP协议

    目录 一 初步认识 二 TCP协议格式 2 1 初识协议格式 2 2 序号与确认序号 2 3 16位窗口大小 2 4 六个标志位 三 确认应答机制 四 超时重传机制 五 连接管理机制 5 1 三次挥手 5 2 四次挥手 六 流量控制 七 滑
  • Android 8.1 App开机自启动、注册为无障碍服务、实现悬浮窗

    xff08 欢迎转载 xff0c 只需注明本文来源 xff1a https blog csdn net actionwind article details 103619688 xff09 以下各方法大多来自于网上诸多朋友的无私分享 xff
  • 安卓的ATV系统

    Android系统根据是否需要认证分为AOSP系统和ATV系统 AOSP Android开源系统 xff0c 全称为Android Open Source Project ATV 产品依照 Android TV 制式标准提供统一的操作体验
  • ubuntu18 为什么安装的时候选择自动登陆,但是还是不能自动登陆呢

    2019 03 12 16 16 1 点击右上角的向下三角形 2 在出现的对话框里面 xff0c 点击右下角的扳手图标 3 点击 隐私 gt 锁屏 4 自动锁屏 L xff0c 保持不变 5 黑屏至锁屏的等的时间 A 改为 30分钟 6 显
  • zabbix 5.4 添加监控主机

    现在我们已经有了一个客户端主机了 xff0c 接下来我们要在zabbix server管理页面添加这台主机 xff0c 让server对agent进行监控 登录zabbix server的管理页面 xff0c 点击左侧操作树的配置选项 xf
  • (转载)环形缓冲区的实现原理(ring buffer)

    环形缓冲区的实现原理 xff08 ring buffer xff09 在通信程序中 xff0c 经常使用环形缓冲区作为数据结构来存放通信中发送和接收的数据 环形缓冲区是一个先进先出的循环缓冲区 xff0c 可以向通信程序提供对缓冲区的互斥访
  • 力扣295. 数据流的中位数

    中位数是有序列表中间的数 如果列表长度是偶数 xff0c 中位数则是中间两个数的平均值 例如 xff0c 2 3 4 的中位数是 3 2 3 的中位数是 2 43 3 2 61 2 5 设计一个支持以下两种操作的数据结构 xff1a voi
  • virt-manager cannot open display问题

    1 首先查看本机sshd是否开启X11转发 grep X11Forwarding etc ssh sshd config X11Forwarding yes X11Forwarding no 2 检查xorg x11是否安装 rpm qa
  • 2023RSAC创新沙盒大赛十强公布,软件供应链与开源软件安全再成焦点

    近日 xff0c 2023RSAC大会公布了第18届RSAC创新沙盒竞赛的决赛 十强企业 软件安全企业Endor Labs成功入围 xff0c 软件供应链安全和开源安全问题再次成为国际焦点 Endor Labs提供了一个可依赖的生命周期管理
  • 如何找到现有研发体系的「内耗问题」?| 谈效风生

    第3期 xff1a 如何找到现有研发体系的 内耗问题 xff1f 在上一期 谈到提升效能 xff0c 我们应该如何下手 xff1f 我们聊到开始做研发效能的四个要点 xff1a 评估现有流程 引入自动化工具 建立度量指标 持续改进 本期就围
  • 「自动化」聊起来简单,做起来难 | 谈效风生

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

    GitChat 作者 xff1a 韩亦乐 前言 我们都知道 xff0c 大学几乎是没有 Web 前端课的 以我所在的大学为例 xff0c 唯一引导我们了解 JavaScript 的也只是 人机界面 和 Web应用开发 选修课 再者 xff0

随机推荐

  • 当我说要做大数据工程师时他们都笑我,直到三个月后……

    作者 xff1a Fickr孫啟誠 原文 xff1a 三个月大数据研发学习计划实战解析 关注微信公众号 xff1a GitChat 技术杂谈 一本正经的讲技术 不要错过文末彩蛋 申明 xff1a 本文旨在为普通程序员 xff08 Java程
  • 带你从零开始,快速学会 Matlab GUI

    本文来自作者 木木小迷哥 在 GitChat 上分享 Matlab GUI 零基础学员快速入门 xff0c 阅读原文 查看交流实录 文末高能 编辑 洛肯 Matlab广泛地应用于数学分析 计算 自动控制 系统仿真 数字信号处理 图像处理 数
  • 修改订单金额!?0.01 元购买 iPhoneX?| Web谈逻辑漏洞

    本文来自作者 肖志华 在 GitChat 上分享 Web 安全恩仇录 xff1a 再谈逻辑漏洞 xff0c 阅读原文 查看交流实录 文末高能 编辑 哈比 Web 漏洞里有 SQL 注入 XSS 等漏洞 xff0c 但是逻辑漏洞等问题也是一个
  • zabbix 5.4 配置Email报警媒介

    我们使用zabbix主要的目标就是实现运维的自动化 xff0c 当被监控的系统出现问题时zabbix能够自动的提示我们 xff0c 要实现这个功能就必需设置报警媒介 本文带领大家配置一个Email报警媒介 我们使用zabbix主要的目标就是
  • 如何开发一款游戏:游戏开发流程及所需工具

    本文来自作者 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
  • 关于handler的内存泄漏的总结

    本文并非完全是原创 有网络上边的 也有自己的思考与总结 本文主要有三部分来介绍handler的介绍 第一 熟悉一下handler的流程 1 当Android程序第一次创建的时候 xff0c 在主线程同时会由ActivityThread 创建
  • Android 设置应用的底部导航栏(虚拟按键)背景颜色

    Android手机机型种类繁多 但是虚拟按键也就是底部的导航栏 不外乎两种设计方式 一种是作为虚拟按键设计到屏幕内部 一种是作为系统按键设计到屏幕外面 对于按键在屏幕内部的机型 因为虚拟按键也是屏幕内容的一部分 它也实际占据屏幕一定的高度
  • Adobe XD使用心得及简单使用技巧

    关于Adobe XD Adobe XD xff0c 全称Adobe Experience Design 这是一款集原型 设计和交互于一体的小清新时代风格的设计软件 虽然传言中 xff0c Adobe XD将会是skech的劲敌 然而在win
  • 生产者消费者问题(代码实现)

    生产者 消费者问题 xff08 也被称为有界缓冲器问题 xff09 是一个典型的例子多线程同步的问题 问题描述了两个进程 xff0c 生产者和消费者 xff0c 谁都有一个共同的 xff0c 固定大小的缓冲区作为一个队列 制片人的工作是生成
  • BIO与NIO的方式实现文件拷贝

    面试题 编程实现文件拷贝 xff08 这个题目在笔试的时候经常出现 xff0c 下面的代码给出了两种实现方案 xff09 span class hljs keyword import span java io FileInputStream
  • Linux上jmeter-server启动失败

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

    我们先来看一下zabbix动作事件的整个流程 xff0c 通过下面的流程图希望大家对zabbix的报警功能要有一个整体上的认识 一个完整的报警功能必要条件 xff1a 监控项 xff1a 用于实时采集主机的数据 xff08 CPU xff0
  • 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序列化协