目录
一 认识持久化
(1)先看总结图
(2)什么是持久化?
持久化是指将数据保存在持久存储介质(如硬盘、数据库)中,以确保数据在系统重启或关闭后仍然保持不变。持久化的概念通常应用在计算机领域,确保数据的长期存储和可靠性。在软件开发中,持久化可以是将数据写入文件、数据库或其他可靠的存储介质,而不是仅存在于内存中,以保证数据的持久性和可恢复性。
总结:我们都知道内存有个特性就是掉电易失,而我们的redis就是内存级数据库,如果掉电状态那redis在内存中的数据是不是就丢失了,所以我们要把redis中内存数据保存在硬盘上去形成持久化存储,说大白话,就是数据保存在内存上不叫持久化,保存在硬盘上才叫持久化.
说到持久化就联想到我们MySQL数据库的事务中的四个特性了
- 原子性
- 一致性
- 持久性=>和持久化说的是一个意思
- 隔离性
(3)redis是怎么进行持久化的呢
redis为了保证速度快,数据肯定要在内存中,但是为了持久,数据还是要想办法存储在硬盘上~
所以redis决定在内存存数据,在硬盘上也存数据(这样的两份数据理论上来说是完全相同的,实际上存在小概率有差异,取决于咱们怎么实现持久化)
Redis ⽀持RDB和AOF两种持久化机制,持久化功能有效地避免因进程退出造成数据丢失问题, 当下次重启时利⽤之前持久化的⽂件即可实现数据恢复。
- 介绍RDB、AOF的配置和运⾏流程,以及控制持久化的命令,如bgsave和bgrewriteaof。
- 对常⻅持久化问题进⾏分析定位和优化
总结:
在读取数据的时候直接从内存中读取
在插入新数据或修改的时候,需要把数据同时写到内存和硬盘(说是两边都写,但是实际怎么写硬盘还是有不同的策略可以保证整体的效率还是足够高)
硬盘上的数据是在redis重启的时候,用来恢复内存中的数据
(4)简单分析一下RDB持久化和AOF持久化的不同
总结:
RDB:定期持久化,比如每个月把我电脑上的学习资料,整体进行备份到备份盘里(叫B) ,然后删除旧备份(叫A),再把新备份名字改为旧备份的名字(A->B),这实际就是RDB过程中的一部分
AOF:实时持久化,只要我下载了一个新的学习资料,就立即把这个学习资料在备份盘里备份一份
二 RDB持久化
(1)RDB的触发机制
理论:RDB持久化是把当前redis进程数据⽣成快照保存到硬盘的过程,触发RDB持久化过程分为⼿动触发和 ⾃动触发。
⼿动触发分别对应save和bgsave命令:
- save命令:阻塞当前Redis服务器,直到RDB过程完成为⽌,对于内存⽐较⼤的实例造成⻓时间 阻塞,基本不采⽤。
- bgsave命令:Redis进程执⾏fork操作创建⼦进程,RDB持久化过程由⼦进程负责,完成后⾃动 结束。阻塞只发⽣在fork阶段,⼀般时间很短。
- Redis 内部的所有涉及RDB的操作都采⽤类似bgsave的⽅式。
除了⼿动触发之外,Redis运⾏⾃动触发RDB持久化机制,这个触发机制才是在实战中有价值的。
- 使⽤save配置。如"save m n"表⽰m秒内数据集发⽣了n次修改,⾃动RDB持久化。
- 从节点进⾏全量复制操作时,主节点⾃动进⾏RDB持久化,随后将RDB⽂件内容发送给从结点。
- 执⾏shutdown命令关闭Redis时,执⾏RDB持久化。
对于手动触发和自动触发的解读:
(2)RDB的bgsave执行流程
流程说明:bgsave 是主流的RDB持久化⽅式,下⾯根据图了解它的运作流程。
- 执⾏bgsave命令,Redis⽗进程判断当前进是否存在其他正在执⾏的⼦进程,如RDB/AOF⼦进 程,如果存在bgsave命令直接返回。
- ⽗进程执⾏fork创建⼦进程,fork过程中⽗进程会阻塞,通过infostats命令查看 latest_fork_usec 选项,可以获取最近⼀次fork操作的耗时,单位为微秒。
- ⽗进程fork完成后,bgsave命令返回"Backgroundsavingstarted"信息并不再阻塞⽗进程,可 以继续响应其他命令。
- ⼦进程创建RDB⽂件,根据⽗进程内存⽣成临时快照⽂件,完成后对原有⽂件进⾏原⼦替换。执⾏lastsave 命令可以获取最后⼀次⽣成RDB的时间,对应info统计的rdb_last_save_time选 项。
- 进程发送信号给⽗进程表⽰完成,⽗进程更新统计信息。
ps:fork()是Linux提供的系统调用,通俗来讲就是把父进程的PCB,地址空间,页表,文件描述符等复制一份给子进程,这样父进程中的内存数据子进程就得到了完全相同的一份,就可以进行持久化操作了
(3)RDB文件的处理
保存:RDB⽂件保存再dir配置指定的⽬录(默认/var/lib/redis/)下,⽂件名通过dbfilename 配置(默认dump.rdb)指定。可以通过执⾏configsetdir{newDir}和configsetdbfilename {newFilename} 运⾏期间动态执⾏,当下次运⾏时RDB⽂件会保存到新⽬录。
压缩:Redis默认采⽤LZF算法对⽣成的RDB⽂件做压缩处理,压缩后的⽂件远远⼩于内存⼤ ⼩,默认开启,可以通过参数configsetrdbcompression{yes|no}动态修改。
校验:如果Redis启动时加载到损坏的RDB⽂件会拒绝启动。这时可以使⽤Redis提供的redis check-dump⼯具检测RDB⽂件并获取对应的错误报告。
板书:
(4)RDB的优缺点
- RDB是⼀个紧凑压缩的⼆进制⽂件,代表Redis在某个时间点上的数据快照。⾮常适⽤于备份,全量复制等场景。⽐如每6⼩时执⾏bgsave备份,并把RDB⽂件复制到远程机器或者⽂件系统中 (如hdfs)⽤于灾备。
- Redis加载RDB恢复数据远远快于AOF的⽅式(RDB以二进制进行存储,AOF以文本进行存储)。
- RDB⽅式数据没办法做到实时持久化/秒级持久化。因为bgsave每次运⾏都要执⾏fork创建⼦进程,属于重量级操作,频繁执⾏成本过⾼。
- RDB⽂件使⽤特定⼆进制格式保存,Redis版本演进过程中有多个RDB版本,兼容性可能有⻛ 险。