Redis 通信协议(RESP)

一、什么是 RESP 协议?

RESP(REdis Serialization Protocol) 是 Redis 使用的通信协议。

特点:

  • 文本协议(可读,可直接 telnet)
  • 简单
  • 快速
  • 支持 Pipeline(多条命令批处理)
  • 支持多种数据类型
  • 客户端与 Redis 所有交互都基于 RESP

Redis 5 之前默认 RESP2

Redis 6 起开始支持 RESP3,但仍兼容 RESP2


二、为什么 Redis 使用 RESP?

  1. 解析简单(基于行 + 前缀)
  2. 高性能(一次性读取全部命令)
  3. 支持批量、多参数、多命令(管道)
  4. 人类可读(调试方便)
  5. 易扩展(RESP3 解决更复杂的数据结构)

几乎所有语言的 Redis 客户端都实现了 RESP。


三、RESP2 五大数据类型

RESP2 支持五种数据类型:

类型 前缀 说明
简单字符串 + OK 类消息
错误 - 执行错误
整数 : 数值
批量字符串(Bulk String) $ 二进制安全字符串
数组(Array) * 多条命令参数

下面逐个讲解。


四、RESP2 通信规则解析

4.1 简单字符串(Simple Strings)

格式:

复制代码
+<string>\r\n

应用示例:

复制代码
SET name jack

Redis 返回:

复制代码
+OK\r\n

特点:

  • 不包含换行符
  • 常用于成功返回(OK、PONG)

4.2 错误(Errors)

格式:

复制代码
-<error message>\r\n

示例:

复制代码
GET

Redis 回复:

复制代码
-ERR wrong number of arguments for 'get' command\r\n

错误消息只是一个字符串。


4.3 整数(Integer)

格式:

复制代码
:<number>\r\n

示例:

复制代码
INCR count

返回:

复制代码
:1\r\n

适用于:

  • INCR
  • LLEN
  • ZCARD
  • HLEN
  • EXISTS(返回 0/1)

4.4 批量字符串(Bulk Strings)

用于二进制安全的数据(包括图像、JSON 等)

格式:

复制代码
$<length>\r\n<payload>\r\n

示例:

复制代码
$4\r\njack\r\n

如果是 NULL:

复制代码
$-1\r\n

示例:GET name

客户端发送(注意!客户端不会显示发送方式,但底层是这样):

复制代码
*2
$3
GET
$4
name

Redis 返回:

复制代码
$4
jack

4.5 数组(Arrays)

数组是多个 RESP 回复的集合。

格式:

复制代码
*<count>\r\n
<item1>
<item2>
...

示例:

复制代码
LRANGE list 0 -1

返回:

复制代码
*3
$3
one
$3
two
$5
three

这是 Redis 命令参数与返回数据最重要的格式。


五、请求与响应的完整示例(非常重要)

客户端执行:

复制代码
SET name jack

客户端底层发送实际内容为:

复制代码
*3\r\n
$3\r\n
SET\r\n
$4\r\n
name\r\n
$4\r\n
jack\r\n

Redis 回复:

复制代码
+OK\r\n

GET

复制代码
*2\r\n
$3\r\n
GET\r\n
$4\r\n
name\r\n

Redis 回复:

复制代码
$4\r\n
jack\r\n

六、RESP 如何支持 Pipeline

假设客户端 pipeline 发送三条命令:

复制代码
SET a 1
SET b 2
GET a

客户端一次性发送:

复制代码
*3 $3 SET $1 a $1 1
*3 $3 SET $1 b $1 2
*2 $3 GET $1 a

Redis 会:

  • 读一次 socket
  • 一次性解析
  • 按顺序执行
  • 一次性返回多个结果

返回:

复制代码
+OK
+OK
$1
1

这就是 Pipeline 的实现基础。


七、RESP3(Redis 6+ 新协议)概述

RESP3 新增更多数据类型:

类型 前缀
Map %
Set ~
Double ,
Bool #
Null _
Big Number (
Attribute `

但 Redis 默认仍然使用 RESP2,RESP3 多用于新的客户端。


八、总结(背诵版)

RESP2 五大类型:

类型 前缀 示例
简单字符串 + +OK
错误 - -ERR...
整数 : :100
Bulk String $ $3\r\nabc\r\n
数组 * *2\r\n$3\r\nGET\r\n$3\r\nkey\r\n

九、面试高频问题

1. Redis 使用的协议是什么?

RESP(Redis Serialization Protocol)

2. Redis 为什么不使用 JSON/HTTP?

  • HTTP 开销大
  • JSON 解析慢
  • 无法支持二进制安全
  • 无法支持 Pipeline

3. RESP2 中最常用的数据类型是什么?

Bulk String(因为大部分命令参数都是字符串)

4. RESP 支持二进制数据吗?

是的,Bulk String 是二进制安全的。

5. RESP3 是什么?解决什么问题?

提供更多原生数据类型(如 map、set、bool)

相关推荐
jiayou641 天前
KingbaseES 表级与列级加密完全指南
数据库·后端
用户3074596982072 天前
Redis 延时队列详解
redis
GBASE2 天前
G术时刻 |GBase 8s数据库事务并发控制之封锁技术介绍(下)
数据库
烤代码的吐司君2 天前
Redis 数据结构 ZSet, BIT, HyperLogLog,Geo 空间数据
redis·后端
xiezhr3 天前
逛GitHub发现了一款免费的带AI功能的数据库管理工具
数据库·ai编程·dba
吃糖的小孩4 天前
给 QQ AI 机器人设计“可控记忆”:会话摘要、手动长期记忆与角色卡边界
数据库
笃行3504 天前
金仓数据库数据安全双防线:静态存储加密与传输加密实战
数据库
笃行3504 天前
金仓数据库物理备份实战:sys_rman 全流程演练与误覆盖抢救
数据库
笃行3504 天前
金仓数据库逻辑备份实战:从全库导出到 Schema 替换的完整闭环
数据库