共计 1709 个字符,预计需要花费 5 分钟才能阅读完成。
这篇文章主要介绍了 Redis 中通信协议 RESP 是怎么实现的,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让丸趣 TV 小编带着大家一起了解一下。
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
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
$4
$5
books
$6
author
感谢你能够认真阅读完这篇文章,希望丸趣 TV 小编分享的“Redis 中通信协议 RESP 是怎么实现的”这篇文章对大家有帮助,同时也希望大家多多支持丸趣 TV,关注丸趣 TV 行业资讯频道,更多相关知识等着你来学习!