Bootstrap

Redis 架构与设计

Redis 是一种开源的高性能内存键值数据库,其架构设计围绕简单、快速和高效展开。


1. Redis 的核心架构

Redis 是一个基于 C 语言编写的单线程内存数据库,但通过多路复用实现了高效的并发处理。它的架构主要由以下几个模块组成:

a. 客户端与服务器
  • Redis 采用客户端-服务器架构:
    • 客户端发送命令请求。
    • 服务器处理请求并返回结果。
  • 通信使用 RESP(Redis Serialization Protocol) 协议。
b. 内存存储
  • 所有数据存储在内存中,确保极高的性能。
  • 支持多种数据结构(如字符串、列表、集合、哈希表、有序集合等)。
c. 持久化模块
  • Redis 提供两种持久化机制:
    1. RDB(Redis DataBase)
      • 定期快照持久化,将内存中的数据写入磁盘。
      • 适合快速恢复大量数据。
    2. AOF(Append Only File)
      • 将每条写命令记录到日志文件中。
      • 更加实时,但文件体积较大。
  • 可以同时启用 RDB 和 AOF,提供数据安全与快速恢复的平衡。
d. 事件循环
  • Redis 通过 Reactor 模型实现高并发处理。
    • 使用单线程事件循环处理网络请求和数据操作。
    • 通过 I/O 多路复用(如 epoll 或 select)监听多个文件描述符。
e. 集群与高可用
  • 主从复制
    • 支持主从复制模式,从节点自动同步主节点的数据。
    • 主节点处理写请求,从节点分担读请求。
  • 哨兵模式(Sentinel)
    • 提供故障检测和自动主从切换。
  • 集群模式(Cluster)
    • 数据分片存储,支持水平扩展,分布式部署。

2. Redis 的设计特点

a. 内存操作
  • Redis 数据完全存储在内存中,通过内存操作实现极快的读写速度。
  • 使用高效的数据结构(如跳表、哈希表等)优化性能。
b. 单线程模型
  • Redis 使用单线程处理客户端请求,避免了多线程上下文切换的开销。
  • 单线程依赖于高效的 I/O 多路复用,提供了超高的并发性能。
c. 丰富的数据结构

Redis 支持多种数据结构,使其适合不同场景:

  • 字符串:支持存储简单的键值对。
  • 列表:用于队列或栈操作。
  • 集合:提供无序、唯一元素的集合。
  • 有序集合:支持按分值排序的集合。
  • 哈希表:适合存储对象或字段集合。
d. 可扩展性
  • 支持哨兵模式和集群模式,实现高可用和水平扩展。
  • Cluster 模式将数据分片存储在多个节点,通过哈希槽分布。

3. Redis 的工作流程

a. 命令处理
  1. 客户端通过 TCP 连接到 Redis 服务器。
  2. 客户端发送命令(如 GETSET)。
  3. Redis 使用单线程事件循环解析并执行命令。
  4. 结果返回客户端。
b. 数据操作
  • 所有操作在内存中完成,读写速度极快。
  • 持久化机制(RDB 或 AOF)在后台进行,不影响前台性能。
c. 持久化机制
  • RDB
    • 在指定的时间间隔生成内存快照并保存到磁盘。
    • 支持手动触发(SAVEBGSAVE)。
  • AOF
    • 每次写操作都记录到日志文件中。
    • 提供三种刷盘策略:
      • 每次写操作都刷盘。
      • 每秒刷盘一次(默认)。
      • 由操作系统决定刷盘时间。
d. 主从复制
  1. 从节点发送 SYNC 请求到主节点。
  2. 主节点创建 RDB 快照并传输到从节点。
  3. 后续的写操作通过增量日志同步到从节点。

4. Redis 集群架构

Redis 集群采用 无中心分布式架构,由多个节点组成,每个节点保存部分数据。

a. 数据分片
  • 数据根据键的哈希值分布到 16384 个哈希槽(slots)。
  • 每个节点负责一部分哈希槽。
b. 高可用
  • 每个节点可以有一个或多个从节点。
  • 如果主节点故障,集群会选举从节点为新的主节点。
c. 客户端交互
  • 客户端通过任意节点访问集群。
  • 节点会将请求转发到数据所在的节点。

5. Redis 的应用场景

Redis 的性能和多样性使其适用于多种场景:

  1. 缓存:利用内存存储和高吞吐量,减少数据库压力。
  2. 消息队列:使用列表(List)或发布订阅(Pub/Sub)功能实现消息队列。
  3. 排行榜:通过有序集合(Sorted Set)构建实时排行榜。
  4. 会话管理:存储用户会话数据,实现快速验证。
  5. 分布式锁:使用键的过期时间实现分布式锁机制。
  6. 实时分析:存储实时数据并快速计算。

6. Redis 架构示意图

+-------------------+       +-------------------+
|    Redis 主节点    |<----->|    Redis 从节点    |
+-------------------+       +-------------------+
         |                          |
         v                          v
+-------------------+       +-------------------+
|  哨兵(Sentinel)  |<----->|  Redis 从节点(备份)|
+-------------------+       +-------------------+
         ^
         |
+-------------------+
|      客户端        |
+-------------------+

7. Redis 的优缺点

优点
  • 极高的性能:读写速度快(每秒百万级操作)。
  • 多样的数据结构:支持复杂的数据建模。
  • 易用性:简单易学,API 友好。
  • 可扩展性:通过哨兵和集群模式支持高可用和分布式部署。
缺点
  • 内存占用高:所有数据存储在内存中。
  • 单线程瓶颈:尽管单线程很高效,但对某些高 CPU 密集型任务性能有限。
  • 持久化延迟:持久化操作可能导致短暂的性能下降。
;