Redis 笔记(11)— 文本协议 RESP(单行、多行字符串、整数、错误、数组、空值、空串格式、telnet 登录 redis)
RESP
是 Redis
序列化协议Redis Serialization Protocol
的简写。它是一种直观的文本协议,优势在于实现异常简单,解析性能极好。
Redis 协议将传输的结构数据分为 5 种最小单元类型,单元结束时统一加上回车换行符号 \r\n
。
- 单行字符串 以
+
符号开头; - 多行字符串 以
$
符号开头,后跟字符串长度; - 整数值 以
:
符号开头,后跟整数的字符串形式; - 错误消息 以
-
符号开头; - 数组 以
*
号开头,后跟数组的长度;
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)相关推荐
- Web前端开发之CSS学习笔记11—文本格式和动画设计
目录 1.文本对齐text -align 2.保留空白字符white-space 3.设置文本方向direction 4.设置文本缩进text-indent 4.设置字符间距letter-spacin ...
- Redis 笔记(13)— scan 和 keys 寻找特定前缀key 字段(命令格式、使用示例、定位大key)
1. keys Redis 提供了一个简单暴力的指令 keys 用来列出所有满足特定正则字符串规则的 key. 127.0.0.1:6379> keys * (empty array) 127. ...
- Leetcode刷题笔记——剑指offer II (一)【整数、数组、字符串、链表】
目录 整数 剑指 Offer II 001. 整数除法 剑指 Offer II 002. 二进制加法 剑指 Offer II 003. 前 n 个数字二进制中 1 的个数 剑指 Offer II 00 ...
- 【大厂面试】面试官看了赞不绝口的Redis笔记
文章目录 一.Redis简介 二.Redis API的使用和理解 (一)通用命令 (二)单线程架构 (三)数据结构和内部编码 (四)字符串 (五)hash (字典) (六)列表 (七)Set集合 (八 ...
- Redis通讯协议RESP详解
Redis的作者认为数据库系统的瓶颈一般不在于网络流量,而是数据库自身内部逻辑处理上.所以即使Redis使用了浪费流量的文本协议,依然可以取得极高的访问性能.Redis将所有数据都放在内存,用一个单线 ...
- redis客户端-服务端协议(RESP协议)
简介: redis客户端与服务端通信,使用RESP(REdis Serialization Protocal,redis序列化协议)协议通信,该协议是专门为redis设计的通信协议,但也可以 ...
- simp服务器协议,Redis协议(RESP)规范
本文由笔者手工翻译自Redis官网 Redis客户端使用称为RESP(REdis序列化协议)的协议与Redis服务器进行通信.虽然该协议是专为Redis设计的,但它可以用于其他C/S架构的软件项目. ...
- pyQt5 学习笔记(18)QLineEdit 单行文本输入
文章目录 一.QLineEdit 简介 二.QLineEdit 的创建 三.功能(API) 1. 文本的设置与获取 2. 显示模式 3. 占位提示文本框 4. 清空按钮显示 5. 添加操作行为 1. ...
- 两万字的Redis笔记!
声明:所有内容均来自B站<狂神说Java系列课程>一个宝藏男孩,强烈推荐! 视频地址:https://www.bilibili.com/video/BV1S54y1R7SB 笔者也是基于视 ...
最新文章
- 数据库连接查询 变量 运算符
- Linux 操作系统原理 — cgroups 进程资源配额与管理
- 戴尔t410支持哪些服务器系统,DELL服务器T410
- SuperMap 房产政务协同管理平台
- linux下的系统调用函数到内核函数的追踪
- 摄影测量--相对定向-绝对定向(C++实现)
- 编译安装php7.3
- Mysql之七种连接查询
- php json字符串转json对象一直出错,显示空
- Android 实现全屏、无标题栏
- JAVA开发路线走向高级开发工程师
- html调用java函数_html通过JavaScript调用java代码
- 注册google账号,当前时间方法仍可用
- iPhone, iPad, 的Safari书签和阅读列表不同步问题
- 介绍java糊涂Hutool工具
- Artifact “xxx - xxxx“:war exploded: 部署工件时出错。请参阅服务器日志了解详细
- 用计算机进行文本信息的加工处理,前面我们已经学了用计算机进行文本信息的加工与表达过程.ppt...
- 官方scratch3.0正式发布,全面支持移动设备在线编程!
- 关于双因素认证(2FA),这些基础知识你一定要知道
- CVPR 2022 | 惊呆了!只用一张图+相机走位,AI就能脑补周围环境!