一、Redis持久化之RDB(Redis DataBase)
1.1 概念
RDB指在指定的时间间隔将内存中的数据集快照写入磁盘,恢复时是将快照文件直接读取到内存里
1.2 备份如何执行
Redis会单独创建(fork)一个子进程来进行持久化,先将数据写入到一个临时文件中,等持久化进程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程不进行任何IO操作,如果需要进行大规模的数据恢复,且对于数据恢复的完整性不是非常敏感,那么RDB方式要比AOF方式更加高效。RDB的缺点是最后一次持久化后的数据可能丢失。
1.3 Fork
Fork的作用是复制一个与当前进程一样的进程。 新进程的所有数据(变量、环境变量、程序计数器等)数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程。
在Linux程序中, fork()会产生一个 和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑, Linux中引入了"写时复制技术"
一般情况父进程和子进程会共用同一段物理内存,只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。
1.4 dump.rdb文件
可以在redis.conf中配置文件名称,默认为dump.rdb,通过vi打开配置文件,输入/dbfilename可以搜索到这条配置信息
下方的dir表示文件生成在哪个目录,./表示生成在启动目录下
stop-writes-on-bgsave-error表示当Redis无法写入磁盘时,比如硬盘已经满了等情况,直接关闭Redis的写操作,推荐使用yes
rdbcompression表示设置对存储到磁盘中的快照是否压缩存储,如果yes则使用LZF算法进行压缩
rdbchecksum表示进行完整性检查,在存储快照后,redis使用CRC64算法来进行数据校验,但是会增加大约10%的性能消耗
save是用来在指定的时间间隔内将内存中的数据集快照写入磁盘,格式为 save 秒 写操作次数
默认有三种,第一种是15分钟内做了一次修改操作,第二种是在五分钟内做了五次修改操作,第三种是一分钟内做了一万次修改操作。
如设置save 20 3,则表示在20秒内做了3次修改操作会自动将数据集快照写入磁盘
注释save指令或给save传入空字符串都可以禁用
1.5 RDB优势
(1)适合大规模的数据恢复
(2)对数据完整性和一致性要求不高更适合使用
(3)节省磁盘空间
(4)恢复速度快
1.6 劣势
(1)Fork会克隆一份内存中的数据,体积会膨胀2倍
(2)虽然Redis在fork时使用了写时拷贝技术,但是如果数据庞大会十分消耗性能
(3)如果redis意外down掉,会丢失最后一次快照后的所有修改:因为save操作是在一定时间间隔内做多少次操作才会触发,如果在时间段内的操作还没有达到设定的次数就崩溃了,会导致本次的所有操作没有进行持久化操作,修改就会丢失