Redis 支持两种持久化方式:RDB(Redis Database)和 AOF(Append Only File)。

  1. RDB 持久化:RDB 持久化是一种快照(Snapshot)持久化方式,它可以将 Redis 在某个时间点上的内存数据保存到硬盘上。Redis 会周期性地执行 RDB 操作,将当前的数据集写入磁盘上的 RDB 文件。RDB 持久化适用于大规模数据恢复,比如 Redis 重启、数据备份、迁移等场景。
  2. AOF 持久化:AOF 持久化是一种基于日志(Log)的持久化方式,它可以将 Redis 的操作以日志的形式保存到磁盘上。Redis 会将每个写命令追加到 AOF 文件末尾,这样就可以保证 AOF 文件中的操作顺序和 Redis 实际执行的顺序一致。AOF 持久化适用于对数据实时性要求比较高的场景,比如金融系统、社交网络、游戏等。

在使用 Redis 时,我们可以根据实际需求选择不同的持久化方式。如果对数据的实时性要求不高,可以选择 RDB 持久化;如果需要保证数据的完整性和可恢复性,可以选择 AOF 持久化。另外,Redis 还支持 RDB 和 AOF 混合持久化的方式,可以兼顾两种持久化方式的优点。

具体的:

RDB

通过操作系统的多进程写时复制(COW)实现快照持久化: 1)持久化时调用fork()产生一个子进程,快照持久化交给子进程处理(子进程刚产生时,和父进程共享内存中的代码段和数据段,在进程分离的一瞬间,内存几乎无增长); 2)子进程做持久化不会修改内存中数据,但父进程会修改,这会导致数据段页面分离(当父进程修改某页数据时,该页面会被复制一份分离出来;子进程页面没有变化);同时由于冷数据占比高,所以被分离出来的页面很少。

AOF

先执行指令再写日志 1)由于AOF文件会比较大,为了避免写入无效指令(错误指令),必须先做指令检查 (如何检查,只能先执行了。因为语法级别检查并不能保证指令的有效性,比如删除一 个不存在的key。而MySQL这种是因为它本身就维护了所有的表的信息,所以可以语法 检查后过滤掉大部分无效指令直接记录日志,然后再执行。) 2)Redis本身定位内存数据库,速度是第一要素。AOF是个IO操作,会拖性能后腿。 Redis允许自定义AOF同步频率策略:Always(最安全,也存在丢失数据的情况,一个 事件循环的频率同步一次)、Everysec(常用,每秒同步一次)、No(最不安全,让操 作系统决定刷盘频率) 来满足不同的数据安全需求。