Redis 的持久化
Redis提供了两种不同的持久化方式,分别为 RDB(Redis DataBase) 和 AOF(Append of file)。
RDB存储的是数据,而AOF存储的是指令。
一、RDB方式
1.简介:
在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。(使用快照恢复数据是非常迅速的,快照上保存的就是当前的所有数据)
2.备份是如何执行的
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次已经持久化好了的文件。整个过程中,主进程是不会进行任何 IO 操作的,这就确保了极高的性能,如果需要大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化的数据可能丢失。
3.关于fork
在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,linux中引入了"写时复制技术"(写时复制技术即:只有当子进程需要工作的时候才会从父进程中复制,不需要工作时是不影响父进程的,不会占用内存),只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。
4.RDB保存文件的路径
首先需要在redis.conf中配置文件名称,默认为dump.rdb。
dump.rdb文件的保持路径默认为Redis启动时命令行所在的目录下(如下图所示),但一般都会进行修改为指定的目录下,便于查找。修改也是在redis.conf文件中进行修改。
5.RDB的保存策略
Redis默认提供了三种保存策略,如下图所示(redis.conf文件中)
其中的900,300,60表示时间,单位秒,而1,10,10000表示次数。以save 900 1 为例,意思是在900秒内若数据更新了1次则进行持久化保存操作。save 300 10 表示在300秒内若redis数据库发生了10次变化久进行持久化操作。
6.触发RDB持久化保存的条件
- 满足我们设置保存的一种或多种保存策略(eg:save 900 1),
- 以正常关闭的形式退出redis,例如使用 shutdown 命令。
- 手动使用持久化保存命令:save vs bgsave。(不建议使用此种方式,因为此种方式是绝对阻塞的,即此时整个redis只能用于持久化保存数据,但能进行读写操作)
鉴于以上的的触发条件,所以当redis非正常关闭时且又不满足持久化策略时我们在此段时间做的数据操作将不会被持久化,则有可能就会造成数据丢失。
7.RDB的其他配置
- 当Redis无法写入磁盘的话,直接关掉Redis写的操作。将stop-writes-onbgsave-error 改为 yes
stop-writes-onbgsave-error yes
- 经RDB持久化保存时,将持久化文件进行压缩。rdbcompression 改为 yes。强烈建议要修改此配置文件。
rdbcompression yes
- 在存储快照后,还可以让Redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗。如果希望性能获得最大的提升,建议关闭该功能。
rdbchecksum yes
8.RDB的备份和恢复
备份:首先通过 config get dir 指令查出rdb文件的目录,在将持久化文价拷贝出来放在你想放在的任何地方进行备份,还可以重命名加以区分不同时期的持久化问价。
恢复:首先关闭redis,再将备份的文件拷贝到工作目录下,启动redis,备份数据会直接加载。
9.RDB的优点与缺点
优点:节省磁盘空间(相对于AOF而言);恢复速度块。
缺点:
- 虽然redis在fork时采用的是写时拷贝技术,但数据如果庞大还是比较会消耗性能。
- 当redis非正常关闭时,很有可能会丢失最后一次操作的数据。
二、AOF方式