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)

相关推荐
数据知道1 小时前
PostgreSQL 故障排查:如何找出数据库中最耗时的 SQL 语句
数据库·sql·postgresql
qq_12498707531 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
枷锁—sha1 小时前
【SRC】SQL注入WAF 绕过应对策略(二)
网络·数据库·python·sql·安全·网络安全
Coder_Boy_1 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Gain_chance1 小时前
35-学习笔记尚硅谷数仓搭建-DWS层最近n日汇总表及历史至今汇总表建表语句
数据库·数据仓库·hive·笔记·学习
此生只爱蛋2 小时前
【Redis】主从复制
数据库·redis
马猴烧酒.2 小时前
【面试八股|JAVA多线程】JAVA多线程常考面试题详解
java·服务器·数据库
天天爱吃肉82182 小时前
跟着创意天才周杰伦学新能源汽车研发测试!3年从工程师到领域专家的成长秘籍!
数据库·python·算法·分类·汽车
大巨头3 小时前
sql2008 数据库分页语句
数据库
m0_715575343 小时前
使用PyTorch构建你的第一个神经网络
jvm·数据库·python