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.mzph.cn/web/32759.shtml

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

相关文章

【python】python海底捞门店营业数据分析与可视化(数据集+源码+论文)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

pyttsx3:Python文本到语音转换库的全面指南

目录 引言 一、pyttsx3 简介 二、安装 pyttsx3 三、基本用法 四、配置语音属性 五、支持的命令和功能 六、高级用法 结语 引言 在当今的软件开发中,提供语音交互功能已成为提升用户体验的一种重要方式。Python,作为一种广泛使用的编程语言&#x…

JavaSE基础总结复习之面向对象の知识总结

目录 Java语言的基础特点 面向对象 类和对象 类 类的构造 一,发现类 二,发现类的共有属性(成员变量) 三,定义类的成员方法(行为,动词) 四,使用类创建对象 对象…

vue3使用 JSX / TSX语法

一、什么是 JSX / TSX JSX / TSX 语法 JSX 是一种将XML语法嵌入到JavaScript中的语法。在 Vue3 中,我们可以使用JSX语法来编写组件的模板。使用JSX语法可以让我们更加灵活地定义组件的模板,并且可以让我们在编写组件时使用JavaScript的全部语言特性。 …

05-5.5.2 并查集

👋 Hi, I’m Beast Cheng 👀 I’m interested in photography, hiking, landscape… 🌱 I’m currently learning python, javascript, kotlin… 📫 How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以…

【面试干货】HashSet 和 TreeSet 的区别

【面试干货】HashSet 和 TreeSet 的区别 1、实现方式HashSetTreeSet 2、性能添加、删除和查找操作的时间复杂度HashSetTreeSet 3、元素唯一性4、迭代顺序HashSetTreeSet 5、使用场景HashSetTreeSet 6、示例代码 💖The Begin💖点点关注,收藏不…

阅读笔记:明朝那些事儿妖孽横行的宫廷

明朝那些事儿第四部看完了,合上书本给我印象比较深刻的文臣要数王守仁,不愧为明朝的军事家,思想家,文学家,教育家,他经过多年的思索、磨难、追求,终于有一天,在穷乡僻壤,…

Linux的基本指令第二篇

1.cat - 查看文件 语法:cat [选项] [文件] 功能: 查看目标文件的内容 -b 对非空输出行编号 -n对输出的所有行编号 -s不输出多行空行 现有一个文件test.c cat -n test.c cat -b test.c cat -s test.c 创建一个新文件 加入源文件的内容 || …

Python基础教程(三十二):random模块

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝💝💝如有需要请大家订阅我的专栏【Python系列】哟!我会定期更新相关系列的文章 💝💝💝关注!关注!!请…

华为OD刷题C卷 - 每日刷题38(万能字符单词拼写,虚拟理财游戏)

1、(万能字符单词拼写): 这段代码是解决“万能字符单词拼写”的问题。它提供了一个Java类Main,其中包含main方法和getResult方法,以及一个辅助方法success,用于计算使用给定字符chars能拼写出的单词words中…

数据分析:置换检验Permutation Test

欢迎大家关注全网生信学习者系列: WX公zhong号:生信学习者Xiao hong书:生信学习者知hu:生信学习者CDSN:生信学习者2 介绍 置换检验是一种非参数统计方法,它不依赖于数据的分布形态,因此特别适…

flowable 适配达梦数据库(最简单的方式)

只需要引入一个 jar 包,就可以轻松实现 flowable 对达梦数据库的适配。 参考如下博客: SpringBoot 中的 Liquibase 适配达梦数据库(DM)和 Flowable 工作流_liquibase 达梦数据库-CSDN博客 SpringBoot 中的 flyway 支持达梦数据库…

Linux——man帮助命令

一、man 获得帮助信息 基本语法:man [命令或配置文件] (功能描述:获得帮助信息) 查看 ls 命令的帮助信息 [roothadoop101 ~]# man ls man [数字] [函数] 1、Standard commands (标准命令) 2、System…

lvgl v8 个人总结

1. lv_group_remove_all_objs(g);//!!移除组所有对象,也需要再次设置默认组。默认组的作用,和一个一个的添加组,没有本质区别。 2. lv_group_del(g);//这个会同时删除组,即切断了输入设备与组的绑定。所以之后需要重新creat。&…

使用 select 进行 UART 通信的注意事项

文章目录 引言UART 通信中的 select 函数select 函数的工作原理使用 select 进行 UART 通信的注意事项示例代码 引言 UART(Universal Asynchronous Receiver/Transmitter)是一种用于异步串行通信的硬件协议,常用于计算机和外设之间的数据交换…

Apple创始人斯蒂夫乔布斯2005年在斯坦福大学的毕业典礼演讲:Steve Jobs‘ 2005 Stanford Commencement Address

Steve Jobs’ 2005 Stanford Commencement Address Link: https://www.youtube.com/watch?vUF8uR6Z6KLc and https://www.youtube.com/watch?vHd_ptbiPoXM 文章目录 Steve Jobs 2005 Stanford Commencement AddressSummaryVocabularyTranscriptConnecting the dotsLove and …

从函数逼近角度理解神经网络、残差连接与激活函数

概述 最近思考激活函数的时候,突然想到神经网络中残差连接是不是和函数的泰勒展开很像,尤其是在激活函数 f ( x ) x 2 f(x)x^2 f(x)x2时(这个激活函数想法来源于 f ( x ) R e L U 2 ( x ) [ 3 ] f(x)ReLU^2(x)[3] f(x)ReLU2(x)[3]),所以验…

VC++支持断点续下或续传的功能

VC使用多线程和Socket实现断点续下 一、断点续下的基本原理: 1.断点续传的理解可以分为两部分:一部分是断点,一部分是续传。断点的由来是在下载过程中,将一个下载文件分成了多个部分,同时进行多个部分一起的下载&…

Adaboost集成学习 | Adaboost集成学习特征重要性分析(Python)

目录 效果一览基本介绍模型设计程序设计参考资料效果一览 基本介绍 Adaboost集成学习特征重要性分析(Python)Adaboost(自适应增强)是一种常用的集成学习方法,用于提高机器学习算法的准确性。它通过组合多个弱分类器来构建一个强分类器。在Adaboost中,每个弱分类器都被赋予…

基于LangChain框架搭建知识库

基于LangChain框架搭建知识库 说明流程1.数据加载2.数据清洗3.数据切分4.获取向量5.向量库保存到本地6.向量搜索7.汇总调用 说明 本文使用openai提供的embedding模型作为框架基础模型,知识库的搭建目的就是为了让大模型减少幻觉出现,实现起来也很简单&a…