Redis学习笔记:持久化 RDB与AOF
前言
Redis是内存数据库,如果不将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出,数据库状态也会消失,所以Redis提供了持久化的功能。
注意:如果同时开启了RDB和AOF,那么Redis会优先使用AOF来载入。
RDB(Redis DataBase):默认的持久化方式
RDB的持久化文件:dump.rdb
在flushdb, flushall, save,退出Redis时产生dump.rdb)
在指定的时间间隔内将内存中的数据快照写入磁盘,恢复时将快照文件读入到内存中。
在redis启动时会检查有无dump.rdb,恢复其中的数据。
过程:
Redis会创建一个(fork)子进程来进行持久化,先将数据写入到一个临时文件中,等持久化的进程都结束了,再用这个临时文件替换上次持久化好的文件。而这整个过程中,主进程是不进行任何IO操作的,这保证了极高的性能。
优点:
如果需要进行大规模数据的恢复,且对恢复的完整性不是很敏感,那么RDB方式比AOF方式更加的高效。
缺点:
RDB的缺点是最后一次持久化后的数据可能丢失。(宕机)
fork进程会占用一定的内存空间
AOF(Append Only File):默认是不开启的
如果需要开启,在文件redis.conf中进行配置,添加语句: appendonly yes
AOF的持久化文件:appendonly.aof
以日志的形式来记录每个写操作,只记录写操作,不记录读操作。
只许追加文件不许改写文件。
Redis启动之初会读取该文件。从前到后执行写指令,进行重构数据。
如果appendonly.aof文件被恶意破坏,那么下次重启Redis时会启动失败(连接被拒绝),这是因为appendonly.aof文件无法正常运行。此时我们可以使用redis-check-aof来恢复aof文件-》使用下面的命令:
redis-check-aof --fix appendly-aof
但是!被破坏的命令会被删除!即解决有问题的人。
Redis会记录每次aof文件的大小,如果文件大小大于64MB,就会fork一个新进程将aof文件进行重写。
优点:
每一次修改都会同步到aof文件中,文件的完整性会更好。
缺点:
每秒同步一次,可能会丢失一秒的数据。
对于持久化文件来说,aof的大小远远大于rdb,修复数据也比rdb慢。