当前位置:网站首页>Redis入门完整教程:客户端通信协议
Redis入门完整教程:客户端通信协议
2022-07-04 22:29:00 【谷哥学术】
几乎所有的主流编程语言都有Redis的客户端(http://redis.io/clients),
不考虑Redis非常流行的原因,如果站在技术的角度看原因还有两个:第
一,客户端与服务端之间的通信协议是在TCP协议之上构建的。第二,
Redis制定了RESP(REdis Serialization Protocol,Redis序列化协议)实现客
户端与服务端的正常交互,这种协议简单高效,既能够被机器解析,又容易
被人类识别。例如客户端发送一条set hello world命令给服务端,按照RESP
的标准,客户端需要将其封装为如下格式(每行用\r\n分隔):
*3
$3
SET
$5
hello
$5
world
这样Redis服务端能够按照RESP将其解析为set hello world命令,执行后
回复的格式如下:
+OK
可以看到除了命令(set hello world)和返回结果(OK)本身还包含了
一些特殊字符以及数字,下面将对这些格式进行说明。
1.发送命令格式
RESP的规定一条命令的格式如下,CRLF代表"\r\n"。
*< 参数数量 > CRLF
$< 参数 1 的字节数量 > CRLF
< 参数 1> CRLF
...
$< 参数 N 的字节数量 > CRLF
< 参数 N> CRLF
依然以set hell world这条命令进行说明。
参数数量为3个,因此第一行为:
*3
参数字节数分别是355,因此后面几行为:
$3
SET
$5
hello
$5
world
有一点要注意的是,上面只是格式化显示的结果,实际传输格式为如下
代码,整个过程如图4-1所示:
*3\r\n$3\r\nSET\r\n$5\r\nhello\r\n$5\r\nworld\r\n
2.返回结果格式
Redis的返回结果类型分为以下五种,如图4-2所示:
·状态回复:在RESP中第一个字节为"+"。
·错误回复:在RESP中第一个字节为"-"。
·整数回复:在RESP中第一个字节为":"。
·字符串回复:在RESP中第一个字节为"$"。
·多条字符串回复:在RESP中第一个字节为"*"。
我们知道redis-cli只能看到最终的执行结果,那是因为redis-cli本身就是
按照RESP进行结果解析的,所以看不到中间结果,redis-cli.c源码对命令结
果的解析结构如下:
static sds cliFormatReplyTTY(redisReply *r, char *prefix) {
sds out = sdsempty();
switch (r->type) {
case REDIS_REPLY_ERROR:
// 处理错误回复
case REDIS_REPLY_STATUS:
// 处理状态回复
case REDIS_REPLY_INTEGER:
// 处理整数回复
case REDIS_REPLY_STRING:
// 处理字符串回复
case REDIS_REPLY_NIL:
// 处理空
case REDIS_REPLY_ARRAY:
// 处理多条字符串回复
return out;
}
例如执行set hello world,返回结果是OK,并不能看到加号:
127.0.0.1:6379> set hello world
OK
为了看到Redis服务端返回的“真正”结果,可以使用nc命令、telnet命
令、甚至写一个socket程序进行模拟。下面以nc命令进行演示,首先使用
nc127.0.0.16379连接到Redis:
nc 127.0.0.1 6379
状态回复:set hello world的返回结果为+OK:
set hello world
+OK
错误回复:由于sethx这条命令不存在,那么返回结果就是"-"号加上错
误消息:
sethx
-ERR unknown command 'sethx'
整数回复:当命令的执行结果是整数时,返回结果就是整数回复,例如
incr、exists、del、dbsize返回结果都是整数,例如执行incr counter返回结果
就是“:”加上整数:
incr counter
:1
字符串回复:当命令的执行结果是字符串时,返回结果就是字符串回
复。例如get、hget返回结果都是字符串,例如get hello的结果
为“$5\r\nworld\r\n”:
get hello
$5
world
多条字符串回复:当命令的执行结果是多条字符串时,返回结果就是多
条字符串回复。例如mget、hgetall、lrange等命令会返回多个结果,例如下面
操作:
首先使用mset设置多个键值对:
mset java jedis python redis-py
+OK
然后执行mget命令返回多个结果,第一个*2代表返回结果的个数,后面
的格式是和字符串回复一致的:
mget java python
*2
$5
jedis
$8
redis-py
有一点需要注意,无论是字符串回复还是多条字符串回复,如果有nil
值,那么会返回$-1。
例如,对一个不存在的键执行get操作,返回结果为:
get not_exist_key
$-1
如果批量操作中包含一条为nil值的结果,那么返回结果如下:
mget hello not_exist_key java
*3
$5
world
$-1
$5
jedis
有了RESP提供的发送命令和返回结果的协议格式,各种编程语言就可
以利用其来实现相应的Redis客户端,后面两节将介绍Java和Python两个编程
语言的Redis客户端。
边栏推荐
- 2022-07-04: what is the output of the following go language code? A:true; B:false; C: Compilation error. package main import “fmt“ func main() { fmt.Pri
- Advanced area a of attack and defense world misc Masters_ good_ idea
- It is said that software testing is very simple, but why are there so many dissuasions?
- Introducing QA into the software development lifecycle is the best practice that engineers should follow
- 新版判断PC和手机端代码,手机端跳转手机端,PC跳转PC端最新有效代码
- 啃下大骨头——排序(二)
- 模拟摇杆控制舵机
- Unity Xiuxian mobile game | Lua dynamic sliding function (specific implementation of three source codes)
- 环境加密技术解析
- [Yugong series] go teaching course 003-ide installation and basic use in July 2022
猜你喜欢
堆排序代码详解
攻防世界 MISC 进阶 glance-50
Logo Camp d'entraînement section 3 techniques créatives initiales
It is said that software testing is very simple, but why are there so many dissuasions?
Logo special training camp section 1 Identification logo and logo design ideas
SPSS installation and activation tutorial (including network disk link)
2022-07-04: what is the output of the following go language code? A:true; B:false; C: Compilation error. package main import “fmt“ func main() { fmt.Pri
蓝队攻防演练中的三段作战
攻防世界 MISC 進階區 Erik-Baleog-and-Olaf
Advanced area a of attack and defense world misc Masters_ good_ idea
随机推荐
关于栈区、堆区、全局区、文字常量区、程序代码区
Practice and principle of PostgreSQL join
攻防世界 MISC 进阶区 hit-the-core
Jvm-Sandbox-Repeater的部署
Logo special training camp section 1 Identification logo and logo design ideas
新版判断PC和手机端代码,手机端跳转手机端,PC跳转PC端最新有效代码
Serial port data frame
Recommendation of mobile app for making barcode
醒悟的日子,我是怎么一步一步走向软件测试的道路
The sandbox has reached a cooperation with digital Hollywood to accelerate the economic development of creators through human resource development
Business is too busy. Is there really no reason to have time for automation?
The proofreading activity of data science on the command line second edition was restarted
Now MySQL cdc2.1 is parsing the datetime class with a value of 0000-00-00 00:00:00
Unity vscode emmylua configuration error resolution
Detailed explanation of heap sort code
Google Earth Engine(GEE)——以MODIS/006/MCD19A2为例批量下载逐天AOD数据逐天的均值、最大值、最小值、标准差、方差统计分析和CSV下载(北京市各区为例)
Breakpoint debugging under vs2019 c release
页面关闭前,如何发送一个可靠请求
繁華落盡、物是人非:個人站長該何去何從
About stack area, heap area, global area, text constant area and program code area