会用redis吗?那还不快来了解下redis protocol

简介

redis是一个十分优秀的软件,它能够用作内存数据库或许缓存。由于他的优秀功能,redis被应用在许多场合中。

redis是一个客户端和服务器端的形式,客户端和服务数据库系统概论第五版课后答案器端是经过TCP安全模式协议进行衔接的,客户端将恳求数据发送到服务器端,服务器端将恳求回来给客户端软件商店下载。这样一个恳求流程就完成了。

当然在最开端的时分,由于用的人很少,系统还不行安稳,经过TCP协议传输的数据不规范的。可是当用的效率计算公式人越来越多,尤其是希数据库查询语句望开发适用于不同言语和平台的redis客户端的时分软件商店,就要考虑到数据库系统工程师兼容性的问题了。

这时分客户端和服务器端就需求一个一致的交互协议,关于redis来说这个通用的交互协议就叫做Redis serialization protocol(RESP)服务器租用

RESP是在Redis 1.2版别中引入的,并在Redis 2.0中成为了安全教育日与 Redis 服务器通信的规范方法。

这便是说,从Re效率的英文di软件库s 2.0之后,就能够依据redis protocol协议开发出自己的redis客户端了。

redis的高级用法

一般来说,redis的客户端和服务器端组成的是一个恳求-服务器内存和台式机内存区别呼应的形式,也便是说软件技术专业客户端向服服务器怎么搭建务器端发送恳求,然后软件开发得到服务器端的呼应成果。

恳求和呼应是re效率符号dis中最简单的用法。效率计算公式熟悉redis的朋友或许会想到了两个redis的高级用法,这两个用法并不是效率高发票查验传统意义上的恳求-呼应形式。

到底是哪两种用法呢?

第一种便是redis支撑pipline,也便是管道操作,管道的优点便是re效率符号dis客户端能够一次性向服务器端发送多条指安全教育平台登录入口令,然后等候服务器端的回来。

第二种re数据库设计dis还支撑Pub/Sub,也便是播送模型,在这一种状况下,就不是恳求和呼应的形式了,在Pub/Sub下,切换成了服务器端推送的形式。

Redis中的pipline

为什么要用pipline呢?

由于redis是一个典型的恳求呼应形式,咱效率英文翻译们来举个常见的incr指令的例子:

Client: INCR X
Se软件工程rve服务器内存和台式机内存区别r: 1
Client: INCR X
Server: 2
Client: INCR X
Server: 3
Client: INCR X
Server: 4

数据库系统工程师实上客户端只想得到终究的成果,可是每次客户端都效率是什么意思需求等候服务器端回来成果之后,才能发送下一次的指令。这样就会导致一个叫做RTT(Round Trip Time)的时刻浪费。

虽然效率意识方面存在的问题每次RTT的时刻不长,可是累计起来也是一个十分客观的数字。

那么可不能服务器地址够将一切的客服务器租用户端指令放在一起发送给服务器呢? 这个优化就叫做Pipeline。

pieplin安全生产法e的意思便软件工程专业是客户端能够在没有收到服务器端回来的时分持续向服务器端发送指令。

上面的指令能够用pi效率的英文pline进安全教育手抄报行如下改写:

(printf "INCR XrnINCR XrnINCR XrnINCR Xrn"; sleep 1) | nc localhost 6379
:1
:2
:3
:4

由于redi服务器租用s服务器支撑TCP协议进行衔接,所以咱们能服务器操作系统够直接用nc连到redis服务器中执行指令。

在运用pipline的时分有一点要注意,由于redis服务器会将恳求的成果缓数据库查询语句存在服务器端,等到pipline中的一切指令都执行结束之后再一致回来,所以假如服务器端回来的数据比较多的状况下,需求考虑内存占用的问题。

那么pip效率集line仅仅是为了减少RTT吗效率的拼音

熟悉操作系统的朋友或许有听说过用户空间和操作系统空间的概念,从数据库设计用户输入读取数据然后再写入到系统空间中,软件工程专业这儿触及到了一个用户空间的切换,在IO操作中,这种空间切换或许复服务器是什么制是比较耗时的,假如软件开发频繁的进行恳求和呼应,就会造成这种频繁的空间切换,然后降低了系统的功率

运用pipline能够一次性发送多条指令,然后有用防止空间的切换行为。

Redis中的Pub/Sub

和Pub/Sub相安全生产法关的指令是SU软件商店下载BSCRIBE, UNSUBSCRIBE软件技术专业 和 PUBLISH。

为什么要用Pub/Sub呢?其首要的目的安全模式便是解耦,在Pub/Sub中音讯发送方不需求知道详细的接收方的地址,同样的关于音讯接收方来说,也不需求知道详细的音讯发送方的地址。他们只需求知道相关的主题即可。

subscribe和publish的指令比较简单,咱们举一个例子,首先是客户端subscribe topic:

redis-cli -h 127.0.0.1
127.0.0.1:6379> subscribe topic
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "topic"
3) (integer) 1

然后在另外一个终端服务器内存条可以用在台式机上吗,调用publish指令:

redis-cli -h 127.0.0.1
127.0.0.1:6379> publish topic "what is your name?"
(integer) 1

能够看到客户端会收到下面的音讯:

1) "message"
2) "topic"
3) "what is your name?"

RESP protocol

RESP协议有5种类型,分别是imple Strings, Error效率s, Integers, Bulk Strings 和 Arrays。

不同的类型服务器系统以音讯中的第一个byte进行区数据库设计分,如下所示:

类型第一个byte
Simple Strings+
Errors
Integers:
Bulk Stri效率英文翻译ngs$
Arrays*

protocol中不同的部分以 “rn” (CRLF)来进行差异。

Simple Strings

Simple Strings的意思是简单的字符串。

通常用在服务器安全模式端的回来中,这种音讯的格局便是”+”加上文本音讯,最终以”r效率是什么意思n”结束。

比方软件工程服务器端回数据库软件来OK,那么对应的音讯便是:

"+OKrn"

上面的音讯是一个非二进制安全的音讯,假如想要发送二进制安全的音讯,则能够运用Bulk Strings。

什么是非二进制安全的音讯呢?关于Simple Strings来说,由于音讯是以”rn”结束,所以音讯中间不能包括”rn”这两个特别字符,否则就会产生过错的意义。

Bulk Strings

Bulk Strings是二进制安全的。这是由于Bulk St软件工程rings包括了一个字符长度字段,由所以依据长度来判别字符长度的,所以并不存在依据字符中某个特定字符来判别是否字符结束的缺陷。

详细而安全生产法言Bulk Strings的结构是”$”+字符串长度+”rn”+字符串+”rn”。

以OK为例,假如以Bulk Strings来表明,则如下所示:

"$2rnokrn"

Bulk String安全教育手抄报s还能够包括空字符串:

"$0rnrn"

当然还能够表明不存在的Null值:

"$-1rn"

RESP Integers

这是redis中的整数表明,详细的格安全模式局是”:”+整数+”rn”。

比方18这个整数就能够用下面的格局来表明:

":18rn"

RESP Arrays

redis的多个指令能够以array来表明,服务器端回来的多个值也能够用arrays来表安全教育手抄报明。

RESP Arrays的格局是”*”+数组中的元素个数+其他类似的数安全教育平台登录入口据。数据库管理系统

所以RESP Array服务器内存条可以用在台式机上吗s是一个复合结构的数据。比方一个数组中包括了两个Bul效率计算公式k Strings:”redis”,”se软件技术专业rver”则能够用下面的格局来表明:

"*2rn$5rnredisrn$6rnserverrn"

RESP Arrays中的原始不只能够运用不同类型,还能包括RESP Arrays,也便是array的嵌套:

"*3rn$5rnredisrn$6rnserverrn*1rn$4rngoodrn"

为了便利观察,咱们将上面的音讯格局一下:

"*3rn
$5rnredisrn
$6rnserverrn
*1rn
$4rngoodrn"

上面的音讯是一个包括三个元素的数组,前面两个元素是Bulk Strings,最终一个是包括一个元素的数组。

RESP Errors

最终,RESP还能够表明过错安全工程师音讯。RESP Errors的音讯格局是安全“-“+字符串,如下所示:

"-Err something wrongrn"

一般状况下,”-“后边的第一个单词表软件工程专业明的是过错类型,可是这只是一个约定俗成的规则,并不是RESP协议中数据库有哪几种的强制要求。

另外,经过对比,我们或许会发现RESP Errors和Simple Strings是音讯格局是差不多的。

这种对不同音讯类型的处理是在客户端进行区分的。

Inline commands

假如彻底按RESP协议的要求,当咱们衔接到服务器端的时分需求包括RESP中界说音讯的效率集一切格局,可是这些音讯中包括了额定的音讯效率的拼音类型和回车换行符,效率的拼音所以直接运用协议来执行的话会比较困惑。

所以redis还供给一些安全工程师内联的指令,也便是协议指令的精简版别,这个精简版别去除了音讯类型和回车换行符。

咱们以”get world”这个指令为例。来看下不同方法的衔接状况。

首先是运用re软件商店dis-效率英文翻译cli进行衔接:

redis-cli -h 127.0.0.1
127.0.0.1:6379> get world
"hello"

由于redis-cli是redis的客户端,所以能够直接运用inline command来执行指令。

假如运用tel服务器net服务器价格,咱们也能够运用同样的指令来取得成果:

telnet 127.0.0.1 6379
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
get world
$5
hello

能够看到回来的成果是”$5rnhellorn软件测试“。

假如要运用协议音讯来恳求redis服务器应该怎么做呢?

咱们要恳求的指令是”get world”,将其转化成为RE效率SP的音讯则是:

"*2rn$3rngetrn$5rnworldrn"

咱们尝试一下将上述指令运用安全教育平台登录入口nc传递到redis s服务器erver上:

(printf "*2rn$3rngetrn$5rnworldrn"; sleep 1) |  nc localhost 6379
-ERR Protocol error: expected '$', got ' '

很惋惜咱们得到了ERR,那么是不是不能直接运用RESP音讯格局进行传输呢?当然不是,上面的问题在于$符号是一个特别软件库字符,咱们需求转义一下:

(printf "*2rn$3rngetrn$5rnworldrn"; sleep 1) |  nc localhost 6379
$5
hello

能够看到输出的成果和直接运用redis-cli安全教育平台登录入口一致。

总结

以上便是RESP协议的基本内容和手动运用的例子,有了RESP,咱们就能够依据协议中界说的格局来创立redis客户端。

或许我们又会问软件商店了,为什么只是redis客户端呢?有了协议是不是redis服务器端也安全生产法能够创立呢?答案当然是必定的,只需求依照协议进行音服务器讯传软件技术输即可。首要的问题在于redis服务器端的实现比较复杂,不软件测试是那么简单实现的。

我正在参与技术社区创作者签约方案招募活动,点击链接报名投稿。

发表评论

提供最优质的资源集合

立即查看 了解详情