Redis RDB VS AOF
一、RDB
RDB持久化指在指定的时间间隔内将内存中的数据集快照写入磁盘。这也是默认的持久化方式,该方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb,恢复的时候将快照文件直接读到内存里。
RDB文件保存过程:
1.redis会单独fork一个子进程进行持久化;
2.父进程继续处理client请求,子进程负责将内存内容写入到临时文件;
3.当子进程将快照写入临时文件完毕后,用临时文件替换原来的快照文件,然后子进程退出。
优点:
1.一旦采用该方式,整个Redis数据库将只包含一个文件,这样非常方便进行备份;
2.RDB可以最大化Redis的性能:父进程在保存RDB文件时唯一要做的就是fork出一个子进程,然后这个子进程就会处理接下来的所有保存工作,父进程无须执行任何磁盘I/O操作;
3.适合大规模的数据恢复;
4.对数据完整性和一致性要求不高。
缺点:
1.一定时间间隔做一次备份,如果服务器意外挂掉,可能会丢失最后一次快照后的所有修改;
2.fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑。
二、AOF
redis以日志的形式记录每个写操作,会将每一个收到的写命令都通过write函数追加到文件中(默认是 appendonly.aof)。
appendfsync always:同步持久化,每次发生数据变更会被立即记录到磁盘中;性能差,但数据完整性好;
appendfsync everysec:异步操作,每秒记录,如果一秒内宕机,有数据丢失;
appendfsync no:从不同步
优点:
1.可设置不同的同步策略,默认策略为每秒钟同步一次,就算机器发生故障,最多只丢失一秒钟的数据;
2.只进行追加操作的日志文件,redis-check-aof工具可以轻易地修复因为某些原因而未写入完整的命令;AOF文件过大时,可进行重写;
3.AOF文件有序地保存了对数据库执行的所有写入操作,文件的内容非常容易被人读懂,对文件进行分析也很轻松;
4.程序会优先使用aof方式来恢复数据集,因为aof方式所保存的数据通常是最完整的。
缺点:
1.对于相同的数据集来说,AOF文件的体积通常要大于RDB文件的体积,恢复速度慢于RDB;
2.根据所使用的同步策略,AOF的速度可能会慢于RDB。