Redis 提供了2个不同形式的持久化方式
-
RDB(Redis DataBase)
-
AOF(Append Of File)
1.RDB 持久化:
原理是将Redis在内存中的记录定时dump到磁盘的持久化。
RDB 持久化是指在指定的时间间隔内将内存中的数据集快照写入到磁盘。也是 redis 的默认持久化方式。这种方式就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为:dump.rdb。
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件覆盖上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的。
优势:
1.RDB文件紧凑,全量备份,非常适合用于进行备份和灾难恢复,适合大规模的数据恢复。
2.性能最大化,生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有持久化保存工作,主进程不需要进行任何磁盘IO操作。
- RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
- 对数据完整性和一致性要求不高更适合使用。
- 节省磁盘空间。
劣势:
1.RDB快照是一次全量备份,无法做到实时持久化,存储的是内存数据的二进制序列化形式,存储上非常紧凑。
2.如果数据庞大时会比较消耗性能。
3.数据丢失风险大,需要在备份周期和一定间隔时间内做一次备份,当进行快照持久化时,会开启一个子进程专门负责快照持久化,子进程会拥有父进程的内存数据,父进程修改内存子进程不会反应出来,所以在快照持久化期间修改的数据不会被保存,可能丢失数据。
2.AOF 持久化:
原理是将Redis的操作日志以追加的方式写入文件。
全量备份总是耗时的,有时候我们提供一种更加高效的方式AOF,工作机制是redis以日志的形式来记录每个写操作(增量保存),会将每一个收到的写命令都通过write函数追加到文件中,只许追加文件但不可以改写文件。通俗的理解就是日志记录。
AOF日志是持续增量的备份,是基于写命令存储的可读的文本文件。
redis 重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
AOF默认是关闭的,开启RDB,我们可以通过redis.conf配置文件进行开启。
三种同步频率机制:
appendfsync always:始终同步,每次Redis的写入都会立刻记入日志;性能较差但数据完整性比较好。
appendfsync everysec:每秒同步,每秒记入日志一次,如果宕机,本秒的数据可能丢失。
appendfsync everysec:redis不主动进行同步,把同步时机交给操作系统。
AOF重写机制:
AOF采用文件追加方式,文件会越来越大,为避免出现此种情况, 当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩, 只保留可以恢复数据的最小指令集.可以使用命令bgrewriteaof。
持久化流程:
1.客户端的请求写命令会被append追加到AOF缓冲区内;
2.AOF缓冲区根据AOF持久化策略(always,everysec,no)将操作sync同步到磁盘的AOF文件中;
3.AOF文件大小超过重写策略或手动重写时,会对 AOF文件rewrite重写,压缩AOF文件容量;
3.Redis 服务重启时,会重新load 加载 AOF文件中的写操作达到数据恢复的目的。
优势:
1.AOF可以更好的保护数据不丢失,丢失数据概率更低一般AOF会每隔1秒,通过一个后台线程执行一次fsync操作,最多丢失1秒钟的数据。
2.AOF日志文件没有任何磁盘寻址的开销,写入性能非常高,文件不容易破损。
3.AOF日志文件即使过大的时候,出现后台重写操作,也不会影响客户端的读写。
4.AOF日志文件的命令通过非常可读的方式进行记录,这个特性非常适合做灾难性的误删除的紧急恢复。
缺点:
1.对于同一份数据来说,AOF日志文件通常比RDB数据快照文件更大。需要不断AOF重写,进行瘦身,即使经过AOF重写瘦身,由于文件是文本文件,文件体积还是较大(相比于RDB的二进制文件)。
2.恢复备份速度显然比RDB要慢慢。
3.以前AOF发生过bug,就是通过AOF记录的日志,进行数据恢复的时候,没有恢复一模一样的数据出来。
4.每次读写都同步的话,有一定的性能压力。
3.面试题-RDB和AOF的持久化总结:
1.RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储。
2.AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾.
3.Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大
4.只做缓存:如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式.
5.同时开启两种持久化方式;在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据, 因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整;RDB的数据不实时,同时使用两者时服务器重启也只会找AOF文件。
6.不要只使用AOF,因为RDB更适合用于备份数据库(AOF在不断变化不好备份), 快速重启,而且不会有AOF可能潜在的bug,留着作为一个万一的手段。