浅谈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,但是仍然有很多开源项目使用。

往期精彩回顾



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值