Skip to content

Redis 逻辑架构 ​

Redis核心组件 ​

客户端层 ​

客户端层负责与Redis服务器进行通信,包括发送命令、接收响应和处理连接管理。

客户端库 ​

  • 支持多种编程语言(Python、Java、Node.js、Go等)
  • 提供连接池、自动重连、命令封装等功能
  • 处理命令的序列化和响应的反序列化

客户端协议 ​

  • 使用RESP(Redis Serialization Protocol)协议
  • 简单、高效、易实现
  • 支持批量命令和管道操作

网络层 ​

网络层负责处理客户端的连接请求和网络通信。

事件循环 ​

  • 使用I/O多路复用技术(epoll/kqueue)
  • 处理客户端连接、读写事件
  • 支持多种事件类型:连接事件、读事件、写事件

连接管理 ​

  • 接受新的客户端连接
  • 管理现有连接
  • 处理连接超时和关闭

多线程I/O(Redis 6.0+) ​

  • 网络I/O操作由多个线程处理
  • 命令执行仍为单线程
  • 提高网络处理能力,降低延迟

命令执行层 ​

命令执行层负责解析和执行客户端发送的命令。

命令解析 ​

  • 解析客户端发送的RESP格式命令
  • 验证命令的合法性和参数
  • 转换为内部命令结构

命令执行器 ​

  • 单线程执行命令,保证原子性
  • 根据命令类型调用相应的处理函数
  • 维护命令执行的上下文

命令队列 ​

  • 存储待执行的命令
  • 按照FIFO(先进先出)顺序执行
  • 支持命令优先级(部分命令)

数据处理层 ​

数据处理层负责数据的存储、检索和操作。

数据结构 ​

  • 实现各种数据类型:String、List、Set、Hash、ZSet、Stream等
  • 每种数据类型有对应的底层实现
  • 支持丰富的操作命令

内存管理 ​

  • 管理Redis使用的内存空间
  • 处理内存分配和释放
  • 实现内存淘汰策略

事务处理 ​

  • 支持MULTI/EXEC事务
  • 实现WATCH命令的乐观锁机制
  • 支持事务的回滚和提交

Lua脚本执行 ​

  • 内嵌Lua解释器
  • 支持服务器端执行Lua脚本
  • 脚本内命令原子执行

持久化层 ​

持久化层负责将内存中的数据持久化到磁盘,确保数据安全。

RDB持久化 ​

  • 定期将内存中的数据快照保存到磁盘
  • 支持手动触发和自动触发
  • 适合备份和灾难恢复

AOF持久化 ​

  • 记录所有写命令到日志文件
  • 支持多种同步策略
  • 数据安全性高

混合持久化(Redis 4.0+) ​

  • 结合RDB和AOF的优点
  • 提高恢复速度和数据安全性

复制层 ​

复制层负责Redis主从节点之间的数据同步。

复制机制 ​

  • 支持主从复制
  • 实现全量复制和部分复制
  • 保证数据一致性

复制拓扑 ​

  • 支持一主多从
  • 支持链式复制
  • 适合读写分离场景

集群层 ​

集群层负责Redis Cluster的分布式协调和数据分片。

数据分片 ​

  • 使用哈希槽(Hash Slot)进行数据分片
  • 支持16384个哈希槽
  • 数据自动分布到不同节点

节点发现 ​

  • 自动发现集群中的节点
  • 维护节点关系图
  • 处理节点加入和退出

故障转移 ​

  • 自动检测节点故障
  • 选举新的主节点
  • 重新分片数据

Redis数据流程 ​

读操作流程 ​

  1. 客户端发送读命令(如GET、LRANGE等)
  2. 网络层接收命令并放入命令队列
  3. 命令执行层解析并执行命令
  4. 数据处理层从内存中读取数据
  5. 命令执行层将结果返回给网络层
  6. 网络层将结果发送给客户端

写操作流程 ​

  1. 客户端发送写命令(如SET、LPUSH等)
  2. 网络层接收命令并放入命令队列
  3. 命令执行层解析并执行命令
  4. 数据处理层修改内存中的数据
  5. 如果开启持久化,将命令写入AOF文件或触发RDB快照
  6. 如果是主节点,将写命令同步给从节点
  7. 命令执行层将结果返回给网络层
  8. 网络层将结果发送给客户端

Redis单线程模型 ​

单线程设计的优势 ​

  • 避免线程切换和锁竞争的开销
  • 简化并发控制,保证命令执行的原子性
  • 降低内存占用和CPU消耗
  • 易于调试和维护

单线程模型的限制 ​

  • 单核心CPU利用率限制
  • 长时间执行的命令会阻塞其他命令
  • 网络I/O可能成为瓶颈

Redis 6.0的优化 ​

  • 引入多线程I/O,提高网络处理能力
  • 命令执行仍为单线程
  • 保持单线程模型的优势,同时提高性能

Redis关键设计原则 ​

简单性 ​

  • 设计简洁,易于理解和维护
  • 专注于核心功能,避免复杂特性
  • 代码量相对较小,便于调试

高性能 ​

  • 内存存储,访问速度快
  • 单线程命令执行,避免并发开销
  • 高效的网络模型,支持高并发

可靠性 ​

  • 支持多种持久化机制
  • 支持主从复制和集群
  • 提供故障转移和自动恢复

可扩展性 ​

  • 支持主从复制,提高读性能
  • 支持Redis Cluster,实现水平扩展
  • 支持模块系统,扩展功能

Redis逻辑架构的演变 ​

Redis 2.8之前 ​

  • 基本的单线程模型
  • 支持主从复制
  • 支持RDB和AOF持久化

Redis 2.8 ​

  • 引入Redis Sentinel,提供高可用性
  • 支持部分复制,减少复制开销
  • 改进的内存管理

Redis 3.0 ​

  • 引入Redis Cluster,支持分布式集群
  • 自动分片和故障转移
  • 提高扩展性

Redis 4.0 ​

  • 引入混合持久化
  • 引入模块系统
  • 支持非阻塞删除

Redis 5.0 ​

  • 引入Stream数据结构
  • 改进的集群管理
  • 更好的内存优化

Redis 6.0 ​

  • 引入多线程I/O
  • 支持ACL(访问控制列表)
  • 支持TLS加密

常见问题(FAQ) ​

Q1: Redis的单线程模型为什么能处理高并发请求? ​

A1: Redis的单线程模型能处理高并发请求主要得益于:

  • 内存存储,访问速度极快
  • 高效的数据结构,如哈希表、跳表等
  • I/O多路复用技术,能同时处理大量连接
  • 命令执行时间短,大部分命令在微秒级别完成

Q2: Redis 6.0的多线程I/O如何工作? ​

A2: Redis 6.0的多线程I/O工作原理:

  • 网络I/O操作由多个线程处理
  • 命令解析和执行仍为单线程
  • 线程间通过队列通信
  • 提高网络处理能力,降低延迟

Q3: Redis的持久化会影响性能吗? ​

A3: 持久化会对Redis性能产生一定影响,具体取决于使用的持久化策略:

  • RDB持久化:定期执行,对性能影响较小
  • AOF持久化:
    • 每次写同步:对性能影响较大
    • 每秒同步:对性能影响中等
    • 不同步:对性能影响最小
  • 混合持久化:兼顾性能和数据安全性

Q4: Redis Cluster的数据分片机制是什么? ​

A4: Redis Cluster使用哈希槽(Hash Slot)进行数据分片:

  • 共有16384个哈希槽
  • 每个键通过CRC16算法计算哈希值,然后对16384取模,确定所属的哈希槽
  • 每个节点负责一部分哈希槽
  • 支持动态添加和移除节点,自动重新分片

Q5: Redis的主从复制是如何工作的? ​

A5: Redis主从复制的工作原理:

  1. 从节点向主节点发送SYNC命令
  2. 主节点执行BGSAVE生成RDB文件,并记录此后的写命令
  3. 主节点将RDB文件发送给从节点
  4. 从节点加载RDB文件,恢复数据
  5. 主节点将记录的写命令发送给从节点
  6. 从节点执行这些命令,与主节点保持数据一致
  7. 之后主节点的写命令会实时同步给从节点

Redis 2.8+支持部分复制,当从节点断开连接后重新连接时,只需要同步断开期间的写命令,减少复制开销。