Redis协议规范简介

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

RESP可以序列化不同的数据类型,如整型,字符串,数组。 还有⼀种特定的错误类型。 请求将要执行的
命令作为字符串数组从Redis客户端发送到Redis服务器。Redis使用特定数据类型的命令进行回复。
RESP是二进制安全的,不需要处理从⼀个进程传输到另⼀个进程的批量数据,因为它使用前缀长度来传输
批量数据。

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

网络层

客户端通过TCP连接到端口6379,虽然RESP在技术上是非TCP特定的,但是在Redis上下文中,协议仅用于TCP连接。

请求——相应模型

Redis接受不同参数组成的命令。这是最简单的模型,但有两个例外:

  • Redis支持流水线操作。因此,客户端可以一次发送多个命令,并等待稍后的回复。
  • Redis客户端处于Pub/Sub时,协议会更改语义并成为推送协议,即客户端不再发送命令,因为服务器会在它们接收到命令时自动向客户端发送新消息。

RESP协议描述

RESP协议在Redis1.2中引入,在2.0中称为Redis服务器通信的标准方式。

支持以下类型:单行字符串、错误信息、整型、多行字符串和数组。

RESP根据通过数据的第一个字节判断它的类型:

  • 单行(Simple Strings)回复:“+”
  • 错误(Errors)信息:“-”
  • 整型数字(Integers):“:”
  • 多行字符串(Bulk Strings): “$”
  • 数组(Arrays): “*”

RESP中,协议的不同部分始终以"\r\n"结束。

注:执行同样的命令,错误和正确的返回类型可能相同也可能不相同。

  • SETNX错误和正确的返回类型一致(Integers),都是以整数的形式返回。
  • INCR错误的时候返回错误信息(Errors),正确的时候返回整型(Integers)。

RESP 单行字符串(+ Simple Strings)

简单字符串按以下方式编码:+号字符,后跟不能包含CR或LF字符的字符串(不允许换行),由CRLF终
止(即“\ r \ n”,对应十六进制 0x0D,0x0A)。

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

"+OK\r\n"

RESP 错误信息(- Errors)

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。

127.0.0.1:6379> SET teacher darren
OK
127.0.0.1:6379> INCR teacher
(error) ERR value is not an integer or out of range

在这里插入图片描述

RESP 整型数据(: Integers)

此类型只是⼀个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 多行字符串($ Bulk Strings)

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

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

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

示例如下:

"$6\r\nfoobar\r\n"
"$0\r\n\r\n"
"$-1\r\n"

最后一种特殊格式表示Null值,不存在。

RESP 数组(* Arrays)

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

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

  • *字符作为第一个字节,后跟数组中的元素个数作为十进制数,后跟CRLF。
  • 数组的每个元素的附加RESP类型。
"*0\r\n"
"*2\r\n$3\r\nfoo\r\n$3\r\nbar\r\n"
"*3\r\n:1\r\n:2\r\n:3\r\n"

发送命令到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 \n LLEN \ r \ n $ 6 \ r \ nmylist \ r \ n整体。

最后给大家推荐一个LinuxC/C++高级架构系统教程的学习资源与课程,可以帮助你有方向、更细致地学习C/C++后端开发,具体内容请见 https://xxetb.xetslk.com/s/1o04uB

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/353760.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wsl报错在BIOS中启用虚拟化

解决: Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All 以高级管理员身份运行powershell,执行如上命令。

在哪可以查到全网的司法诉讼信息?

司法涉诉信息指的是再司法活动中形成的各种记录和资料,涵盖了诉讼案件的立案,审判,执行等各个环节的记录和文件。比如基本案件信息,开庭信息,审判信息,执行信息等。有时候还会涉及到被执行人,司…

4大利好因素释放顺风车市场潜力,嘀嗒出行即将登陆港交所

经历了十多年发展,共享出行行业即将迎来第一个上市公司——专注顺风车和智慧出租车的嘀嗒出行。 近日,嘀嗒出行通过了港交所聆讯,根据招股书,嘀嗒出行2023年顺风车搭乘次数和交易额分别为约1.3亿次和86亿元,同比分别增…

如何设置antv x6中stencil节点的拖动样式?

问题 在设计自定义地图的时候,用到了antv x6 stencil,但是拖动里面的节点时,里面的文字总是总是显示不全,只有68px,如何把宽度设置宽一点呢? 过程 这个问题折磨了半天,最后仔细看看文档&#…

vue-cli 根据文字生成pdf格式文件 jsPDF

1.安装jspdf npm install jspdf --save 2.下载ttf格式文件 也可以用C:\Windows\Fonts下的字体文件,反正调一个需要的ttf字体文件就行,但有的字体存在部分字体乱码现象 微软雅黑ttf下载地址: FontsMarket.com - Download Microsoft YaHei …

XMLXXE实体注入

XML&XXE实体注入 原理 XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。等同于JSO…

PPP-AR代码解析

本文主要解析函数pppamb(); 前面的浮点的基础,可以参考下面的内容,不过解析的不是同一版本代码,逻辑基本一样 RTKLIB中ppp代码解析_rtklib ppp-rtk-CSDN博客 pppamb(){ 1、 ave…

位图法-有效的数独

有效的数独,主要是判断每行每列每宫有无重复元素。 每行每列用二重循环,每宫比较复杂,需要考虑每一宫的坐标与二重循环ij对应关系 行i,每一宫3行,3列 x3*(i/3)j/3 y3*(i%3)j%3

如何覆盖!important修饰的属性

最简单的方法 如果这个!important修饰的属性 是自己的写的,去掉这种写法,使用优先级的方式来写这个属性(.outter .inner 的优先级就会比 。outter的优先级高) 复杂的方法:用魔法打败魔法 但是这个样式来自于全局css&am…

Maven 插件列表详解

Maven 是一个强大的项目管理和构建工具,广泛应用于 Java 项目中。作为一款优秀的构建管理工具,Maven 不仅提供了标准化的项目结构和依赖管理,还通过其丰富的插件系统,极大地扩展了其功能和灵活性。无论是代码编译、测试、打包&…

【NOI-题解】1431. 迷宫的第一条出路

文章目录 一、前言二、问题问题:1431. 迷宫的第一条出路 三、感谢 一、前言 二、问题 问题:1431. 迷宫的第一条出路 类型:深度搜索、回溯、路径打印 题目描述: 已知一 NN 的迷宫,允许往上、下、左、右四个方向行走…

git管理(Linux版本)

在Linux中我们如何把自己的代码上传到gitee中呢,本期将为大家讲解详细的步骤。 目录 查看Linux环境是否存在git工具 在gitee上创建代码仓库 复制仓库的HTTP路径到Linux中 代码上传 在仓库下创建文件或者将文件移动到仓库下 使用三板斧进行文件的上传 add …

网络安全复习笔记

概述 要素 CIA:可用性;完整性;保密性。 可控性;不可否认性;可审查性。 攻击 被动:窃听 - 保密性;监听 - 保密性主动:假冒 - 完整性;重放 - 完整性;改写 -…

2024年6月22日(星期六)骑行谷仓坝

2024年6月22日 (星期六) 骑行谷仓坝,早8:00到8:30, 龙泉小学门口(北京路尽头,高架桥下),9:00准时出发 【因迟到者,骑行速度快者,可自行追赶偶遇。】 偶遇地点:集合 ,家住东&#xf…

phpStudy安装sqli-labs

phpStudy安装sqli-labs git地址:https://github.com/Audi-1/sqli-labs 点击管理–>根目录 将git下载的sqli-labs文件放进去并解压 进入sql-connections修改 修改db-creds.inc文件为自己数据库的账号密码 更改php版本为5.*,因为这个程序只能在php 5.…

《庆余年》在前,《玫瑰的故事》在后,阅文发现“新大陆”?

奋笔疾书的网文作家,即将迎来网络文学的高光时代。 近日,阅文集团于安徽省举办2024阅文创作大会。现场数据显示,2023年阅文活跃作家平均收入增长32%,创造近五年最大增幅。其中,中位数作家收入增幅达135%,已…

ECharts 雷达图案例001-自定义节点动画

ECharts 雷达图案例001-自定义节点动画 引言 在数据可视化的领域中,ECharts 提供了一种强大的工具来展示多维数据。本文将介绍如何使用 ECharts 创建一个自定义节点样式的雷达图,让数据展示更加生动和个性化。 效果预览 通过自定义节点样式&#xff…

echarts 折线图 实现某两个点之间不要连线

通过插入null或NaN的数据点来实现"断开"的效果 const data [[a, 1], [b, 2], [c, 3], [d, 4], [e, 5]] data.splice(2, 0, NaN) option {xAxis: {type: "category",data: [a, b, c, d, e]},yAxis: {},series: [{data,type: "line"}] }

【Matlab编程学习】 | matlab语言编程基础:常用图形绘制基础学习

🎩 欢迎来到技术探索的奇幻世界👨‍💻 📜 个人主页:一伦明悦-CSDN博客 ✍🏻 作者简介: C软件开发、Python机器学习爱好者 🗣️ 互动与支持:💬评论 &…

上位机图像处理和嵌入式模块部署(h750 mcu和usb虚拟串口)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 对于mcu usb而言,大部分情况下,它和上位机之间的关系都是device的关系。一般usb,可以分成host和device。如果mc…