01-05
03 | 高性能IO模型:为什么单线程Redis能那么快?
- Redis 的单线程:主要指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,这也是 Redis 对外提供键值存储服务的主要流程,但其他功能(持久化、异步删除、集群数据同步等)其实是由额外的线程执行的
05 | 内存快照,宕机后Redis的快速恢复
- RDB(Redis Database):全量快照
- 两个命令:
- save: 在主线程中执行,会导致阻塞
- bgsave: 默认配置,fork一个子进程,专门用于写入RDB文件,避免主线程的阻塞
- 快照时数据修改: 避免阻塞 != 正常处理写操作,借助操作系统提供的写时复制技术(Copy-OnWrite,COW),在执行快照的同时正常处理写操作
- 频繁执行全量快照带来的问题:
- 频繁写磁盘,带来磁盘压力,多个快照竞争有限的磁盘带宽
- bgsave子进程需要通过fork操作从主线程创建出来,创建过程会阻塞主线程,主线程内存越大,阻塞时间越长
- 增量快照: 在做一次全量快照后,后续快照只对修改的数据进行快照记录,以避免每次全量快照的开销
- AOF日志+内存快照(Redis 4.0): 内存快照以一定频率执行,两次快照之间,使用AOF日志记录这期间所有的命令操作