目录
一:Redis持久化方式有哪些
Redis有两种持久化方案:RDB持久化和AOF持久化。
1.RDB持久化
RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。
2.AOF持久化
AOF全称为Append Only File(追加文件)。Redis处理的每一个写命令都会记录在AOF文件,可以看做是命令日志文件。
二:RDB和AOF的区别
RDB和AOF各有自己的优缺点,如果对数据安全性要求较高,在实际开发中往往会结合使用。
区别:
1.RDB使用快照存储,AOF使用操作日志存储
2.RDB存储速度慢,AOF存储速度快
3.RDB恢复速度快,AOF恢复速度慢
4.RDB数据文件小,AOF数据文件大
5.RDB安全性低于AOF
bgsave:后台创建一个新的进程来做存储
aof重写:优化日志存储文件
三:RDB和AOF的优缺点
RDB优点
(1)RDB文件是紧凑的二进制文件,比较适合做冷备,全量复制的场景。
RDB会生成多个文件,每个文件都代表了某一时刻的Redis完整的数据快照。可以控制Redis生成快照的时间,比较方便。在最坏的情况提供数据恢复时,RDB要比AOF快。
(2)相对于AOF持久化机制来说,直接基于RDB数据文件来重启和恢复Redis进程,更加快速。
因为RDB文件本身就是一个数据文件,恢复时直接加载到内存即可,而AOF还需要一条条执行命令。Redis只需要fork一个子进程,让子进程执行磁盘的IO操作进行RDB持久化即可。
(3)RDB对Redis对外提供的读写服务,影响非常小,可以让Redis保持高性能。因为Redis主进程只需要fork一个子进程,让子进程执行磁盘IO操作进行持久化即可。
(4)RDB使用单独子进程进行持久化,主进程不进行任何IO操作,保证了Redis的高性能。
RDB缺点
(1)若遇到Redis故障时,RDB比AOF丢失数据多。
一般来说,RDB快照都是每隔5分钟或更长时间执行一次,这个时候就可能遇到最长5分钟的数据丢失。
(2)RDB每次fork子进程来执行RDB快照数据文件生成时,如果数据文件过大,可能会对客户端造成提供的服务暂停数毫秒甚至数秒。
(3)RDB无法实现实时持久化。
RDB是间隔一段时间进行一次持久化,如果持久化之间Redis发生故障,会发生数据丢失。
AOF优点
(1)AOF持久化可以更好的避免数据丢失。
一般AOF每隔一秒,通过后台线程执行一次fsync操作,最多丢失一秒的数据。
(2)AOF日志文件以append-only模式写入,写入性能比较高。
(3)AOF日志文件过大,出现后台重写操作,也不会影响客户端的读写。
(4)适合做灾难性的误删除紧急恢复。
AOF日志文件的命令通过非常可读的方式进行记录,这个特性非常适合做灾难性的误删除的紧急恢复。比如某人用flushall命令清空了所有数据,只要这个时候后台rewrite还没有发生,name就可以立即拷贝AOF文件,将最后一条flushall命令删除,然后再将该AOF文件放回去,就可以通过恢复机制,自动恢复所有数据。
AOF缺点
(1)对于同一份文件来说,AOF日志文件通常比RDB数据快照文件更大,恢复速度慢。
(2)AOF开启后,支持的写QPS会比RDB支持的写QPS低,因为AOF一般会配置成每秒fsync一次日志文件。当然,每秒一次fsync,性能也还是很高的。
(3)以前AOF发生过bug,就是通过AOF记录的日志,进行数据恢复的时候,没有恢复一模一样的数据出来。
所以说,类似AOF这种较为复杂的基于命令日志/merge/回放的方式,比基于RDB每次持久化一份完整的数据快照文件的方式,更加脆弱一些,容易有bug。不过AOF就是为了避免rewrite过程导致的bug,因此每次rewrite并不是基于旧的指令日志进行merge的,而是基于当时内存中的数据进行指令的重新构建,这样健壮性会好很多。
四:RDB和AOF到底该如何选择
1、不要仅仅使用RDB,因为那样会导致你丢失很多数据;
2、也不要仅仅使用AOF,因为那样有两个问题:
你通过AOF做冷备,没有RDB做冷备,恢复速度更快;
第二,RDB每次简单粗暴生成数据快照,更加健壮,可以避免AOF这种复杂的备份和恢复机制的bug;
3、综合使用AOF和RDB两种持久化机制,用AOF来保证数据不丢失,作为数据恢复的第一选择;
用RDB来做不同程度的冷备,在AOF文件都丢失或损坏不可用的时候,还可以使用RDB来进行快速的数据恢复;