iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >redis协议指的是什么
  • 280
分享到

redis协议指的是什么

2024-04-02 19:04:59 280人浏览 薄情痞子
摘要

这篇文章主要介绍Redis协议指的是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Redis客户端通过使用一种叫RESP(REdis Serialization Protocol

这篇文章主要介绍Redis协议指的是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

Redis客户端通过使用一种叫RESP(REdis Serialization Protocol, redis序列化协议)协议与Redis服务器交互。虽然这个协议是为Redis而设计的,但它也可以用于其他client-server架构的软件系统。(译注: 从一些公开的资料来看,陌陌的IM协议设计就参考了Redis协议)

RESP 权衡了以下几个方面:

实现要简单解析要快方便人阅读

RESP可以序列化不同的数据类型,像integers、strings、arrays,对于错误也设计了特殊的类型。客户端以字符串参数数组的请求形式发送给Redis服务器执行,Redis返回命令相关的数据类型。

RESP是二进制安全(binary-safe)的,并且不需要解析由一个进程发送给另一个进程的bulk 数据,因为它使用长度前缀来传输bulk 数据。

注意:这里所说的协议只用于client-server的通信。Redis Cluster使用不同的二进制协议在node间进行消息交互。

网络

客户端通过建立端口为6379的tcp连接与Redis通信。

虽然RESP从技术上来说并不是TCP相关的,但对Redis来说该协议只用于TCP(或者其他流式协议如Unix域协议)。 (译注:反观memcached, 既支持tcp, 也支持udp, 但实际上生产环境基本只用tcp。我认为这是一种过度设计了,搞不好还可能被骇客利用来做 memcached udp 反射攻击。。。)

请求响应模型

Redis 接收不同参数构成的命令。当命令接收到后就会被处理,然后响应发送给客户端。

这是最简单的模型了,但有两点例外:

Redis支持 pipelining (后文会提及)。所以客户端可以一次发送多个命令,然后等待响应。当客户端订阅了一个 Pub/Sub channel, 该协议会改变语意而变成一个推送协议,也就是说客户端不用发送命令,因为服务端在收到消息后会自动给客户端发送新的消息(对客户端订阅了的channel)。

除了这两点,Redis协议就是一个简单的请求-响应协议。

RESP协议描述

RESP协议在Redis 1.2引入,但它现在成为Redis 2.0的标准交互协议。你应该实现Redis客户端时采用该协议。

RESP事实上是一个支持以下类型的序列化协议:Simple Strings, Errors, Integers, Bulk Strings 和 Arrays。

RESP作为一种请求响应协议,在Redis中使用的方式如下:

客户端发送命令到Redis服务器,以RESP Bulk Strings数组的方式。服务器根据不同的命令实现,返回相应的RESP实现。

在RESP中,一些数据的类型由第一个字节确定:

对于SImple Strings 响应的第一个字节是“+”对于Errors 响应的第一个字节是 "-"对于Integers 响应第一个字节是 ":"对于Bulk Strings 响应第一个字节是 "$" 对于Arrays 响应第一个字节是 "*"

另外RESP可以用特殊的Bulk String或数组来表示 Null 值,后文会提及。

在RESP中协议不同部分总是用 "\r\n" (CRLF) 分隔。

RESP Simple Strings

Simple Strings通过以下方式编码:一个加号,后跟一个字符串, 字符串不包含CR或LF字符(不能有换行),以CRLF ("\r\n")结束。

SImple Strings 以最小的代价来传输非二进制安全的字符串。例如很多Redis命令在成功时响应"OK",就是用RESP Simple String 来编码的5个字节:

"+OK\r\n"

为了传输二进制安全的字符串,要用RESP Bulk Strings。

当Redis响应一个Simple String时,客户端库应该给调用者返回从第一个"+"字符到字符串结尾的字符串,不包括CRLF 字节。

RESP Errors

RESP 对于error有一种特殊的数据类型。实际上error就像RESP Simple String一样,但第一个字符串是"-"而不是加号。在RESP中 Simple Strings和Errors两者的真正区别在于errors被客户端作为异常,构成Error类型的字符串就是字符串本身。基本格式是:

"-Error message\r\n"

Error响应只会在有错误发生时才会发送,例如你操作了错误的数据类型,或者命令不存在等。当收到Error响应时,客户端应该抛出一个异常。

以下是error响应的例子:

-ERR unknown command 'foobar'-WRONGTYPE Operation against a key holding the wrong kind of value

在"-"到第一个空格或新行间的第一个词,表示返回的错误类型。这只是Redis自己的一种约定,并不是RESP Error 所规定的格式。

例如,ERR 是通用错误,而 WRONGTYPE 是一种更加具体的错误,表示客户端尝试操作错误的数据类型。这称为 Error Prefix (Error前缀),客户端可从此得知服务器返回错误的类型而不需依赖于那个确切的消息描述,后者会随时改变。

一个客户端的实现可能对不同的error返回不同类型的异常,或者向调用者返回代表错误的字符串。然而这种特性并不是必须的,因为这并没什么卵用,一些精简的客户端实现可能简单的返回一般的错误情况,例如 false。

RESP Integers

这种类型就是一个代表整数的以CRLF结尾的字符串,并以“:”字节开头。例如 ":0\r\n", 或 ":1000\r\n" 都是整数响应。

很多Redis命令返回RESP Integers, 像 INCR, LLEN 和 LASTSAVE。

返回的整数并没什么特殊的含义,它就是 INCR 增加后的数字,LASTSAVE 的UNIX时间戳等。但返回的整数可以保证是在64位有符号整数的范围内。

整数响应也被大量的用于表示true或false。例如EXISTS和 SISMEMBER 等命令会返回1表示true, 0表示false。

以下命令会返回一个整数: SETNX, DEL, EXISTS, INCR, INCRBY, DECR, DECRBY, DBSIZE, LASTSAVE, RENAMENX, MOVE, LLEN, SADD, SREM, SISMEMBER, SCARD。

RESP Bulk Strings

Bulk Strings 用于表示一个二进制安全的字符串,最大长度为512M。

Bulk Strings 的编码格式如下:

“$” 后跟字符串字节数(prefix length),以CRLF结束实际的字符串CRLF结束

所以字符串"foobar" 被编码成:

"$6\r\nfoobar\r\n"

空字符串:

"$0\r\n\r\n"

RESP Bulk String 也可以用一种代表Null值的特殊格式来表示不存在的值。这种特殊格式的长度值为-1, 并且没数据,所以Null表示为:

"$-1\r\n"

这称为 Null Bulk String。

当服务器返回Null Bulk String时,客户端api不应该返回空串,而是nil 对象。例如Ruby库应该返回 'nil' 而 C 库应该返回 NULL (或在返回的对象设置特殊的标记),等等。

RESP Arrays

客户端用RESP Arrays向Redis服务器发送命令。同样某些Redis命令要返回一个元素集合时也使用RESP Arrays作为返回的类型。一个例子是LRANGE 命令返回一个元素列表。

RESP Arrays使用以下格式发送:

“*” 为第一个字节,后跟数组的元素个数,然后CRLF。然后是数组中的每一个RESP类型表示的元素。

例如一个空数组表示为:

"*0\r\n"

而有两个RESP Bulk Strings "foo" 和 "bar" 的数组编码为:

"*2\r\n$3\r\nfoo\r\n$3\r\nbar\r\n"

正如你所见,在数组前面的 *<count>CRLF 后,数组中的其他的数据类型一个接一个的连接在一起。例如一个有三个整数的数组编码如下:

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

数组可以包含混合类型,它不要求所有的元素都是相同的类型。例如,一个有4个interges和1个bulk string的数组可以编码为:

*5\r\n
:1\r\n
:2\r\n
:3\r\n
:4\r\n
$6\r\n
foobar\r\n

(为清晰起见响应被分为多行)。

服务器发送的第一行 *5\r\n 表示后跟有5个响应,然后每个代表元素的响应被发送。

Null 数组的概念同样存在,它是Null值的替代方式 (通常使用Null Bulk String,但由于历史原因我们有两种格式)。

例如当BLPOP命令超时,它返回一个长度为-1的Null 数组,如下所示:

"*-1\r\n"

在服务端返回Null数组时,客户端库API应该返回null对象而不是空数组。区分返回空的列表与其他的情况(如BLPOP命令超时的情况)是有必要的。

RESP允许数组的数组。例如一个含两个数组的数组编码如下:

*2\r\n
*3\r\n
:1\r\n
:2\r\n
:3\r\n
*2\r\n
+Foo\r\n
-Bar\r\n

高效解析Redis协议

尽管Redis协议非常可读并且容易实现,它却可以兼得二进制协议的高效。

RESP使用长度前缀来传输bulk 数据,所以不需要像JSON一样扫描数据负载中的特殊符号,或者用引号括住数据负载。

Bulk和Multi Bulk长度的处理可以一次处理一个字符,同时可以扫描CR字符,像如下的C代码:

#include <stdio.h>

int main(void) {
    unsigned char *p = "$123\r\n";
    int len = 0;

    p++;
    while(*p != '\r') {
        len = (len*10)+(*p - '0');
        p++;
    }

    
    printf("%d\n", len);
    return 0;
}

当第一个CR被识别后,后面的LF可以忽略不处理。然后bulk数据可以一次读取而不需要分析 数据负载。最后剩下的CR和LF字符串可以丢弃不处理。

与二进制协议比较性能时,Redis协议在大部分的高级语言实现起来足够简单,减少了客户端软件的bug数量。

注:

1. 协议中的CR和LF相当于分割符,命令间存在多个CRLF不应影响后续解析,应为多个CRLF应被忽略掉。例如:

$> (printf "PING\r\nPING\r\nPING\r\n\r\n\rPING\r\n"; sleep 1) | nc localhost 6379
+PONG
+PONG
+PONG
+PONG

2. 对比一下memcached的协议,redis的协议确实设计得比较精简:

(1) 一致的请求形式。redis的请求都是以 Bluk String 数组发送,不同命令只是数组的元素个数不同,所有命令的处理可以先读取完整个数组再根据不同命令解析数组的参数;而不是像mc协议一样,不同请求的命令格式不同,那么在读取网络字节流的过程中就要对不同命令做不同的处理,增加了协议解析的难度。

(2) 长度前缀是高效解析协议的关键。字段长度信息并不是二进制协议的专利,文本协议也可以有。

以上是redis协议指的是什么的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网数据库频道!

您可能感兴趣的文档:

--结束END--

本文标题: redis协议指的是什么

本文链接: https://www.lsjlt.com/news/53313.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • redis协议指的是什么
    这篇文章主要介绍redis协议指的是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Redis客户端通过使用一种叫RESP(REdis Serialization Protocol...
    99+
    2022-10-18
  • bootstrap指的是什么协议
    这篇文章主要介绍bootstrap指的是什么协议,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!bootstrap协议全称“Bootstrap Protocol”,中文意思为“引导协议”,是一种基于“UDP/IP”的协...
    99+
    2023-06-22
  • udp指的是什么协议
    小编给大家分享一下udp指的是什么协议,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!udp是用户数据包协议,是OSI参考模型中一种无连接的传输层协议,提供面向事务...
    99+
    2023-06-08
  • go语言指的是什么开源协议
    小编给大家分享一下go语言指的是什么开源协议,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!go语言采用BSD开源协议。BSD开源协议是一个给于使用者很大自由的协议...
    99+
    2023-06-15
  • redis客户端用什么协议
    redis客户端是与服务端通信的,因此使用的是RESP协议通信,RESP协议是专门为redis设计的通信协议,也能够用于其他客户端以及服务器通信的场景,它也是二进制安全协议,可处理批量数据无须逐个请求处理,传输层基于TCP协议,默认端口为6...
    99+
    2022-10-22
  • 什么是ip协议
    这篇文章主要讲解了“什么是ip协议”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“什么是ip协议”吧!IP协议是TCP/IP网际层的核心协议,也是整个TCP/...
    99+
    2022-10-18
  • linux的协议栈是什么
    这篇“linux的协议栈是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“linux的协议栈是什么”文章吧。在linux中...
    99+
    2023-07-02
  • Redis中通信协议RESP是怎么实现的
    这篇文章主要介绍了Redis中通信协议RESP是怎么实现的,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。RESPRESP(Redis Ser...
    99+
    2022-10-19
  • 云服务器技术协议是什么类型的协议
    数据格式和访问控制:云服务器提供商应当制定和维护适当的数据格式和访问控制机制,以确保不同云服务器提供商之间的数据传输和处理是一致的。这包括对不同云服务器提供商之间数据格式和传输的兼容性、对数据的访问权限和限制等方面的规定。 数据存储和处理...
    99+
    2023-10-27
    协议 类型 服务器
  • http协议无状态中的 "状态" 指的是什么
    这篇文章主要介绍“http协议无状态中的 "状态" 指的是什么”,在日常操作中,相信很多人在http协议无状态中的 "状态" 指的是什么问题上存在疑惑,小编查阅了各式...
    99+
    2022-10-18
  • HTTP协议的含义是什么
    这篇文章主要介绍了HTTP协议的含义是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 1. 使用谷歌/火狐浏览器分析 在Web应用中...
    99+
    2022-10-19
  • linux的网络协议是什么
    本篇内容介绍了“linux的网络协议是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  网络协议有很多,但大多是针对windows的,那...
    99+
    2023-06-13
  • Redis协议的示例分析
    这篇文章给大家分享的是有关Redis协议的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。前言我们用过很多redis的客户端,有没有相过自己撸一个redis客户端? 其实很...
    99+
    2022-10-18
  • Redis指的是什么
    这篇文章将为大家详细讲解有关Redis指的是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Redis是一个非常快速的开源非关系数据库,它存储了五种不同类型值的键映射。...
    99+
    2022-10-18
  • pip协议是什么意思
    pip协议是指Pip工具与PyPI服务器之间的通信协议,用于实现Python包的安装、升级和管理。本教程操作系统:windows10系统、Python3.11.4版本、Dell G3电脑。在计算机科学中,“PIP"可以指代多个概念,其中之一...
    99+
    2023-11-23
    pip协议 pip
  • IPAD协议是什么意思
    这篇文章主要介绍了IPAD协议是什么意思,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。微信协议就是基于微信IPad协议的智能控制系统,利用人工智能AI技术、云计算技术、虚拟技...
    99+
    2023-06-03
  • 什么是UDS诊断协议
    UDS (Unified Diagnostic Services) 是一种用于在汽车电子控制单元(ECU)之间进行诊断和通信的标准协议。它是一种底层协议,主要用于诊断和编程各种汽车系统,例如发动机、变...
    99+
    2023-10-20
    网络 服务器 uds 汽车 诊断协议
  • UDP协议是什么意思
    UDP是一种无连接的传输层协议,提供了一种将数据包发送到网络上的方式,但并不保证数据包的可靠性、顺序性和完整性,也不提供拥塞控制和流量控制等功能。UDP的特点:1、无连接性,不需要在发送数据之前建立连接,数据包可以直接发送到目标主机;2、高...
    99+
    2023-08-08
  • SOCKS代理协议是什么
    本篇内容主要讲解“SOCKS代理协议是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SOCKS代理协议是什么”吧!  SOCKS代表Socket Secure,是一种网络协议,它通过代表客户...
    99+
    2023-06-21
  • PHP中的SOAP协议指南
    随着互联网技术的不断发展,越来越多的企业级应用需要向其它应用程序提供接口以实现数据和业务的交互。在这种情况下,我们需要一种可靠的协议来传输数据并确保数据的完整性和安全性。SOAP(Simple Object Access Protocol)...
    99+
    2023-05-20
    PHP 协议 soap
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作