【Redis原理篇(二)】通信协议

Redis采用RESP协议,一种简洁的文本协议,便于解析且性能高效。协议包括五种基本数据类型:单行字符串、多行字符串、整数、错误和数组。客户端发送指令如'set'序列化为多行字符串数组,服务器则通过单行字符串、整数或多行字符串响应,例如'OK'、错误消息或返回值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Redis 通信协议

0.前言

Redis作者任务数据库系统的瓶颈一般不在于流量,而是在于数据库自身内部的处理逻辑上,所以即使Redis使用了比较浪费流量的文本协议,但是依旧获取极高的访问性能。

1. RESP

RESP是Redis的序列化协议(Redis Serialization Protocol),是一种直观的文本协议,优势在于实现过程异常简单,解析性能较好。

Redis协议将传输的数据结构分为5中最小单元类型,单元结束时统一加上回车换行符号\r\n

  1. 单行字符串以+符号开头。
  2. 多行字符串以$符号开头,后紧接着字符串的长度。
  3. 整数值以:符号开头,后面接着整数的字符串形式。
  4. 错误消息以-符号开头。
  5. 数组以*符好投,后面接着数组的长度。
# 单行字符串 hello world 
+hello world\r\n
# 多行字符串 hello world
$11\r\nhello world\r\n
# 整数 1024
:1024\r\n
# 错误
-WRONGTYPE ERROR
# 数组 [1,2,3]
*3\r\n:1\r\n:2\r\n:3\r\n
# NULL表示
$-1\r\n
# 空串
$0\r\n\r\n # 这里的两个\r\n是因为两个\r\n之间隔的是空串

2. 客户端与服务器之间的响应

客户端->服务器

客户端向服务器发送的指令只有一种格式,多行字符串数组,比如一个简单的set指令set author leesure会被序列化为下面的字符串。

*3\r\n$3\r\nset\r\n$6\r\nauthor\r\n$7\r\nleesure\r\n

服务器->客户端

服务器向客户端回复的响应要支持多种数据结构,一共有5种基本类型的组合。

#单行字符串 OK
+OK\r\n
# 错误响应
- ERR value is not an integer
# 整数响应 1
:1
# 多行字符串响应 leesure
$7\r\nleesure\r\n
### Redis 网络模型原理深入分析 Redis 是一种高性能的键值存储系统,其网络模型的设计对于其实现高吞吐量和低延迟至关重要。以下是关于 Redis 网络模型的一些核心概念和技术细节: #### 1. 单线程事件驱动模型 Redis 使用单线程事件驱动模型处理客户端请求。这种设计简化了并发控制逻辑,避免了多线程环境下的锁竞争问题[^2]。具体来说,Redis 的主线程通过 epoll/kqueue/select 等 I/O 多路复用机制监听多个文件描述符上的事件。 - **I/O 多路复用**:Redis 利用了高效的 I/O 多路复用技术(epoll 或 kqueue),使得它可以同时监控大量连接的状态变化并快速做出反应。 - **事件循环**:所有的命令执行都由一个事件循环管理,该循环负责接收新连接、读取数据、写回响应以及关闭连接等操作。 #### 2. 非阻塞 I/O 和零拷贝优化 为了提高性能,Redis 实现了非阻塞 I/O 并尽可能减少内存复制开销。例如,在发送大对象给客户端时,Redis 可能会利用操作系统层面的零拷贝特性(sendfile 或 mmap)来降低 CPU 负载[^4]。 #### 3. 客户端缓冲区管理 每个连接都有独立的输入/输出缓冲区用于暂存未处理的数据包或者待传输的结果集。如果某个客户端长时间不消费消息,则可能导致服务器端资源耗尽;因此需要设置最大缓冲区大小限制以防止恶意攻击者占用过多内存空间。 #### 4. AOF 日志持久化与异步刷盘策略 虽然这主要涉及磁盘子系统的交互而非纯粹意义上的“网络”,但在讨论整体架构时仍值得一提——当启用 Append Only File (AOF) 功能后,每次修改都会追加记录到日志文件中以便恢复用途。为了避免频繁同步造成瓶颈效应,默认情况下采用后台进程定期调用 fsync() 方法完成实际落地动作从而减轻前台压力[^1]。 ```python import redis r = redis.Redis(host='localhost', port=6379, db=0) print(r.ping()) # 测试连接状态 ``` #### 5. 主从复制中的网络通信协议 在主从模式下,Slave 节点初次建立链接之后会向 Master 请求全量快照 RDB 文件并通过 socket 下载下来加载至本地实例里形成初始副本关系;随后两者之间保持心跳检测的同时持续推送增量更新指令流直至断链重连为止[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

企鹅宝儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值