当进程意外宕机或者出现故障,可能就会存在数据丢失的情况,这时候,redis的持久化就起到了很大的作用,防止了数据丢失。redis主要提供了两种持久化方案:RDB和AOF两种方式;
RDB是通过生成快照(snapshotting)的形式完成的,它会把符合一定条件的数据自动的从内存中进行快照,并且持久化到硬盘上。
优点
紧凑压缩的二进制文件,代表某个时间的快照恢复数据速度比AOF快的多;RDB可以最大化Redis的性能:父进程在保存RDB文件时唯一要做的就是fork出一个子进程,然后这个子进程就会处理接下来的所有保存工作,父进程无序执行任何磁盘I/O操作。但是,如果数据集比较大的时候,fork可以能比较耗时,造成服务器在一段时间内停止处理客户端的请求;缺点
不是实时/秒级持久化redis版本更新,可能不兼容老的RDB文件使用RDB方式实现持久化,一旦Redis异常退出,就会丢失最后一次快照以后更改的所有数据AOF命令写入的内容直接是文本协议格式;直接采用文本格式,这是因为,文本格式有很好的兼容性,而且开启AOF后,所有的写入命令都是在原有数据上的追加,所以直接采用协议格式,避免了数据的二次处理;
Redis每次更改数据的时候, aof机制都会将命令记录到aof文件,但是实际上由于操作系统的缓存机制,数据并没有实时写入到硬盘,而是进入硬盘缓存。再通过硬盘缓存机制去刷新到保存到文件; 参考值
appendfsync always 每次执行写入都会进行同步 , 这个是最安全但是是效率比较低的方式appendfsync everysec 每一秒执行appendfsync no 不主动进行同步操作,由操作系统去执行,这个是最快但是最不安全的方式因为命令的不断写入,这时候会导致文件的体积不断的增大,为了解决这个问题,Redis引出了AOF重写的机制用来压缩文件的体积; AOF重写是把Redis进程内的数据转化为写命令同步到AOF文件的过程;通过写命令,体积减小有以下几个原因:
超时的文件不会被写入AOF文件;旧的AOF文件中包含无效的命令,重写后将重复的命令进行整合,然后仅保留最终数据的写命令;多条写命令合并成一个;重写的流程
主进程会fork出一个子进程进程AOF重写;但是这个过程不是基于原有aof文件,而是类似快照形式全量遍历内存中的数据,然后逐个序列到aof文件中。在fork子进程的过程中,服务端仍然对外提供服务,这时候如果主进程的数据更新,会缓存到aof_rewirte_buf中,也就是独立开辟一块缓存来存储重写期间收到的命令,当子进程再重写的时候,再把缓存中的数据追加到新的aof文件中;如果rewrite过程中出现故障,不会影响原来的aof文件正常工作,只有到rewirte完成后才会切换文件。所以这个过程还是比较可靠的;优点
数据的完整性和一致性高缺点
因为AOF记录的内容多,文件会越来越大,数据恢复也会越来越慢,由于每次执行增删改操作都要向aof文件写入数据,所以性能也要差于RDB方式的