千家信息网

Redis中RESP协议的作用是什么

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,Redis中RESP协议的作用是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。简介Redis 的客户端和服务端之间采
千家信息网最后更新 2026年11月03日Redis中RESP协议的作用是什么

Redis中RESP协议的作用是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

简介

Redis 的客户端和服务端之间采取了一种独立的名为 RESP(REdis Serialization Protocol) 的协议,作者主要考虑了以下几个点:

  • 容易实现

  • 解析快

  • 人类可读

注意:RESP 虽然是为 Redis 设计的,但是同样也可以用于其他 C/S 的软件。

数据类型及示例

RESP 主要可以序列化以下几种类型:整数,单行回复(简单字符串),数组,错误信息,多行字符串。Redis 客户端向服务端发送的是一组由执行的命令组成的字符串数组,服务端根据不同的命令回复不同类型的数据,但协议的每部分都是以 "\r\n" (CRLF) 结尾的。另外 RESP 是二进制安全的,不需要处理从一个进程到另一个进程的传输,因为它使用了前缀长度进行传输。

在 RESP 中, 一些数据的类型通过它的第一个字节进行判断:

  • 单行回复:回复的第一个字节是 "+"

  • 错误信息:回复的第一个字节是 "-"

  • 整形数字:回复的第一个字节是 ":"

  • 多行字符串:回复的第一个字节是 "$"

  • 数组:回复的第一个字节是 "*"

单行回复

以 "+" 开头,以 "\r\n" 结尾的字符串形式。e.g.

+OK\r\n

响应的客户端库,应该返回除 "+" 和 CRLF 以外的内容,例如上面的内容,则返回 "OK". e.g.

127.0.0.1:6379> set name TaoBeier+OK\r\n  # 服务端实际返回---OK   # redis-cli 客户端显示

错误信息

错误信息和单行回复很像,不过是把 "+" 替换成了 "-"。而这两者之间真正的区别是,错误信息会被客户端视为异常,并且组成错误类型的是错误消息本身。e.g.

-Error message\r\n

错误信息只在有错误发生的时候才会发送,比如数据类型错误,语法错误,或者命令不存在之类的。而当接收到错误信息的时候,客户端库应该抛出一个异常。e.g.

127.0.0.1:6379> TaoBeier-ERR unknown command 'TaoBeier'\r\n  # 服务端实际返回, 下同---(error) ERR unknown command 'TaoBeier'  # redis-cli 客户端显示, 下同127.0.0.1:6379> set name TaoBeier moelove-ERR syntax error\r\n---(error) ERR syntax error

整数

这种类型只是只是使用以 ":" 作为前缀,以CRLF作为结尾的字符串来表示整数。e.g. ":666\r\n" 或者 ":999\r\n" 这种的都是整数回复。很多命令都会返回整数回复,例如 INCR LLEN LPUSH 之类的命令。但是多数情况下,返回的整数回复并没有过多实际含义,例如 LPUSH 就只是为了表示插入了几个值,但也有例如 EXISTS 命令是当结果为 true 的时候返回 1,false 返回 0 . e.g.

127.0.0.1:6379> LPUSH info TaoBeier MoeLove:2\r\n  # 服务端实际返回, 下同---(integer) 2  # redis-cli 客户端显示, 下同127.0.0.1:6379> LLEN info:2\r\n---(integer) 2127.0.0.1:6379> EXISTS info:1\r\n---(integer) 1127.0.0.1:6379> DEL info:1\r\n---(integer) 1127.0.0.1:6379> EXISTS info:0\r\n---(integer) 0

多行字符串

多行字符串被服务端用来返回长度最大为 512MB 的单个二进制安全的字符串。以 "$" 开头, 后跟实际要发送的字节数,随后是 CRLF,然后是实际的字符串数据,最后以 CRLF 结束。所以,例如我们要发送一个 "moelove.info" 的字符串,那它实际就被编码为 "$12\r\nmoelove.info\r\n"。而如果一个要发送一个空字符串,则会编码为 "$0\r\n\r\n" 。某些情况下,当要表示不存在的值时候,则以 "$-1\r\n" 返回,这被叫做空多行字符串,当客户端库接收到这个响应的时候,同样应该返回一个空值(例如 nil)而不是一个空字符串。e.g.

127.0.0.1:6379> set site moelove.info+OK\r\n  # 服务端实际返回, 下同---OK   # redis-cli 客户端显示, 下同127.0.0.1:6379> get site$12\r\nmoelove.info\r\n---"moelove.info"127.0.0.1:6379> del site:1\r\n---(integer) 1127.0.0.1:6379> get site$-1\r\n---(nil)127.0.0.1:6379> set site ''+OK\r\n---OK127.0.0.1:6379> get site$0\r\n\r\n---""

数组

数组类型可用于客户端向服务端发送命令,同样的当某些命令将元素结合返回给客户端的时候,也是使用数组类型作为回复类型的。它以 "*" 开头,后面跟着返回元素的个数,随后是 CRLF, 再然后就是数组中各元素自己的类型了。最典型的是 LRRANGE 命令,返回一个列表中的元素。e.g.

127.0.0.1:6379> LPUSH info TaoBeier moelove.info:2\r\n   # 服务端实际返回, 下同---(integer) 2  # redis-cli 客户端显示, 下同127.0.0.1:6379> LRANGE info 0 -1*2\r\n$12\r\nmoelove.info\r\n$8\r\nTaoBeier\r\n---1) "moelove.info"2) "TaoBeier"127.0.0.1:6379> LPOP info$12\r\nmoelove.info\r\n---"moelove.info"127.0.0.1:6379> LPOP info$8\r\nTaoBeier\r\n---"TaoBeier"127.0.0.1:6379> LRANGE info 0 -1*0\r\n---(empty list or set)

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

客户 字符 字符串 客户端 错误 类型 服务 命令 实际 信息 字节 数组 整数 时候 数据 多行 元素 内容 只是 开头 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 新华互联网科技学院 科技与互联网发展 朗涯互联网科技 云电互联网科技 深圳天众互联网科技公司 互联网科技宣传片 滨湖区互联网智能科技产品供应 济南和联互联网科技有限公司 卫星互联网科技股票 云创客互联网科技公司 银川新华互联网科技职业技术培训学校图片 茂名市互联网科技产业园 世界互联网科技公司市值排名 速维有品互联网信息科技(苏州)有限公司 江苏苏星互联网科技有限公司 互联网科技融合创新 互联网风格科技公司名称 中国科技和美国互联网 第三届互联网大会安防黑科技 互联网金融金融科技 重生之互联网科技帝国 科技股互联网 科技互联网项目 世界互联网领先科技成果 小米互联网科技园设置 南山科技园互联网公司有哪些 互联网软件和科技 产业互联网科技服务公司 半导体行业属于互联网高科技类吗 张家口科技产业互联网平台
0