首先明确一点: redis持久化是为了崩溃重启后能把缓存恢复。防止造成缓存击穿 进而引发雪崩。
rdb:是redis默认的存储方式,RDB方式是通过快照( snapshotting )完成的。保存的是内存空间这一刻的数据,不记录命令过程。
触发快照的方式:
1. 符合自定义配置的快照规则
2. 执行save或者bgsave命令
3. 执行flflushall命令
4. 执行主从复制操作 (第一次)
常见配置如下:
save "" # 不使用RDB存储 不能主从
save 900 1 # 表示15分钟(900秒钟)内至少1个键被更改则进行快照。
save 300 10 # 表示5分钟(300秒)内至少10个键被更改则进行快照。
save 60 10000 # 表示1分钟内至少10000个键被更改则进行快照
RDB执行流程:
- Redis父进程首先判断:当前是否在执行save,或bgsave/bgrewriteaof(aof文件重写命令)的子
进程,如果在执行则bgsave命令直接返回。 - 父进程执行fork(调用OS函数复制主进程)操作创建子进程,这个复制过程中父进程是阻塞的,
Redis不能执行来自客户端的任何命令。 - 父进程fork后,bgsave命令返回”Background saving started”信息并不再阻塞父进程,并可以响
应其他命令。 - 子进程创建RDB文件,根据父进程内存快照生成临时快照文件,完成后对原有文件进行原子替换。
(RDB始终完整) - 子进程发送信号给父进程表示完成,父进程更新统计信息。
其实主要就是 先检测是否已经有子进程在执行了,有就返回,没有就调用操作系统的函数复杂主进程,创建子进程,在复制父进程的时候,会阻塞redis,不能执行来自客户端的任何命令。fork子进程之后,就不再阻塞父进程。然后子进程创建rdb文件进行快照。快照之后会对原有文件进行院子替换。rdb文件始终会保证只有一份并且完整。创建完之后,子进程会告诉父进程,活干完了,你可以重新计时了,就是那个触发快照的条件刷新下。
RDB的优缺点
优点
RDB是二进制压缩文件,占用空间小,便于传输(传给slaver)
主进程fork子进程,可以最大化Redis性能,主进程不能太大,Redis的数据量不能太大,复制过程中主
进程阻塞
缺点
不保证数据完整性,会丢失最后一次快照以后更改的所有数据