Skip to content

面试速答(先看这里)

**一句话结论:**其中,<number of arguments> 表示参数个数,<length of argument> 表示参数数据的长度,<argument data> 表示参数数据。

60秒标准回答:

Redis 使用自己设计的一种文本协议进行客户端与服务端之间的通信——RESP(REdis Serialization Protocol), 这种协议简单、高效,易于解析,被广泛使用

RESP 协议基于 TCP 协议 ,采用请求/响应模式,每条请求由多个参数组成,以命令名称作为第一个参数。请求和响应都以行结束符(\r\n)作为分隔符,具体格式如下

其中,<number of arguments> 表示参数个数,<length of argument> 表示参数数据的长度,<argument data> 表示参数数据。参数可以是字符串、整数、数组等数据类型

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**Redis 使用自己设计的一种文本协议进行客户端与服务端之间的通信——RESP(REdis Serialization Protocol), 这种协议简单、高效,易于解析,被广泛使用。
  • **要点2:**RESP 协议基于 TCP 协议 ,采用请求/响应模式,每条请求由多个参数组成,以命令名称作为第一个参数。
  • **要点3:**例如,以下是一个 Redis 协议的示例请求和响应:
  • **要点4:**上面的请求表示向 Redis 服务器设置一个名为 "mykey" 的键,值为 "myvalue"。
  • **要点5:**除了基本的 GET、SET 操作,Redis 还支持事务、Lua 脚本、管道等高级功能,这些功能都是通过 Redis 协议来实现的。

**记忆锚点:**Redis → argument → myvalue → mykey → RESP → SET

追问准备:

  • 围绕「Redis」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「argument」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「myvalue」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

**Redis 使用自己设计的一种文本协议进行客户端与服务端之间的通信——RESP(REdis Serialization Protocol),**这种协议简单、高效,易于解析,被广泛使用。

RESP 协议基于 TCP 协议,采用请求/响应模式,每条请求由多个参数组成,以命令名称作为第一个参数。请求和响应都以行结束符(\r\n)作为分隔符,具体格式如下:

java
*<number of arguments>\r\n
$<length of argument 1>\r\n
<argument data>\r\n
...
$<length of argument N>\r\n
<argument data>\r\n

其中,<number of arguments> 表示参数个数,<length of argument> 表示参数数据的长度,<argument data> 表示参数数据。参数可以是字符串、整数、数组等数据类型。

例如,以下是一个 Redis 协议的示例请求和响应:

请求:

java
*3\r\n
$3\r\n
SET\r\n
$5\r\n
mykey\r\n
$7\r\n
myvalue\r\n

响应:

plain
+OK\r\n

上面的请求表示向 Redis 服务器设置一个名为 "mykey" 的键,值为 "myvalue"。响应返回 "+OK" 表示操作成功。

> "$3\r\n"表示参数长度为3,即下一个参数是一个3个字符的字符串。它表示要执行的命令是"SET",即设置键值对。 > > "$5\r\n"表示参数长度为5,即下一个参数是一个5个字符的字符串。它表示要设置的键是"mykey"。 > > "$7\r\n"表示参数长度为7,即下一个参数是一个7个字符的字符串。它表示要设置的值是"myvalue"。

除了基本的 GET、SET 操作,Redis 还支持事务、Lua 脚本、管道等高级功能,这些功能都是通过 Redis 协议来实现的。