持久化的定义
因为Redis是将数据存放在内存中的, 而内存中的数据是容易丢失的,使用持久化可以有效地避免因进程退出造成数据丢失问题, 当下次重启时利⽤之前持久化的⽂件即可实现数据恢复
使用"RDB"持久化
RDB全称"Redis Data Bases", RDB 持久化是把当前进程数据⽣成快照 以二进制的数据形式保存到硬盘的过程,触发 RDB 持久化过程分为⼿动触发和⾃动触发。RDB文件的说明:RDB文件是Redis将内存中的数据写入硬盘中,而生成的文件, 当Redis重启时, 它就会自动读取RDB文件里的数据到内存中.
自动触发
Redis 运行自动触发 RDB 持久化机制,这个触发机制才是在实战中有价值的。
1. 打开redis客户端的配置文件修改save 配置。如 "save m n" 表示 m 秒内数据集发生了 n 次修改,自动 RDB 持久化。
2. 从节点进行全量复制操作时,主节点自动进行 RDB 持久化,随后将 RDB 文件内容发送给从结点。
3. 执行 shutdown 命令关闭 Redis 时,执行 RDB 持久化
手动触发
1.使用''save"命令
用户在客户端输入"save"命令, 阻塞立即当前 Redis 服务器,直到 RDB 过程完成为⽌,但对于内存⽐较⼤的数据会造成⻓时间的阻塞,所以基本不采⽤。注意:save是直接将数据写入原来的RDB文件中
2.使用"bgsave"命令
用户在客户端输入"bgsave"命令, 此时RDB过程的原理图如下:

bgsave的使用原理是利用"多进程"的方式进行写入硬盘.步骤大致如下:
- 输入bgsave后系统会判断需要写入数据的''父进程''是否有子进程.如果有则返回子进程
如果没有则利用Linux系统特有的"fork"指令创建一个与父进程完全一致的子进程(子进程的信息功能,数据和父进程完全一致,可以做到和父进程一样的操作) - 然后子进程就会执行数据写入操作,生成对应的RDB文件, 而父进程会继续执行后续用户的其他命令
- 当数据写入完毕时,子进程会通知父进程. 父进程得到通知后将相关信息进行复制并销毁子进程
注意:bgsave是创建一个新的RDB文件并将数据写入,之后用新的文件去替换旧的RDB文件
使用RDB的持久化的优缺点
优点
• Redis 加载 RDB 恢复数据远远快于 AOF 的⽅式
• RDB 是⼀个紧凑压缩的⼆进制⽂件,代表 Redis 在某个时间点上的数据快照。⾮常适⽤于备份,全 量复制等场景。⽐如每 6 ⼩时执⾏ bgsave 备份,并把 RDB ⽂件复制到远程机器或者⽂件系统中 (如 hdfs)⽤于灾备
缺点
• RDB ⽅式数据没办法做到实时持久化 / 秒级持久化。因为 bgsave 每次运⾏都要执⾏ fork 创建⼦进程,属于重量级操作,频繁执⾏成本过⾼。
• RDB ⽂件使⽤特定⼆进制格式保存,Redis 版本演进过程中有多个 RDB 版本,兼容性可能有⻛ 险。
使用"AOF"持久化
AOF全称(Append Only File),它的持久化原理是:将用户对Redis的操作命令全部记录下来放到文件中, 当服务器重启时, 就会再执行一遍,这样就恢复了之前的数据.
这种做法做到了实时存储 , 而且一旦配置中开启了AOF持久化那么Redis则默认使用AOF持久化
AOF的工作流程
AOF的工作流程分为:命令写入, 文件同步 和 AOF文件重写
1.命令写入
AOF写入数据的方式是以文本形式写入文件中, 并且命令会先写入缓冲区中, 并由缓冲区一次性将命令写入到文件中.
2.文件同步
缓冲区内的数据写入文件中的时机 可以在客户端的配置文件中修改,可修改的值如下:
always:将一个命令写入aof_buf的缓冲区中, 之后立即将缓冲区的命令写到文件中
everysec:将命令写入aof_buf的缓冲区中, 不会立即写到文件中, 而是过一秒之后再写入文件中
no:将命令写入aof_buf时, 不会主动写入文件中, 而是交给操作系统决定何时写入文件
3.AOF文件重写

文件重写也就是更新文件中的内容, AOF的文件重写机制与RDB的机制类似都是利用**"多进程"**
1: 如果当前进程正在执行 AOF 重写,请求不执行。如果当前进程正在执行 bgsave 操作,重写命令延迟到 bgsave 完成之后再执行。
2: 没有子进程就会用系统的"fork"命令复制一个一样的进程作为子进程, 子进程可以执行和父进程一样的操作
3.1:父进程会执行后续的命令,将后续命令写到缓冲区中, 并同步到旧的AOF文件中. (这样做是为了子进程意外中断, 导致所有数据都未保存,此时旧的文件依然保存了一些数据)
3.2:父进程执行后续的命令的同时会将新的命令写入aof_rewrite_buf中, 让子进程将新的命令追加到新的AOF文件中
4:子进程会创建一个新的AOF文件并将命令写入
5.1:写入完成后通知父进程
5.2:父进程把 AOF重写缓冲区内临时保存的命令追加到新 AOF文件中。
5.3:将新 AOF 文件替换旧的AOF文件。
混合持久化
混合持久化是指:
Redis的混合持久化结合了RDB(快照)和AOF(日志)两种持久化方式的优点,在性能、数据安全性和恢复效率上取得了平衡。AOF文件中每次最后追加的内容是文本形式,但之前的数据以二进制的形式存在
这种方式的好处是:降低了文件的硬盘空间的占用量
