闲话少说直接干。

redis的协议到底是什么?
Redis的协议叫做RESP(redis序列化协议)与redis服务器进行通讯。是专门为redis设计的一套序列化协议.
这个协议其实在redis的1.2版本时就有了,但是到了redis2.0才最终成为redis通讯协议的标准。
RESP的特点:

1.RESP可以序列化不同的数据类型,例如整数,字符串,数组。还有一种特定的错误类型。请求以字符串数组的形式从客户端发送到Redis服务器,这些字符串表示要执行的命令的参数。Redis使用特定于命令的数据类型进行回复。

2.RESP是二进制安全的,并且不需要处理从一个进程传输到另一个进程的批量数据,因为它使用前缀长度来传输批量数据。注意:此处概述的协议仅用于客户端-服务器通信。Redis
Cluster使用不同的二进制协议以在节点之间交换消息。

RESP协议说明
RESP支持以下数据类型的序列化协议:简单字符串,错误,整数,大容量字符串和数组。
RESP在Redis中用作请求-响应协议的方式如下:
1.客户端将命令作为大容量字符串的RESP数组发送到Redis服务器。
2.服务器根据命令实现以RESP类型之一进行回复。
在RESP中,某些数据的类型取决于第一个字节:
对于简单字符串,答复的第一个字节为“ +”
对于错误,回复的第一个字节为“-”
对于整数,回复的第一个字节为“:”
对于批量字符串,回复的第一个字节为“ $”
对于数组,回复的第一个字节为“ ”
在RESP中,协议的不同部分始终以*“ \ r \ n”(CRLF)**终止。

redis的通讯协议(补充,数据类型的序列化协议)稍显枯燥可略过
前面我们说到了resp数据类型的序列化协议分为五种。现在我们就来仔细唠唠这五种的含义。

RESP简单字符串

简单字符串的编码方式如下:一个加号,后跟一个不能包含CR或LF字符的字符串(不允许换行),以CRLF终止(即“ \ r \ n”)。
简单字符串用于以最小的开销传输非二进制安全字符串。例如,许多Redis命令在成功后仅回答“

OK”为了发送二进制安全的字符串,请使用RESP批量字符串。当Redis用简单字符串答复时,客户端库应向调用者返回一个字符串,该字符串由’+'之后的直到字符串末尾的第一个字符组成,不包括最后的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位整数范围内。
为了返回true或false,还广泛使用Integer答复。例如,像EXISTS或SISMEMBER这样的命令将为true返回1,为false返回0。
如果实际执行了操作,则其他命令(如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(回车换行/r/n)终止。

实际的字符串数据。 最后的CRLF。

因此,字符串“ foobar”的编码如下:
“$6\r\nfoobar\r\n”
当一个空字符串只是:
“KaTeX parse error: Can't use function '\r' in math mode at position 2:
0\̲r̲\n\r\n" 还可以使用RE…-1\r\n”
这称为Null Bulk String。
当服务器以Null Bulk String答复时,客户端库API不应返回空字符串,而应返回nil对象。例如,Ruby库应返回“
nil”,而C库应返回NULL(或在reply对象中设置特殊标志),依此类推。

RESP数组

数组类型可用于客户端向服务端发送命令,同样的当某些命令将元素结合返回给客户端的时候,也是使用数组类型作为回复类型的。它以 “*”
开头,后面跟着返回元素的个数,随后是 CRLF, 再然后就是数组中各元素自己的类型。

技术
©2019-2020 Toolsou All rights reserved,
Java中的lambda表达式如何理解——精简html+css+js制作简单网站首页java作业VHDL——4选1数据选择器C++OpenCV实战——车牌去雾、车牌检测、分割JAVA阶段考内容知识点的梳理计算机组成原理的简单学习java连接数据库实现基本的增删改查2022年第十三届蓝桥杯题解(全)3 4j不是合法的python表达式_3+4j不是合法的Python表达式。