深入详解Redis持久化操作

目录
两种持久化
RDB
简介
持久化策略
手动触发命令
自动触发
执行流程
Fork操作
图示执行流程
RDB配置
AOF
简介
AOF开启
持久化策略
持久化流程
文件损坏修复
文件重写压缩
重写原理
重写流程
图示执行流程
AOF配置
两者相比


官方推荐
启用推荐
储存方式
只做缓存
同时开启两种持久化方式
那要不要只使用AOF呢?
性能建议
两种持久化
Redis的数据都是储存在内存中,如果遇到进程关闭,服务器宕机等意外操作,就需要持久化操作把我们的数据持久化存储成文件到磁盘,当服务器恢复我们重启Redis时,就可以通过这些文件进行数据恢复 。
在Redis中提供两种持久化方式:
1.RDB(Redis )(默认):将数据以快照的方式存储到磁盘,生成的文件名默认为dump.rdb
2.AOF( Of File):以日志形式把每次操作数据的命令记录下来储存到磁盘,生成为文件名默认为.aof
RDB 简介
将数据以快照的方式存储到磁盘,生成的文件名默认为dump.rdb,恢复时将dump.rdb文件读到内存中 。
RDB可以通过命令手动触发,也可以自动触发 。
持久化策略 手动触发命令
save:该命令会开始持久化操作,但是save会使Redis服务阻塞,直到持久化完成 。当数据量较大,会造成长时间阻塞,不建议使用

深入详解Redis持久化操作

文章插图
:该命令会执行fork创建一条子进程,由子进程进行持久化操作,Redis服务一般只会在创建子进程时阻塞,后续持久化操作由子进程完成,Redis服务不会阻塞 。
自动触发
在配置文件中可以看到以下配置,如果被注释掉需要取消注释
save 3600 1save 300 100save 60 10000
它表示在3600/300/60秒内数据被修改过1/100/10000次时,自动触发操作 。我们可以通过修改或添加来改变机制 。
执行流程
1.执行时,Redis进程会先检查当前进程下是否存在正在执行其他子进程,如果存在就是直接结束本次持久化 。
2.通过fork操作创建子线程,创建期间Redis进程阻塞 。
3.创建完毕,Redis进程恢复,可以继续处理其他命令 。
4.创建的子进程先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件 。
5.持久化完成,子进程通知Redis
整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能 。
如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效 。RDB的缺点是最后一次持久化后的数据可能丢失(有新的数据写入但并没有触发时发生服务器意外),导致数据完整性不高 。
这里为什么要用临时文件?因为如果直接写入文件的话如果写入的过程出现服务器宕机等操作,可能会出现数据大规模丢失情况 。
Fork操作
Fork的作用是复制一个与当前进程一样的进程 。新进程的所有数据(变量、环境变量、程序计数器等) 数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程 。Fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑 。
在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,Linux中引入了“写时复制技术” 。
一般情况父进程和子进程会共用同一段物理内存,只有进程空间的各段的内容要发生变化时,才会将父进程的改变的内容页复制一份给子进程 。