Redis 核心知识
深入理解 Redis 的核心在于掌握其单线程事件循环架构、底层数据结构编码转换、内存淘汰机制以及持久化开销。
1. 线程模型与单线程高性能本质
为什么单线程能做到 10W+ QPS?
- 纯内存操作:所有核心读写均直接在 RAM 中完成,避免了磁盘 I/O 延迟。
- 非阻塞 I/O 多路复用(epoll / kqueue):单线程轮询多个客户端连接的文件描述符,仅在有事件就绪时才执行处理。
- 消除并发竞争与上下文切换:无需互斥锁(Mutex)保护共享数据结构,避免了多线程 CPU 上下文切换的额外开销。
- Redis 6.0+ I/O 多线程:仅将网络协议解析与数据回包分发给辅助线程,命令执行依然由主线程单线程严格串行执行。
2. 内存过期策略与淘汰算法
过期键删除机制
Redis 组合采用两种策略回收过期 Key:
- 惰性删除(Lazy Eviction):客户端访问 Key 时才检查是否过期,若过期则立即删除。
- 定期采样删除(Active Eviction):后台定时任务随机采样抽取部分带 TTL 的 Key,若过期比例超过 25% 则继续循环清理。
内存满时的淘汰策略(Maxmemory Policies)
当内存达到 maxmemory 上限时,根据配置策略释放空间:
allkeys-lru/volatile-lru:近似 LRU 算法,优先淘汰最近最少使用的 Key。allkeys-lfu/volatile-lfu:基于访问频率的 LFU 算法,淘汰访问频次最低的 Key。noeviction(默认):内存满时不淘汰任何数据,直接对新写入命令报错。
3. 持久化机制:RDB vs AOF
| 维度 | RDB 快照 | AOF 日志 |
|---|---|---|
| 原理 | bgsave 调用 fork() 创建子进程,利用操作系统的 Copy-on-Write(写时复制)机制将内存全量 dump 到磁盘。 | 实时将每个写命令以文本协议追加写入磁盘文件。 |
| 恢复速度 | 极快(直接加载二进制数据结构)。 | 较慢(需要从头重放所有写命令)。 |
| 数据安全性 | 两次快照之间的数据可能丢失(RPO 较大)。 | 取决于 appendfsync(always, everysec, no),通常最多丢失 1 秒数据。 |
| 7.0 演进 | - | Multi-Part AOF:将 AOF 拆分为基础文件(Base)与增量文件(Incremental),消除 AOF 重写期间的内存翻倍暴涨。 |