跳转到正文

Redis 核心知识 ​

深入理解 Redis 的核心在于掌握其单线程事件循环架构、底层数据结构编码转换、内存淘汰机制以及持久化开销。

1. 线程模型与单线程高性能本质 ​

为什么单线程能做到 10W+ QPS? ​

  1. 纯内存操作:所有核心读写均直接在 RAM 中完成,避免了磁盘 I/O 延迟。
  2. 非阻塞 I/O 多路复用(epoll / kqueue):单线程轮询多个客户端连接的文件描述符,仅在有事件就绪时才执行处理。
  3. 消除并发竞争与上下文切换:无需互斥锁(Mutex)保护共享数据结构,避免了多线程 CPU 上下文切换的额外开销。
  • Redis 6.0+ I/O 多线程:仅将网络协议解析与数据回包分发给辅助线程,命令执行依然由主线程单线程严格串行执行。

2. 内存过期策略与淘汰算法 ​

过期键删除机制 ​

Redis 组合采用两种策略回收过期 Key:

  1. 惰性删除(Lazy Eviction):客户端访问 Key 时才检查是否过期,若过期则立即删除。
  2. 定期采样删除(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 重写期间的内存翻倍暴涨。

Released under the MIT License.