Redis 是一种开源的高性能内存键值数据库,其架构设计围绕简单、快速和高效展开。
1. Redis 的核心架构
Redis 是一个基于 C 语言编写的单线程内存数据库,但通过多路复用实现了高效的并发处理。它的架构主要由以下几个模块组成:
a. 客户端与服务器
- Redis 采用客户端-服务器架构:
- 客户端发送命令请求。
- 服务器处理请求并返回结果。
- 通信使用 RESP(Redis Serialization Protocol) 协议。
b. 内存存储
- 所有数据存储在内存中,确保极高的性能。
- 支持多种数据结构(如字符串、列表、集合、哈希表、有序集合等)。
c. 持久化模块
- Redis 提供两种持久化机制:
- RDB(Redis DataBase):
- 定期快照持久化,将内存中的数据写入磁盘。
- 适合快速恢复大量数据。
- AOF(Append Only File):
- 将每条写命令记录到日志文件中。
- 更加实时,但文件体积较大。
- RDB(Redis DataBase):
- 可以同时启用 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. 命令处理
- 客户端通过 TCP 连接到 Redis 服务器。
- 客户端发送命令(如
GET
、SET
)。 - Redis 使用单线程事件循环解析并执行命令。
- 结果返回客户端。
b. 数据操作
- 所有操作在内存中完成,读写速度极快。
- 持久化机制(RDB 或 AOF)在后台进行,不影响前台性能。
c. 持久化机制
- RDB:
- 在指定的时间间隔生成内存快照并保存到磁盘。
- 支持手动触发(
SAVE
或BGSAVE
)。
- AOF:
- 每次写操作都记录到日志文件中。
- 提供三种刷盘策略:
- 每次写操作都刷盘。
- 每秒刷盘一次(默认)。
- 由操作系统决定刷盘时间。
d. 主从复制
- 从节点发送 SYNC 请求到主节点。
- 主节点创建 RDB 快照并传输到从节点。
- 后续的写操作通过增量日志同步到从节点。
4. Redis 集群架构
Redis 集群采用 无中心分布式架构,由多个节点组成,每个节点保存部分数据。
a. 数据分片
- 数据根据键的哈希值分布到 16384 个哈希槽(slots)。
- 每个节点负责一部分哈希槽。
b. 高可用
- 每个节点可以有一个或多个从节点。
- 如果主节点故障,集群会选举从节点为新的主节点。
c. 客户端交互
- 客户端通过任意节点访问集群。
- 节点会将请求转发到数据所在的节点。
5. Redis 的应用场景
Redis 的性能和多样性使其适用于多种场景:
- 缓存:利用内存存储和高吞吐量,减少数据库压力。
- 消息队列:使用列表(List)或发布订阅(Pub/Sub)功能实现消息队列。
- 排行榜:通过有序集合(Sorted Set)构建实时排行榜。
- 会话管理:存储用户会话数据,实现快速验证。
- 分布式锁:使用键的过期时间实现分布式锁机制。
- 实时分析:存储实时数据并快速计算。
6. Redis 架构示意图
+-------------------+ +-------------------+
| Redis 主节点 |<----->| Redis 从节点 |
+-------------------+ +-------------------+
| |
v v
+-------------------+ +-------------------+
| 哨兵(Sentinel) |<----->| Redis 从节点(备份)|
+-------------------+ +-------------------+
^
|
+-------------------+
| 客户端 |
+-------------------+
7. Redis 的优缺点
优点
- 极高的性能:读写速度快(每秒百万级操作)。
- 多样的数据结构:支持复杂的数据建模。
- 易用性:简单易学,API 友好。
- 可扩展性:通过哨兵和集群模式支持高可用和分布式部署。
缺点
- 内存占用高:所有数据存储在内存中。
- 单线程瓶颈:尽管单线程很高效,但对某些高 CPU 密集型任务性能有限。
- 持久化延迟:持久化操作可能导致短暂的性能下降。