这篇文章主要介绍了Redis中通信协议RESP是怎么实现的,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
RESP
RESP(Redis Serialization Protocol)是Redis序列化协议的简写,该协议是纯文本协议,实现过程简单,解析性能较好。
5种单元类型
Redis协议将传输的数据结构分为5种最小的单元类型,单元结束时统一加上回车换行符号\r\n。
1. 单行字符串以 + 符号开头
例:+hello world\r\n
2. 多行字符串以 $ 符号开头,后跟字符串长度
例:$11\r\nhello world\r\n
多行字符串也可以用于表示单行字符串
3. 整数值以 : 符号开头,后跟整数的字符串形式
例::1024\r\n
4. 错误信息以 - 符号开头
参数类型错误
例: -WRONGTYPE Operation against a key holding the wrong kind of value\r\n
5. 数组以 * 号开头,后跟数组的长度
例:*3\r\n:l\r\n:2\r\n:3\r\n
两种特殊类型
1. NULL
NULL使用多行字符串表示,长度为-1
例:$-1\r\n
2. 空字符串
空串用多行字符串表示,长度填0
例:$0\r\n\r\n
空字符串有两个\r\n,因为两个\r\n之间的就是空串
客户端请求服务端
客户端向服务器发送的指令只有一种格式,就是多行字符串数组。
例如一个简单的set指令 set x x 会被序列化成下面的字符串
*3\r\n$3\r\nset\r\n$1\r\nx\r\n$1\r\nx\r\n
控制台展示如下
*3
$3
set
$1
x
$1
x
服务端响应客户端
服务端响应客户端信息时,将会使用多种数据结构,比客户端发送到服务端时复杂很多,不过即便很复杂,也是上面提到的5种基本类型的组合。
单行字符串响应
127 . 0 .0.1: 6379> set x x
OK
上面的OK就是单行字符串响应(没有双引号),即 +OK
错误响应
127 . 0 . 0.1:6379> incr x
(error} ERR value is not an integer or out of range
对一个字符串进行自增,服务器抛出错误提醒
-ERR value is not an integer or out of range
整数响应
127.0.0.1:6379> incr books
(integer} 1
1就是整数响应 :1
多行字符串响应
127.0.0.1:6379> get x
"x"
上面用括号引起来的x就是多行字符串响应,即:
$1
x
数组响应
127.0.0.1:6379> hset info name bibabo
(integer) 1
127.0.0.1:6379> hset info age 18
(integer) 1
127.0.0.1:6379> hset info sex male
(integer) 1
127.0.0.1:6379> hgetall info
1) "name"
2) "bibabo"
3) "age"
4) "18"
5) "sex"
6) "male"
上面的hgetall命令返回的就是一个数组,第0、2、4的字符串是hash表的key,1、3、6则是value,客户端负责将数组组装成字典返回。
*6
$4
name
$6
bibabo
$3
age
$2
18
$3
sex
$4
male
嵌套
127.0.0.1:6379> scan 0
1 )"0"
2) 1 ) "info"
2 )"books"
3 )"author"
scan命令用来扫描服务器包含的所有key列表,通过游标的形式一次获取一部分,该命令返回的是一个嵌套数组,
数组第一个值表示游标的值,如果这个值为0,说明已经遍历完毕,如果不为0,使用这个值作为下一次scan时的参数,
数组的第二个值又是一个数组,这个数组就是key的列表。
*2
$1
0
*3
$4
info
$5
books
$6
author
感谢你能够认真阅读完这篇文章,希望小编分享的“Redis中通信协议RESP是怎么实现的”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!