Redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File)。
简单介绍
RDB:就是在不同的时间点,将目前的数据生成快照然后存储到磁盘上。
AOF:将Redis执行过的所有写指令记录下来存放到磁盘中,在下次redis重新启动时, 把这些写指令从前到后再重新执行一遍,就可以实现数据恢复了。
RDB和AOF这两种方式是可以同时使用的,在这种情况下,Redis重启后,会优先使用AOF方式来进行数据的恢复,因为AOF方式恢复的数据完整性要比RDB高。
RDB
Redis在进行数据持久化的过程中,会单独创建一个fork子进程来进行工作(主进程不会进行任何io操作,保证了Redis的高性能),先将数据写入到一个临时文件中,等到持久化过程结束了,才会用这个临时文件替换上次持久化好的文件。通过这种方式,可以保证快照文件总是完整的。
如何使用: 执行SAVE或者BGSAVE指令即可
RDB模式存储的是Redis某一时刻的数据状态,所以对于数据完整性方面存在缺陷。例如每5分钟进行一次RDB,当发生故障进行恢复时,会丢掉将近5分钟的数据。
如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。
AOF
AOF记录的是对Redis的写指令。
如何打开: 通过配置redis.conf中的appendonly yes就可以打开AOF功能。
默认的AOF持久化策略是每秒钟fsync一次(fsync是指把缓存中的写指令记录到磁盘中),这样,当发生故障时,仅仅只会丢失1秒钟的数据。
AOF模式采取的是追加的方式,所以如果不对文件进行处理的话,会导致文件越来越大,所以Redis提供了AOF文件重写的机制。当AOF文件超过设定的阈值后,就会对其进行一次重写,文件会得到很大的压缩,例如执行了100次INCR指令(将数值加一),重写之后只记录一条SET指令就可以了。
重写过程:
Redis创建一个fork子进程来读取现有的AOF文件对其进行分析压缩并写入到一个临时文件
同时,Redis会把新的写指令累积到内存缓冲区中并且写入到原有的AOF文件中
当fork子进程完成重写工作之后会发给父进程一个信号
父进程将内存缓冲区中的写指令追加到临时文件中
追加结束后,用新的AOF文件替换旧的AOF文件
AOF的一个优点:如果不小心错误的执行了一条指令,在AOF文件重写之前,可以通过暂停Redis然后对AOF文件进行编辑,删除掉错误执行的指令,再重启Redis就可以恢复到之前的状态了。
缺点:AOF文件要比RDB文件占用的空间大,并且AOF方式的恢复速度也要慢于RDB方式。
如何选择
如何选择RDB和AOF,官方的建议是两个同时使用。这样可以提供更可靠的持久化方案。