Redis协议规范简介

news2025/1/15 6:21:37

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.coloradmin.cn/o/1853914.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【漏洞复现】畅捷通T+ keyEdit.aspx SQL漏洞

0x01 产品简介 畅捷通 T 是一款灵动,智慧,时尚的基于互联网时代开发的管理软件,主要针对中小型工贸与商贸企业,尤其适合有异地多组织机构(多工厂,多仓库,多办事处,多经销商)的企业,…

【华东南AWDP】第十七届全国大学生信息安全竞赛 CISCN 2024 创新实践能力赛区域赛 部分题解WP

前言:这次区域赛AWDP安恒作为支持,赛制风格遵循安恒,一小时check一次。室温35在室内坐了8小时,午饭是藿香正气水拌冰水。这场总体下来中规中矩吧。 WEB-welcome-BREAK CtrlU拿到flag WEB-submit-BREAK 文件上传,简单…

sql server 非sa账号配置发布订阅

如果有些源端环境,sa账号被禁用,或者有其他问题,那可以按以下步骤操作。 使用高权限账户登录,另外需要拥有源端windows用户管理员的账号和密码 表发布订阅成功的前提:发布的表必须有主键。 创建一个专门用于发布订阅的…

卤货商家配送小程序商城是怎样的模式

无论生意大小、打造品牌都是必要的一步,只要货品新鲜、味道高、性价比高,其新客转化/老客复购数量都不少,卤货种类多且复购多个单独/聚会场景,以同城主要经营,也有部分品牌有外地食品配送需要。 想要进一步品牌传播、…

多线程与高并发- Synchronized锁

简介 synchronized 是 Java 语言的一个关键字,它允许多个线程同时访问共享的资源,以避免多线程编程中的竞争条件和死锁问题。synchronized可以用来给对象或者方法进行加锁,当对某个对象或者代码块加锁时,同时就只能有一个线程去执…

Spring Cache常见问题解决

目录 一 报错:Null key returned for cache operation 二 报错:类型转换异常 三 取出的数据为null 一 报错:Null key returned for cache operation 这里报错有两种情况: 第一,如果你在新增的方法上使用Cacheable注解,那么肯定是…

chat使用

1.问题,Youve hit your usage limit. Please try again later. 2024年6月22号,提示达到使用限制次数。 一直用免费的,第一次遇见这个提示。 据说月初会重置。 感觉这个月也没有用多少次,怎么就达到限制了。 还有就是&#…

godot所有2D节点介绍

五十个2D节点介绍 2D节点介绍 前言一、Node2D二、sprite2D三、AnimatedSprite2D四、Camera2D五、PhysicsBody2D六、 RigidBody2D七、CharacterBody2D八、StaticBody2D九、joint2D十、DampedSpringJoint2D十一、GrooveJoint2D十二、PinJoint2D十三、Area2D十四、AnimatableBody2…

day3-xss漏洞(米斯特web渗透测试)

day3-xss漏洞(米斯特web渗透测试) XSSXss种类三种反射型1.反射型xss2.存储型xss3.DOM型xss XSS Xss有一部分是前端的有一部分不是前端的,我们来看一下,昨天的HTML注入修复方法应灵活使用。 HTML注入是注入一段HTML,那…

android studio 模拟器文件查找

android studio 模拟器文件查找 使用安卓模拟器下载文件后通常无法在系统硬盘上找到下载的文件,安卓 studio studio 其实提供了文件浏览工具,找到后可以直接使用 Android studio 打开 打开 Android studioview 菜单view > Tool Windows > Device…

三阶段复习

6.21 静态库与动态库 库有两种:静态库(.a、.lib)和动态库(.so、.dll)。所谓静态、动态是指链接。静态库在链接期把整个库文件都拷贝到可执行文件中,而动态库在链接期只是把索引文件拷贝到可执行文件中&…

数据结构~~时间、空间复杂度

目录 一、什么是数据结构 什么是算法 算法的复杂度 二、时间复杂度 三、空间复杂度 四、总结 一、什么是数据结构 数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的 数据元素的集合。 数据结构关注的是数据的逻辑结…

爬虫笔记14——爬取网页数据写入MongoDB数据库,以爱奇艺为例

下载MongoDB数据库 首先,需要下载MongoDB数据库,下载的话比较简单,直接去官网找到想要的版本下载即可,具体安装过程可以看这里。 pycharm下载pymongo库 pip install pymongo然后在在python程序中我们可以这样连接MongoDB数据库…

继电器十大品牌供应商

继电器是常用的元器件之一,如下是优秀供应商。 继电器品牌-中间继电器品牌-安全继电器品牌-固态继电器哪个品牌比较好-Maigoo品牌榜

【html】用html+css模拟Windows右击菜单

效果图&#xff1a; 在这个示例中&#xff0c;我为每个.second-list添加了一个.sub-menu的<div>&#xff0c;它包含了子菜单项。当鼠标悬停在.second-list上时&#xff0c;.sub-menu会显示出来。你可以根据需要调整这个示例以适应你的具体需求。 记住&#xff0c;这只是…

「动态规划」如何解决单词拆分问题?

139. 单词拆分https://leetcode.cn/problems/word-break/description/ 给你一个字符串s和一个字符串列表wordDict作为字典。如果可以利用字典中出现的一个或多个单词拼接出s则返回true。注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复…

conda下安装32位版本python

前言&#xff1a;当前主流的系统为64bit系统&#xff0c;conda软件为64bit软件&#xff0c;因此使用conda创建虚拟环境安装python时默认安装的python为64bit版本&#xff0c;但部分研发场景需要调用32bit依赖&#xff0c;只能使用32bit的python&#xff0c;因此需要安装32bit的…

36.远程注入到入口点注入

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 上一…

ViT:5 Knowledge Distillation

实时了解业内动态&#xff0c;论文是最好的桥梁&#xff0c;专栏精选论文重点解读热点论文&#xff0c;围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型重新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;…

操作系统实验四:openEuler安装(openEuler配置静态网络、编写C或C++)

目录 一、实验要求 二、具体任务安排 1.安装openEuler &#xff08;1&#xff09;下载openEuler镜像 &#xff08;2&#xff09;使用vmware安装openEuler 2.在openEuler中编写C或者C测试程序 &#xff08;1&#xff09;安装g环境 &#xff08;2&#xff09;开始程序编码…