Redis提供两种持久化机制,一种RDB持久化(默认)
另一种是AOF(append only file)持久化。
RDB是什么?
原理是redis会单独创建(fork)一个与当前进程一模一样的子进程来进行持久化,这个子进程的所有数据(变量,环境变量,程序计数器等)都和原进程一模一样,会先将数据写入到一个临时文件中,待持久化结束了,再用这个临时文件替换上次持久化好的文件,整个过程中,主进程不进行任何的io操作,这就确保了极高的性能。
1.1这个持久化文件在哪里?
持久化文件:dump.rdb在redis.conf配置文件中定义的;一般情况下我们会给定一个文件存储。
dir ./ 当前文件夹,所以dump.rdb就会在myredis文件夹下生成;如果在不同的文件下生成dump.rdb ,eg:第一次在myredis文件下生成的dump.rdb下有10万条数据,第二次启动的时候在opt文件夹下启动,opt文件下会生成新的dump.rdb文件,这个时候文件是空的,这种情况下容易造成数据丢失,为了防止数据丢失,在dir 下指定文件eg:dir /myredis(自行指定)
1.2他什么时候fork子进程,或者什么时候触发rdb持久化机制
1.2.1shutdown时,如果没有开启aof,会触发。(正常操作可以,)
1.2.2配置文件中默认的快照配置
900秒中,redis增删改操作是否有1次,只要有一次就触发rdb持久化机制
300秒钟,redis增删改操作是否有10次,只要总和有超过10次就触发rdb持久化机制
60秒钟,redis增删改操作是否有10000次,只要总和超过10000次就触发rdb持久化机制
1.2.3执行命令save(主进程)或者bgsave ,save是只管保存,其他不管,全部阻塞; bgsave:redis会在后台异步进行快照操作,同时可以响应客户端的请求执行flushall命令,但是里面是空的,无意义。
bgsave是专门做持久化的,持久化结束,这个进程也就结束。
2.AOF是什么?默认是关闭的。redis.conf配置文件中修改appendonly yes
拓展:快速定位;vim redis.conf打开文件后,直接 /,之后输入需要搜索到的值,eg:/append; 按回车,光标找到所有的指定的字符 ,按 n 按钮是下一个。
原理是将Redis的操作文件以追加的方式写入文件,读操作是不记录的
2.1这个持久化文件在哪里?
与rdb的持久化文件一样,都在redis.conf中dir ./文件下配置
2.2触发机制(根据配置文件配置项)
no:表示等操作系统进行数据缓存同步到磁盘(快,持久化没保证)
always:同步持久化,每次发生数据变更时,立即记录到磁盘(慢,安全)
everysec:表示每秒同步一次(默认值,很快,但可能会丢失一秒以内的数据)
总结:
1.redis提供了RDB持久化方案,为什么还要AOF?
优化数据丢失问题,rdb会丢失最后一次快照的数据,AOF丢失不会超过2秒的数据。
2.如果AOF和RDB同时存在,听谁的?
AOF
3.RDB和AOF优势劣势?
RDB适合大规模的数据恢复,对数据完整性和一致性不高,在一定间隔时间做一次备份,如果Redis意外down掉的话,就会丢失最后一次快照后的所有操作。
AOF根据配置项而定
官方建议,两种持久化机制同时开启,如果两个同时开启,优先使用AOF持久化机制。