Redis协议ITeye - 乐橙lc8

Redis协议ITeye

2019年03月26日12时13分15秒 | 作者: 凌青 | 标签: 协议,一个,指令 | 浏览: 131

客户端经过创立到 6379 端口的 TCP 衔接来衔接到一个 Redis 服务器。每个 Redis 指令或许客户端和服务器之间传输的数据都以\r\n (CRLF)完毕。

Redis可以承受由不同参数组成的指令。只需接收到一个指令,这个指令就会被履行,然后一个答复会被回来给客户端。

新的一致恳求协议

新的一致协议是在Redis1.2中引进的,可是在Redis2.0中成为了与Redis服务器交互的规范办法。在一致协议中一切发送到Redis服务器的参数都是二进制安全的。这是整体格局:

* number of arguments CR LF
$ number of bytes of argument 1 CR LF
 argument data CR LF
$ number of bytes of argument N CR LF
 argument data CR LF

看下这个比方:

*3
mykey
myvalue

这是以上指令以带引号的字符串展示的姿态,这样就可以看到这个恳求中每个字节的精确内容:

"*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$7\r\nmyvalue\r\n"

就像你一会将会看到的,这个格局还会被用在Redis回复中。这个被用于每个参数中的格局$6\r\nmydata\r\n叫做Bulk 回复。Redis实践上运用的一致恳求协议会回来内容列表,叫做。它是由N个不同的Bulk 回复合在一起,而且有一个字符串前缀* argc \r\n其间 argc 是后边参数(Bulk回复)的数量。

Redis会以不同类型的回复对指令进行呼应。可以经过服务器发送的榜首个字节来断定回复的类型:

假如是单行回复,那么榜首个字节是「+」 假如回复的内容是过错信息,那么榜首个字节是「_」 假如回复的内容是一个整型数字,那么榜首个字节是「:」 假如是bulk回复,那么榜首个字节是「$」 假如是multi-bulk回复,那么榜首个字节是「*」

一个状况回复(或许:单行回复)的格局是以「+」最初,以「\r\n」完毕的单行字符串。举个比方:

+OK

客户端库要回来「+」后边的一切内容,这个比方里面是字符串「OK」。

过错的发送办法和状况回复很像。仅有的不同是榜首个字节用「-」代替了「+」。 过错回复只有当一些古怪的工作发作时才会被发送,例如假如你想要用过错的数据类型履行一个操作,或许这个指令不存在等等。所以客户端库应该在接收到一个过错回复的时分抛出一个反常。

这个类型的回复便是一个代表整数以CRLF完毕的字符串,而且用一个字节的字符「:」作为前缀。例如「:0\r\n」,或许「:1000\r\n」都是整形回复。 像INCR或许LASTSAVE指令运用整型回复来回来一个没有特别意义的整型数字。关于INCR来说回来的是添加后的数字,关于LASTSAVE来说是一个UNIX时刻等等。 像EXISTS这样的指令会回来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

Bulk回复

Bulk回复被服务器用来回来一个二进制安全的字符串。

C: GET mykey
S: $6\r\nfoobar\r\n

服务器以这种办法来发送数据:榜首行是一个字节的内容「$」,之后跟着详细内容的字节数,接下来是CRLF,然后详细数据内容被发送,接下来是额定的两个字节的CRLF。服务器实践发送的序列是:

"$6\r\nfoobar\r\n"

假如恳求的内容不存在,那么bulk回复将会运用特别值-1作为数据长度,例如:

C: GET nonexistingkey
S: $-1

当恳求目标不存在,客户端库API不要回来一个空字符串,应该是一个nil目标。举个比方一个Ruby库应该回来「nil」,一个C库应该回来NULL(或许在回复目标中设置一个特别符号),等等。

Multi-bulk回复

像LRANGE这类的指令需求回来多个值(列表中的每个元素是一个值,LRANGE需求回来多个元素)。这经过multiple bulk write来完成,其榜首行指明后边有多少个bulk write。一个multi bulk回复的榜首个字节一直是*。例如:

C: LRANGE mylist 0 3
s: *4
s: $3
s: foo
s: $3
s: bar
s: $5
s: Hello
s: $5
s: World

就像你看到的,multi bulk 回复和运用一致协议发送指令到Redis服务器运用的是相同的格局。 服务器发送的榜首行是*4\r\n,用来指出下面将会有四个bulk回复。然后每个bulk write将会被传送。 假如指定的key不存在,那么这个key被认为具有一个空列表,然后0会做为multi bulk的数量被发送。例如:

C: LRANGE nokey 0 1
S: *0

当指令超时,它将回来值为nil的multi bulk回复。这个类型的multi bulk的数量为-1而且应该被解释为nil值。例如:

C: BLPOP key 1
S: *-1

当这个发作的时分,一个客户端库API应该回来一个nil目标而不是一个空列表。区别一个空的列表和一个过错条件(比方指令的超时条件)是必要的。

Multi-Bulk回复中的Nil元素

一个multi bulk 回复的单个元素可能会存在-1的长度,用来指明这个元素不存在而且不是空字符串。这个可能发作在启用了GET形式选项的SORT指令,而且指定的key不存在。包括一个空元素的multi bulk回复的比方:

S: *3
S: $3
S: foo
S: $-1
S: $3
S: bar

第二个元素是nil。客户端库需求回来如下内容:

["foo",nil,"bar"]
多个指令和管道

一个客户端可以运用相同的衔接来发送多个指令。Redis是支撑管道的,所以客户端可以经过一次写操作发送多个指令,不需求读取服务器的回复才干发送下一个指令。一切的回复可以在最终读取。 通常情况下Redis服务器和客户端之间会有非常快的衔接,所以客户端支撑这个特性不是那么重要,但假如一个运用需求在很短的时刻里发送很多的指令那么运用管道将会非常快。

发送指令的旧协议

在一致恳求协议之前,Redis运用一个不同的协议来发送指令,这个协议依然被支撑由于经过telnet它很简略手写。在这个协议中存在两种指令:

inline 指令: 指令很简略,便是用空格把参数分隔开来的字符串。二进制安满是不可能的。 Bulk 指令: bulk指令和inline指令几乎是相同的,可是最终一个参数为了可以承受二进制安全的内容,所以需求以特别的办法进行处理。 Inline指令

向Redis发送指令最简略的办法是运用inline指令。以下是一个服务器/客户端之间运用inline指令进行交互的比方(服务器以S:作为开端,客户端以C:作为开端)

C: PING
S: +PONG

以下是另一个比方,一个回来整数的inline指令:

C: EXISTS somekey
S: :0

由于「somekey」不存在,所以服务器回来「:0」。 留意EXISTS指令只带有一个参数。多个参数以空格进行分隔。

Bulk指令

当一些指令以inline指令发送的时分为了使最终一个参数支撑二进制安全,需求以一个特别的格局发送。这些指令将会把最终一个参数作为「字节计数器」,然后很多的数据会被发送(这些数据可认为二进制安全,由于服务器知道有多少字节需求读取)。 看下面这个比方:

C: SET mykey 6
C: foobar
S: +OK

这个指令的最终一个参数是「6」。这个指明晰后边数据,字符串「foobar」的字节数。留意即便这些数据被额定的二个字节巨细的CRLF所切断。一切bulk指令的精确格局是:把最终一个参数替换成后边数据的字节数,接下来是数据自身和CRLF。为了可以让程序员愈加明晰的了解,这是上面比方中客户端发送的字符串:

"SET mykey 6\r\nfoobar\r\n"

Redis有一个内部的列表,记录了什么指令是inline,什么指令是bulk,所以你需求参阅这个来发送指令。强烈推荐运用新的一致恳求协议来代替旧的协议。

原文:

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表乐橙lc8立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章

阅读排行

  • 1
  • 2

    Redis协议ITeye

    协议,一个,指令
  • 3
  • 4
  • 5

    Oracle Index 的三个问题ITeye

    索引,运用,数据
  • 6

    检查sqlserver的端口号ITeye

    端口号,能够,看到
  • 7
  • 8

    oracle中userITeye

    字段,运用,数据
  • 9
  • 10