Redis中持久化技术分为两种,一种是RDB,一种是AOF.
这两者有什么区别呢?
RDB(Redis DataBase)是 Redis 默认的持久化方案。在指定的时间间隔内,执行指定次数的写操作,则会将内存中的数据写入到磁盘中。即在指定目录下生成一个dump.rdb文件。Redis重启会通过加载dump.rdb文件来恢复数据。
RDB保存的文件是dump.rdb文件 ,位置保存在Redis的启动目录。Redis每次同步数据到磁盘都会生成一个dump.rdb文件,新的dump.rdb会覆盖旧的dump.rdb文件。
RDB:RDB是每隔一段时间自动将内存中的数据集快照写入磁盘中,也就是我们所说的Snapshot快照,他恢复(读取)数据是将快照文件直接读取到内存中.
AOF:AOF是用日志的形式将每一个写操作都记录在日志文件中,只允许进行增量操作,不允许进行修改操作.他恢复(读取)数据来执行过的操作重新执行一遍,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
RDB: Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。 整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能.如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失.
AOF:Redis中的AOF默认是不开启的,我们可以在redis.conf 配置文件中进行编辑,开启AOF功能,当需要对数据进行恢复操作时,将之前持久化保存的AOF文件替换掉redis保存rdb文件的目录下,重新启动的redis进程将AOF文件中记录的写操作重新执行一遍,即可恢复数据.
注: 当AOF和RDB同时开启时,AOF优先级更高,因为AOF恢复数据更加全面.
RBD:间隔一段时间后自动进行保存操作.默认频率是1分钟内改了1万次,或5分钟内改了10次,或15分钟内改了1次.
AOF:每进行一次写操作,就会自动对原先的.aof文件进行增量操作.
细节上的区别
RDB:在redis进行RDB持久化时,有两种操作:save 和 bgsave; 他们的区别就是当进行save操作时,其他线程进入阻塞状态,当持久化结束后,在进行相应,而bgsave是在持久化的同时,redis仍能响应其他请求.
AOF:AOF持久化形成的.aof文件因为是只能进行增量操作,所以文件会越来越大,这个时候我们就需要对文件进行压缩处理.而redis自动为我们提供这项服务,就是Rewrite压缩.默认是当新的.aof文件大小是原来.aof文件大小的两倍,且文件大小>64M时触发.
RDB在恢复较大的数据集的时候效率要高于AOF,因为数据的直接覆盖要比执行命令更快一些.
RDB可能存在数据丢失的情况,当在存储间隔期时,如果redis 宕机的话,这一时间段的数据就会丢失.而AOF会将所有的写操作按照配置文件中的规定进行记录,默认是立刻进行记录,所以数据丢失情况较少.
AOF因为是就操作进行记录,所以很容易被其他人进行破解,从而对数据进行分析.
AOF数据恢复
通过脚本将Redis产生的appendonly.aof文件备份(cp appendonly.aof appendonly_bak.aof),每次启动Redis前,把备份的appendonly.aof文件替换到Redis相应的目录(在redis.conf中配的的dir目录)下,只要开启AOF的功能,Redis每次启动,会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
但在实际开发中,可能因为某些原因导致appendonly.aof 文件格式异常,从而导致数据还原失败,可以通过命令redis-check-aof --fix appendonly.aof 进行修复 。会把出现异常的部分往后所有写操作日志去掉。