当前位置:网站首页>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客户端。
边栏推荐
- 高中物理:直线运动
- POM in idea XML dependency cannot be imported
- Logo special training camp section 1 Identification logo and logo design ideas
- Three stage operations in the attack and defense drill of the blue team
- 面试必备 LeetCode 链表算法题汇总,全程干货!
- Domestic database chaos
- 测试必会:BUG的分类及推进解决
- 蓝队攻防演练中的三段作战
- Tla+ introductory tutorial (1): introduction to formal methods
- 醒悟的日子,我是怎么一步一步走向软件测试的道路
猜你喜欢
Unity修仙手游 | lua动态滑动功能(3种源码具体实现)
Domestic database chaos
Attack and defense world misc advanced area ditf
攻防世界 MISC 进阶区 Ditf
Attack and defense world misc advanced grace-50
攻防世界 MISC 高手进阶区 001 normal_png
SPSS安装激活教程(包含网盘链接)
UML图记忆技巧
Erik baleog and Olaf, advanced area of misc in the attack and defense world
Breakpoint debugging under vs2019 c release
随机推荐
高中物理:直线运动
集群的概述与定义,一看就会
共创软硬件协同生态:Graphcore IPU与百度飞桨的“联合提交”亮相MLPerf
Erik baleog and Olaf, advanced area of misc in the attack and defense world
都说软件测试很简单有手就行,但为何仍有这么多劝退的?
MYSQL架构——逻辑架构
Unity修仙手游 | lua动态滑动功能(3种源码具体实现)
More than 30 institutions jointly launched the digital collection industry initiative. How will it move forward in the future?
【愚公系列】2022年7月 Go教学课程 003-IDE的安装和基本使用
Flask 上下文详解
9 - 类
Apachecn translation, proofreading, note sorting activity progress announcement 2022.7
POM in idea XML dependency cannot be imported
Unity vscode emmylua configuration error resolution
MD5 tool class
UML diagram memory skills
MYSQL架构——用户权限与管理
Analysis of environmental encryption technology
Test will: bug classification and promotion solution
On-off and on-off of quality system construction