Redis 是一个 基于内存、单线程、事件驱动 的高性能数据库

一、Redis 的特点与应用场景
1. 为什么选择 Redis?
高性能:基于内存存储,单线程模型避免了锁竞争,QPS 可达十万级。
丰富的数据结构:支持字符串、列表、哈希、集合、有序集合等。
简单易用:提供丰富的命令 API,支持多语言客户端。
高可用与扩展性:支持主从复制、哨兵、集群模式。
2. 常见应用场景
缓存:热点数据存储(如商品详情页缓存)。
分布式锁:基于 SETNX 实现的互斥锁。
排行榜:基于有序集合实现用户积分排行。
消息队列:利用 List 或 Stream 实现异步消息处理。
计数器:如访问次数统计、点赞数统计。
二、Redis 的整体架构
Redis 的整体架构可以分为以下几个核心模块:

+—————————-+
| Client API |
+—————————-+
|
v
+—————————-+
| 网络层 (anet.c / ae.c) |
| – 事件驱动 |
| – IO 多路复用 (epoll) |
+—————————-+
|
v
+—————————-+
| 命令解析 (server.c) |
| – 协议 RESP 解析 |
| – 命令分发 |
+—————————-+
|
v
+—————————-+
| 数据结构与存储引擎 |
| – 字符串、列表、哈希等 |
| – redisObject 内存模型 |
+—————————-+
|
v
+—————————-+
| 持久化模块 (RDB/AOF) |
+—————————-+
|
v
+—————————-+
| 高可用模块 (Replication, |
| Sentinel, Cluster) |
+—————————-+

三、单线程模型与事件驱动
1. 为什么 Redis 选择单线程?
避免锁竞争:多线程访问共享数据结构需要加锁,开销大。
内存操作快:绝大多数命令的执行时间都在微秒级,CPU 并不是瓶颈。
事件驱动机制高效:基于 epoll/kqueue 实现高并发连接管理。
2. Redis 事件循环(Reactor 模式)
Redis 的事件循环定义在 ae.c,核心逻辑类似:

while (!server.shutdown_asap) {
// 处理到期的定时任务
processTimeEvents();

// 处理网络事件 (读/写/连接)
aeProcessEvents(server.el, AE_ALL_EVENTS);
}

事件分为两类:

  • 文件事件:网络 IO(客户端请求、复制、持久化写入)。
  • 时间事件:定时任务(如 serverCron,负责持久化检查、超时关闭连接)。

四、Redis 的内存模型与对象系统

Redis 所有数据都是基于 redisObject 封装的:

typedef struct redisObject {
unsigned type:4; // 对象类型 (string/list/hash/…)
unsigned encoding:4; // 编码方式 (raw/int/ziplist/…)
void *ptr; // 指向底层实现的数据结构
int refcount; // 引用计数
unsigned lru:24; // LRU 时间戳
} robj;

特点:

  • 多态存储:不同对象的 ptr 指针指向不同的底层数据结构。
  • 内存优化:小数据可能用压缩列表(ziplist)、整数集合(intset)存储。
  • LRU/LFU 支持:便于实现内存淘汰策略。
欢迎使用66资源网
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
7. 本站有不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别!

66源码网 » Redis 是一个 基于内存、单线程、事件驱动 的高性能数据库

提供最优质的资源集合

立即查看 了解详情