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)

相关推荐
SelectDB1 小时前
为什么 JSON 正在成为分析数据库新的竞争点?
数据库·json·agent
ClouGence2 小时前
开源数据库管理工具 CloudDM 4.2.0 发布,新增 GoldenDB、KingbaseES 等数据源
数据库·dba·devops
发霉的馒头2 小时前
ORA-00845: MEMORY_TARGET not supported on this system的解决方法
数据库
草莓熊Lotso4 小时前
【Redis 初阶】Set 类型深度解析:去重集合的运算能力与实战场景
linux·网络·数据库·windows·redis·tcp/ip·缓存
煎饼皮皮侠6 小时前
【设计】设计一个web版的数据库管理平台后端(之五) --借鉴mybatis
数据库·mybatis
东风破_12 小时前
danci 2:创建的单词书到底存在哪里?从 Supabase 一路理解 ORM、Drizzle 和 RLS
数据库·后端·node.js
橙子家13 小时前
OSS 文件上传的几个风险点和解决方案
数据库
2601_9620664915 小时前
【Sql Server】Update中的From语句,以及常见更新操作方式
android·java·数据库
愤怒的苹果ext16 小时前
MySQL Shell备份恢复数据库
数据库·mysql·备份恢复·mysqlsh
数字新视界17 小时前
DCIM管理系统的技术架构与部署模式详解
数据库·物联网·数据中心·数据中心基础设施管理·dcim管理系统