最近学习网络编程,为了解其实际应用场景,本文分析 redis-py 与 Redis 服务器通信的问题。

如何与 redis 服务器通信

类似浏览器与 web 服务器通信使用 HTTP 协议。跟据 Redis 协议规范, Redis 客户端使用 RESP 与服务器进行通信。 RESP 是 Redis 所特有的协议,使用 TCP 或 Unix Socket 进行通信。

RESP 具体的规定如下

一共有 5 种数据类型。

使用第一个字符标识数据类型

类型 字符
简单字符串 +
错误 -
整型 :
批量字符串 $
列表 *

不同数据类型使用 “\r\n”(CRLF) 结尾。

每个数据类型的说明

  • 简单字符串
    许多 Redis 命令在成功时返回 “OK” : “+OK\r\n”
  • 错误
    基本格式是: “-Error message\r\n”
  • 整型
    “:0\r\n”
  • 批量字符串
    “$6\r\nfoobar\r\n”
  • 列表
    “*2\r\n$3\r\nfoo\r\n$3\r\nbar\r\n”

具体通信过程演示

以下使用 IPython 执行操作命令,并通过 Wireshark 抓包,以便查看具体通信过程。
注意, Wireshark 中左边显示的 0d 0a 就是 ‘\r\n’ 的 ASCII 码值。

  1. 给 key1 插入数据 value1

  2. 自增 key1 的值,引发一个错误(因为 key1 的值不可自增)

  3. 查询 key1 是否存在

  4. 获取 key1 的值