Redis的持久化

1. 持久化解释

Redis是一个内存数据库,所以运行效率非常高。但是,数据只存在内容中,Redis宕机或者关机,内存中的数据就会丢失。对此,Redis提供了两种持久化策略,一种是RDB持久化,另外一种是AOF持久化。
而Redis到持久化文件是一种钝化(可以由手动触发,定时触发,条件触发),而持久化文件到Redis是一种激活,由Redis启动时自动完成。

2. RDB持久化

RDB是一种内存快照的持久化,它是将内存中某一时刻的数据快照全量写入指定的RDB二进制文件的持久化技术。RDB持久化是默认开启的。当Redis启动时,会自动读取RDB快照文件,将数据载入内存,恢复到开机之前的状态。
RDB持久化有三种方式:

  • 手动save命令:使用这个命令会阻塞redis-server进程,直到持久化完成(不对外提供服务)
  • 手动bgsave命令:这个命令会fork出一个子进程负责保存,不会阻塞redis-server(可以对外提供服务)
  • 自动条件触发

RDB文件在Redis种只有一个dump.rdb文件,它在整体上由5部分组成:

  • SOF:这个是一个常量,一个字符串REDIS,仅仅包含这五个字符,长度为5,用于标识Redis的RDB为文件的开始。
  • RDB_Version:这是一个整数,长度为4字节,表示RDB的版本号
  • EOF:这是一个常量,占1个字节,用于标识RDB数据的结束,校验和的开始
  • check_sum:判断RDB文件的内容是否出现数据异常,采用的是CRC校验算法
  • databases:这个表示的是任意多个空的数据库,而每个database又由三部分构成:
    • SODB:是一个常量,占一个字节,用于标识数据库的开始
    • db_number:数据库编号
    • key_value_pairs:当前数据库种的键值对数据

RDB持久化过程:
注意在fork出的子进程之时,会通过内核的写时复制技术将新的请求放到另一个内存区域,最后将这个区域的副本copy到RDB文件中。

优点:

  1. Redis中只有一个dump.rdb文件,方便管理和持久化
  2. 容灾性好,方便备份
  3. 性能最大化,不占用主进程,fork一个子进程进行数据持久化
  4. 相比于AOF,RDB文件启动效率更高

缺点:

  1. 数据不安全,如果进行RDB持久化时,Redis宕机了,数据就会丢失
  2. 由于会fork一个子进程,所以数据集很大时,会导致整个服务器停止几百毫秒到1秒

3. AOF持久化

AOF是一种以日志形式的的持久化技术,当需要恢复内存数据时,会将写操作重新执行一次,以便恢复到内存数据状态。
注意,AOF是默认不开启的,需要通过配置文件手动开启。
AOF文件包含三类文件:基本文件,增量文件,清单文件。基本文件一般是以rdb格式,增量文件扩展名为aof,采用AOF格式,AOF格式其实是Redis的通讯协议格式,将命令以纯文本的方式写入到文件中。
同时AOF还提供了一个Rewrite机制,为防止AOF文件太大而占用大量的磁盘空间,对AOF文件进行压缩。(就是对AOF文件进行再计算进行压缩)

优点:

  1. 数据安全,在AOF中提供了三种同步机制,分别是每秒同步,每操作同步,不同步
  2. 只通过append进行文件追加,所以在Redis宕机时,只会丢失一个操作,不破坏原有操作,同时还可以通过Redis-Check-Aof工具进行数据的恢复,保证了数据的一致性
  3. aof有rewrite机制,可以定期对Aof进行重写,能对AOF文件进行压缩

缺点:

  1. AOF文件比RDB文件大,启动效率没有RDB文件快,运行效率和恢复效率也是

所以,AOF文件比RDB文件更新频率高,优先使用AOF,但是redis默认不开启AOF,只使用RDB,AOF需要手动开启