浅谈Redis通信协议
Redis客户端和服务器端使用的通信协议叫做RESP(Redis Serialization Protocol)。它是特意为Redis设计的,同时也可以用于其他软件工程。
RESP在以下事项之间进行妥协:
实现简单
快速解析
可读性强
RESP可以序列化多种不同的数据类型,比如:整型、字符串、数组。错误是一种特定的类型。Redis客户端把参数用数组来表示。回复的是一种特殊的数据格式。
RESP是二进制安全的,它不需要处理从一个进程到另一个进程的批量数据,因为采用的是前缀长度来传输批量数据。
注意:这里的协议只适用用与客户端-服务器通信。Redis集群使用的是不同的协议
一般情况下,RESP是一种简单的请求-响应式协议。二般情况是:
Redis支持管道,所以有可能一次发送多个命令,然后一起响应
如果Redis客户端订阅了Pub/Sub频道,那么协议就会变成一种推送协议,当服务器接收到新的数据时会自动推送给客户端
RESP协议支持的数据类型有:Simple Strings,Errors,Integers,Bulk Strings和Arrays。它的使用方法有:
客户端以Bulk Strings数组的形式发送命令
服务器端返回的结果是协议支持的类型之一
RESP协议中,上述类型是通过首个字节区分的:
+
代表简单字符串(Simple Strings)-
代表错误类型(Errors):
代表整型(Integers)$
代表多行字符串(Bulk Strings)*
代表数组(Arrays)
此外,每一部分结束时,Redis统一使用“\r\n”表示结束。
看到这里你是否有疑问呢?为什么没有表示null的方法呢?别着急我们一会就会解释。
RESP简单字符串
简单字符串中不允许出现\r
或\n
,只能有一行。它用于以最小开销传输非二进制安全字符串,例如回复的OK
1"+OK\r\n"
如果要发送二进制安全的字符串,应该使用多行字符串。
RESP错误
RESP有特定的错误类型,它与简单字符串类似,只不过是把开头的+
换成了-
,而两者之间真正的区别是客户端将错误视为异常,而错误中的字符串只是表示错误信息。
1"-Error message\r\n"
当客户端收到错误信息时,通常会抛出一个异常。我们来看一些例子:
1-ERR unknown command 'foobar'
2-WRONGTYPE Operation against a key holding the wrong kind of value
从第一个字符“-”之后,到第一个空格或新的一行,这之间的字符串表示错误类型。这只是Redis的一种约定,并不是RESP的错误格式。
例如ERR是普通错误,而WRONGTYPE表示客户端试图对错误的数据类型执行操作。
RESP整型
整型只是以\r\n
结尾,以:
开头的纯整数的字符串。
1:1000\r\n
很多Redis命令都会返回整型,例如INCR、LLEN和LASTSAVE。
返回的整数需要在64位有符号整数范围内,同时也可以用于表示真或假。
RESP多行字符串
多行字符串是二进制安全的,最大长度是512MB。
多行字符串的编码方式如下:
以
$
+数字开头,以\r\n
结束数据都是字符串
结尾是
\r\n
所以“foobar”应该编码为
1"$6\r\nfoobar\r\n"
空字符串表示为:
1"$0\r\n\r\n"
多行字符串也可以用来null
1"$-1\r\n"
当服务器返回Null多行字符串时,正常客户端是不应该返回空字符串的,而是应该返回nil对象。
RESP数组
客户端向服务器端发送命令时使用的就是RESP数组。类似的,某些命令返回的元素集合也是RESP数组的类型。
RESP数组遵循以下规则:
第一个字符是
*
,后面跟的十进制数字是数组元素的数量,然后跟着\r\n
。每个元素都是RESP类型的
空数组表示为:
1"*0\r\n"
数组中的元素可以是不同类型的:
1*5\r\n
2:1\r\n
3:2\r\n
4:3\r\n
5:4\r\n
6$6\r\n
7foobar\r\n
第一行的*5\r\n
表示数组有5个元素,后面每行是一个元素。
RESP也有NULL数组的表示方法,这是NULL的另一种表示方法,通常用多行字符串的NULL来表示,不过由于历史原因,就保留了两种形式。
当BLPOP命令超时时,就会返回NULL数组
1"*-1\r\n"
当服务器返回NULL数组时,客户端应该返回null对象而不是空数组。
数组中的NULL
数组中的元素可以是NULL,通常表示数组中某个元素缺失,而不是空字符串:
1*3\r\n
2$3\r\n
3foo\r\n
4$-1\r\n
5$3\r\n
6bar\r\n
其中第二个元素时NULL,客户端的返回结果应该是:
1["foo",nil,"bar"]
小结
到此我们已经了解了RESP协议,RESP中虽然有大量的冗余\r\n
,但是仍然有很多开源项目使用。
浅谈Redis通信协议相关推荐
- Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理
基于python+mysql浅谈redis缓存设计与数据库关联数据处理 by:授客 QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3 ...
- python文本框与数据库的关联_Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理...
基于python+mysql浅谈redis缓存设计与数据库关联数据处理 by:授客 QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3. ...
- Redis设计与实现 -- 浅谈Redis持久化
在讲解Redis持久化相关的话题之前,我们需要了解的是Redis为什么这么快?也就是Redis的IO模型 – 多路复用. 我们一句话概括为什么Redis这么快: Redis是单线程的,使用多路复用的I ...
- 执行一次怎么会写入两次数据_浅谈 Redis 数据持久化之 AOF 模式
我们知道 Redis 之所以读写快.性能高,得益于它是一种基于内存的数据库,毫无疑问它的操作都几乎都是基于内存.但是内存型数据库也有一个很大的弊端:如果进程崩溃或者服务重启的时候内存数据得不到保存,就 ...
- 一、浅谈 Redis
1.什么是Redis redis是完全开源的,遵守BSD协议(开源自由可修改),是一个高性能的key-value数据库 redis 与其他key -value缓存产品有以下三个特点 Redis支持数据 ...
- 浅谈Redis及其安装配置
一.Redis的介绍 二.Redis的安装配置 三.Redis的配置文件说明 四.Redis的简单操作 简介: Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型. ...
- 浅谈Redis与MySQL的耦合性以及利用管道完成MySQL到Redis的高效迁移
㈠ Redis 与 MySQL 的耦合性 在业务架构早期.我们便该"吃着碗里的看着锅里的".切莫让MySQL 有梦.而Redis 无心 毕竟.有些关系型的结构不适合放到Redis跑 ...
- 浅谈Redis和Hbase
2019独角兽企业重金招聘Python工程师标准>>> 1,Java的Redis连接池代码 转载:https://blog.csdn.net/unix21/article/detai ...
- 浅谈redis数据库的键值设计
丰富的数据结构使得redis的设计非常的有趣.不像关系型数据库那样,DEV和DBA需要深度沟通,review每行sql语句,也不像memcached那样,不需要DBA的参与.redis的DBA需要熟悉 ...
最新文章
- python内置数据结构之str
- 黑莓遭破解?程守宗回应:放心用它很安全
- JavaScript的前世今生
- Nature:首个完全复现人眼的仿生眼问世,港科大造出半球形人工视网膜,感光性能超过人眼460倍...
- 图像的Gamma(伽玛)校正的原理及OpenCV代码实现
- 使用IDEA基于Maven搭建多模块聚合工程(springmvc+spring+mybatis整合)
- 高效的 JavaScript
- linux bin目录误删,Linux下误删 /user/bin目录后的补救
- css 波纹扩散效果
- 二进制,八进制,十六进制,十进制之间的换算
- mysql中子查询的概念_Mysql子查询的概念、分类、语法
- 服务器装win7系统流程图,Win7安装详细图文教程
- 数字经济发展指标体系和测算(含互联网宽带、电话普及率等多指标 内附原始数据) 2011-2020年
- FPGA零基础学习:IP CORE 之 ROM设计
- nyoj71 独木舟上的旅行
- 【深度学习(李沐)】
- Android 扫码登录
- 切片法分割树冠与树干
- pads元件类型如何修改_在PADS里怎样修改PCB的元件编号
- 3 photolemur 样式下载_Photolemur 3