Redis持久化

Redis持久化的意义

作为内存数据库,在机器故障时,会丢失数据,持久化将数据读入磁盘,起到备用的作用。

Redis持久化分为两个部分RDB(Redis DataBase)和AOF(Append Only File)

RDB(Redis DataBase)

Redis在指定的时间间隔内将内存中的数据集Snapshot快照写入磁盘,恢复时将快照文件读入内存。Redis会单独创建一个子进程(也就是Fork)来进行持久化,先将数据写入临时文件dump.rdb,待持久化过程结束,再用这个临时文件替换上次持久化好的文件。整个过程,主进程是不进行任何IO操作的(IO操作的是子进程),确保了Redis的高性能。

RDB的缺点是最后一次持久化的数据可能丢失。

Fork

Fork的作用是复制一个与当前进程一样的进程,用于IO操作写入磁盘。新进程的所有数据(变量、环境变量、程序计数器)数值都和原进程一样,新进程作为原进程的子进程。

触发和恢复RDB快照

触发快照:执行命令sava或basave。

恢复快照:将备份文件dump.rdb移动到Redis安装目录下,启动服务即可。

RDB优缺点

优点:

  • 适合大规模的数据恢复
  • 对数据完整性和一致性要求不高(会丢失最后一次数据)

缺点:

  • 一定时间间隔备份数据,因此有丢失数据的可能性
  • Fork的过程,数据会克隆一份,占用空间较大

RDB小结

与AOF相比,在恢复大的数据集时,RDB更快,但是数据丢失可能性大,同时fork创建子进程也非常消耗性能。

AOF(Append Only File)

Redis以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来,只允许追加文件,不可以改写文件,在Redis重启后,根据日志文件的内容将写指令从前到后执行一次,以完成数据的恢复。

保存的文件为appendonly.aof文件。

Rewrite

AOF采用文件追加方式,文件会越来越大,为避免这种情况,新增了Rewrite机制,当AOF文件大小超出阈值时,Redis会启动rewrite,将AOF文件的内容压缩,只保留可以恢复数据的最小指令集,可以使用命令bgrewriteaof。

rewrite流程,fork一个子进程,获取当前快照,同时将之后的写命令记录到aof_rewrite_buf中,子进程遍历数据库生成aof临时文件,即将原AOF文件内容压缩,生成新的aof文件,结束后。将aof_rewrite_buf中的数据追加到新aof文件中。

AOF优缺点

优点:

  • 同步持久化,每次发生数据变更,会立马同步到磁盘,性能较差但数据完整性好
  • 异步持久化,每秒记录,会有数据丢失

缺点:

  • 相同数据集,aof文件要大于rdb文件,同时恢复速度慢于rdb
  • 运行效率慢于RDB

AOP小结

AOF文件是一个只进行追加的日志文件。AOF文件有序地保存了对数据库的所有写入操作。对于相同的数据集,AOF文件要大于RDB文件,效率没有RDB好。但数据完整性会好于RDB。

原文地址:https://www.cnblogs.com/chenshaowei/p/12552438.html