RESPRedis 序列化协议Redis Serialization Protocol 的简写。它是一种直观的文本协议,优势在于实现异常简单,解析性能极好。

Redis 协议将传输的结构数据分为 5 种最小单元类型,单元结束时统一加上回车换行符号 \r\n

  1. 单行字符串 以 + 符号开头;
  2. 多行字符串 以 $ 符号开头,后跟字符串长度;
  3. 整数值 以 : 符号开头,后跟整数的字符串形式;
  4. 错误消息 以 - 符号开头;
  5. 数组 以 * 号开头,后跟数组的长度;

1. 各类型格式

1.1 单行字符串

+hello world\r\n

1.2 多行字符串

第一行是长度,剩下的是内容,表示字符串 hello world 如下:

$11\r\nhello world\r\n

打印如下:

$11
hello world

1.3 整数

冒号开头 表示整数 1024 如下:

:1024\r\n

打印如下:

:1024

1.4 错误

减号开头后跟错误名称和详细错误解释 表示「参数类型错误」如下:

-WRONGTYPE Operation against a key holding the wrong kind of value\r\n

1.5 数组

第一行是长度,后面依次是每个内容,表示数组 [1,2,3] 如下:

*3\r\n:1\r\n:2\r\n:3\r\n

打印如下:

*3
:1
:2
:3

数组里面可以嵌套其它类型,甚至可以嵌套另外一个数组,如此就可以形成复杂的数据结构。

1.6 NULL

用多行字符串表示,不过长度要写成 -1

$-1\r\n

1.7 空串

用多行字符串表示,长度填 0

$0\r\n\r\n

注意这里有两个 \r\n,为什么是两个,因为两个 \r\n​之间隔的是空串。

2. 客户端向服务器发送指令

客户端向服务器发送的指令只有一种格式,多行字符串数组。比如一个简单的 set 指令 set author codehole会被序列化成下面的字符串。

*3\r\n$3\r\nset\r\n$6\r\nauthor\r\n$8\r\ncodehole\r\n

直观打印结果:

*3
$3
set
$6
author
$8
codehole

3. 服务器向客户端返回响应

服务器向客户端回复的响应要支持多种数据结构,所以消息响应在结构上要复杂不少。不过再复杂的响应消息也是以上 5 中基本类型的组合。

3.1 单行字符串响应

127.0.0.1:6379> set author codehole
OK

这里的 OK 就是单行响应,没有使用引号括起来。

+OK

3.2 错误响应

127.0.0.1:6379> incr author
(error) ERR value is not an integer or out of range

试图对一个字符串进行自增,服务器抛出一个通用的错误。

-ERR value is not an integer or out of range

3.3 整数响应

127.0.0.1:6379> incr books
(integer) 1

这里的1就是整数响应。

:1

3.4 多行字符串响应

127.0.0.1:6379> get author
"codehole"

这里使用双引号括起来的字符串就是多行字符串响应。

$8
codehole

3.5 数组响应

127.0.0.1:6379> hset info name laoqian
(integer) 1
127.0.0.1:6379> hset info age 30
(integer) 1
127.0.0.1:6379> hset info gender male
(integer) 1
127.0.0.1:6379> hgetall info
1) "name"
2) "laoqian"
3) "age"
4) "30"
5) "gender"
6) "male"

这里的 hgetall 命令返回的就是一个数值,客户端负责将数组组装成字典再返回。

*6
$4
name
$6
laoqian
$3
age
$2
30
$6
gender
$4
male

3.6 嵌套

127.0.0.1:6379> scan 0
1) "0"
2) 1) "info"2) "books"3) "author"

scan 命令用来扫描服务器包含的所有 key 列表,它是以游标的形式获取,一次只获取一部分。
scan 命令返回的是一个嵌套数组。数组的第一个值表示游标的值,如果这个值为零,说明已经遍历完毕。如果不为零,使用这个值作为 scan 命令的参数进行下一次遍历。数组的第二个值又是一个数组,这个数组就是 key 列表。

*2
$1
0
*3
$4
info
$5
books
$6
author

虽然 Redis 协议里有大量冗余的回车换行符,但是这并不影响它成为互联网技术领域非常受欢迎的一个文本协议。有很多开源项目使用 RESP 作为它的通讯协议。因为在技术领域,性能并不总是代表一切,有时还要考虑简单性、易理解性和易实现性,这些都需要进行适当权衡。

4. 使用 telnet 连接 Redis

我们来看的 redis-cli 命令结果

127.0.0.1:6379> keys *
1) "a"
2) "b"
3) "num"
127.0.0.1:6379>
127.0.0.1:6379> get a
"world"
127.0.0.1:6379> 127.0.0.1:6379> set multi_line "how \r\n are \r\n you"
OK
127.0.0.1:6379> get multi_line
"how \r\n are \r\n you"
127.0.0.1:6379> 127.0.0.1:6379> set null ""
OK
127.0.0.1:6379> get null
""
127.0.0.1:6379> 

使用 Telnet登录查看对应命令结果

wohu@ubuntu:~$ telnet 127.0.0.1 6379
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
keys *
*3
$1
a
$1
b
$3
numget a
$5
worldget multi_line
$17
how are youget null
$0

参考:
https://juejin.cn/book/6844733724618129422/section/6844733724714598413

Redis 笔记(11)— 文本协议 RESP(单行、多行字符串、整数、错误、数组、空值、空串格式、telnet 登录 redis)相关推荐

  1. Web前端开发之CSS学习笔记11—文本格式和动画设计

    目录 1.文本对齐text -align 2.保留空白字符white-space 3.设置文本方向direction 4.设置文本缩进text-indent 4.设置字符间距letter-spacin ...

  2. Redis 笔记(13)— scan 和 keys 寻找特定前缀key 字段(命令格式、使用示例、定位大key)

    1. keys Redis 提供了一个简单暴力的指令 keys 用来列出所有满足特定正则字符串规则的 key. 127.0.0.1:6379> keys * (empty array) 127. ...

  3. Leetcode刷题笔记——剑指offer II (一)【整数、数组、字符串、链表】

    目录 整数 剑指 Offer II 001. 整数除法 剑指 Offer II 002. 二进制加法 剑指 Offer II 003. 前 n 个数字二进制中 1 的个数 剑指 Offer II 00 ...

  4. 【大厂面试】面试官看了赞不绝口的Redis笔记

    文章目录 一.Redis简介 二.Redis API的使用和理解 (一)通用命令 (二)单线程架构 (三)数据结构和内部编码 (四)字符串 (五)hash (字典) (六)列表 (七)Set集合 (八 ...

  5. Redis通讯协议RESP详解

    Redis的作者认为数据库系统的瓶颈一般不在于网络流量,而是数据库自身内部逻辑处理上.所以即使Redis使用了浪费流量的文本协议,依然可以取得极高的访问性能.Redis将所有数据都放在内存,用一个单线 ...

  6. redis客户端-服务端协议(RESP协议)

    简介:      redis客户端与服务端通信,使用RESP(REdis Serialization Protocal,redis序列化协议)协议通信,该协议是专门为redis设计的通信协议,但也可以 ...

  7. simp服务器协议,Redis协议(RESP)规范

    本文由笔者手工翻译自Redis官网 Redis客户端使用称为RESP(REdis序列化协议)的协议与Redis服务器进行通信.虽然该协议是专为Redis设计的,但它可以用于其他C/S架构的软件项目. ...

  8. pyQt5 学习笔记(18)QLineEdit 单行文本输入

    文章目录 一.QLineEdit 简介 二.QLineEdit 的创建 三.功能(API) 1. 文本的设置与获取 2. 显示模式 3. 占位提示文本框 4. 清空按钮显示 5. 添加操作行为 1. ...

  9. 两万字的Redis笔记!

    声明:所有内容均来自B站<狂神说Java系列课程>一个宝藏男孩,强烈推荐! 视频地址:https://www.bilibili.com/video/BV1S54y1R7SB 笔者也是基于视 ...

最新文章

  1. 数据库连接查询 变量 运算符
  2. Linux 操作系统原理 — cgroups 进程资源配额与管理
  3. 戴尔t410支持哪些服务器系统,DELL服务器T410
  4. SuperMap 房产政务协同管理平台
  5. linux下的系统调用函数到内核函数的追踪
  6. 摄影测量--相对定向-绝对定向(C++实现)
  7. 编译安装php7.3
  8. Mysql之七种连接查询
  9. php json字符串转json对象一直出错,显示空
  10. Android 实现全屏、无标题栏
  11. JAVA开发路线走向高级开发工程师
  12. html调用java函数_html通过JavaScript调用java代码
  13. 注册google账号,当前时间方法仍可用
  14. iPhone, iPad, 的Safari书签和阅读列表不同步问题
  15. 介绍java糊涂Hutool工具
  16. Artifact “xxx - xxxx“:war exploded: 部署工件时出错。请参阅服务器日志了解详细
  17. 用计算机进行文本信息的加工处理,前面我们已经学了用计算机进行文本信息的加工与表达过程.ppt...
  18. 官方scratch3.0正式发布,全面支持移动设备在线编程!
  19. 关于双因素认证(2FA),这些基础知识你一定要知道
  20. CVPR 2022 | 惊呆了!只用一张图+相机走位,AI就能脑补周围环境!

热门文章

  1. 通过正则表达式校验手机号码,拿走即用!
  2. VS调试时提示此项目已经过期
  3. 【Docker】registry部署docker私有镜像仓库
  4. spring Ioc本质
  5. LeetCode简单题之检查句子中的数字是否递增
  6. GOF23设计模式(结构型模式)代理模式~
  7. NVIDIA GPU的神经网络自动调度
  8. 用小神经网络和光谱仪优化关键词识别
  9. H.265视频编码与技术全析(上)
  10. 求得到一个字符串@“absdfasdfsdfdsafsd....”所有的排列