前言
Redis 的数据全部在内存里,如果突然宕机,数据就会全部丢失,因此必须有一种机制来保证 Redis 的数据不会因为故障而丢失,这种机制就是 Redis 的持久化机制。Redis 的持久化机制有两种,第一种是RDB快照,第二种是 AOF 日志。
1、RDB(redis database)
RDB就是以快照形式直接把内存中的数据保存到一个经过压缩的二进制文件。当Redis需要做持久化时,Redis会fork一个子进程,子进程将数据写到磁盘上一个临时RDB文件中。当子进程完成写临时文件后,将原来的RDB替换掉,这样的好处是可以copy-on-write。
优点:这种文件非常适合用于备份:比如,你可以在最近的24小时内,每小时备份一次,并且在每个月的每一天也备份一个RDB文件。这样的话,即使遇上问题,也可以随时将数据集还原到不同的版本。RDB非常适合灾难恢复。
缺点:RDB无法做到实时持久化,若在两次备份间宕机,则会丢失区间的增量数据,不适用于实时性要求较高的场景。
2、AOF(append only file)
AOF就是把所有的对Redis的服务器进行修改的命令都存到一个文件里。当Redis重启的时候,它会优先使用AOF文件来还原数据集,因为AOF文件保存的数据集通常比RDB文件所保存的数据集更完整。
可以通过配置appendfsync选项的值来决定AOF的效率和安全。当appendfsync为no时服务器在每个事件循环都要将 aof_butt缓冲区中的所有内容写入到AOF文件,至于何时对AOF文件进行同步,则由操作系统控制。当appendfsync为always时每次有数据修改发生时都会写入AOF文件。当appendfsync 为everysec时服务器在每个事件循环都要将 aof_butt缓冲区中的所有内容写入到AOF文件,并且每隔一秒就要在子线程中对AOF文件进行一次同步。
优点: AOF只是追加写日志文件,对服务器性能影响较小,速度比RDB要快,消耗的内存较少。
缺点: AOF方式生成的日志文件太大,需要不断AOF重写,进行瘦身。 即使经过AOF重写瘦身,由于文件是文本文件,文件体积较大(相比于RDB的二进制文件)。 AOF重演命令式的恢复数据,速度比RDB要慢。