Redis 版本:7.0.15
1.概述
Redis 是一个基于内存的数据库,这意味着其主要数据存储和操作均在内存中进行。这种设计使得 Redis 能够提供极快的读写速度(通常达到微秒级别),适用于高性能场景,如缓存。
- 然而,由于内存的易失性 (断电后数据会丢失),Redis 提供了
持久化机制:将内存中的数据保存到磁盘中,确保数据在 Redis 服务重启或崩溃后能够恢复。通过持久化,可以避免数据丢失,提高数据的可靠性。 - Redis 提供两种持久化方式
- RDB(Redis Database):生成数据集的快照实现持久化
- AOF(Append Only File):记录所有写操作命令,以追加方式写入文件
2.RDB
RDB 指的是 Redis 的一种持久化机制,其核心是生成 Redis 数据在某个时间点的 快照。
2.1 快照原理
由于 Redis 是单线程应用程序,在线上环境时,不仅要处理来自客户端的请求,还要执行内存快照操作 (进行文件 IO)。单线程同时处理客户端请求和文件 IO 时会严重降低服务器性能,甚至阻塞客户端请求。因此,Redis 使用 fork 和 写实拷贝 (Copy On Write) 机制来实现 快照持久化。
fork
Redis 在进行 RDB 持久化时会调用 fork 函数来创建一个子进程负责完成,父进程则继续处理客户端请求。子进程在创建之初和父进程共享同一数据段。
Linux 操作系统的内存空间被分为很多种片段,每个片段又被分为很多个页面,每个页面 4KB。
写实拷贝
当父进程对数据段中的某一数据页面进行修改操作时,Linux 操作系统会将该数据页面复制一份分离出来,然后对该页面进行修改,最后父进程指向修改后的页面。随着被修改的页面越来越多,内存空间不断膨胀,最多达到原来的两倍。
从子进程被创建出来的那一刻起,直至拷贝结束,子进程始终指向原始的数据段且所有原数据段不会被修改。所以,在整个拷贝过程中 RDB 快照 = 子进程看到的所有数据页面的瞬间状态集合。
拷贝完成后,子进程会被销毁,同时没有指针指向的数据页面也会被销毁。


