Redis的持久化机制

RDB和AOF

RDB是一个快照,可以作为副本传到从节点,或者保留作崩溃恢复;是在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程就是有一个fork子进程,先将数据集写入到临时文件中,写入成功后,再替换之前的文件,用二进制压缩存储。

AOF的实时性更好,开启AOF持久化后每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬盘中的AOF文件。

appendfsync always 可以实现将数据丢失减到最少,不过这种方式需要对硬盘进行大量的写入而且每次只写入一个命令,十分影响Redis的速度。

一旦aof缓冲区有数据时,就调用fsync命令强制往aof文件写数据

appendfsync everysec选项 ,每秒同步一次AOF文件,性能几乎没受到任何影响。用户最多只会丢失一秒之内产生的数据。当硬盘忙于执行写入操作的时候,Redis还会放慢自己的速度以便适应硬盘的最大写入速度。fsync操作都异步交给BIO;

一旦aof缓冲区有数据时,就调用write命令往io缓冲区写数据,同时每秒调用一次fsync命令强制将io缓冲区的数据写入到aof文件

appendfsync no 一旦aof缓冲区有数据时,就调用wirte命令往io缓冲区写数据。由操作系统定期或当io缓冲区填满时,自动将io缓冲区的数据写入到aof文件

操作系统自动调度刷磁盘,性能是最好的,但一般不推荐,这种方案会使Redis丢失不定量的数据而且如果用户的硬盘处理写入操作的速度不够的话,那么当缓冲区被等待写入的数据填满时,Redis的写入操作将被阻塞,这会导致Redis的请求速度变慢。

wirte命令只能确定数据成功写入io缓冲区。数据是否成功写入aof文件,是由操作系统定期或当io缓冲区填满时, 自动将io缓冲区的数据写入到aof文件。所以在io缓冲区的数据存在断电数据丢失的风险。 fsync命令具有强制将io缓冲区数据写入到aof文件的机制,可以确定数据是否成功写入aof文件。

不过AOF文件的体积太大。

aof重写

Redis 服务器会维护一个 AOF 重写缓冲区,该缓冲区会在子进程创建新 AOF 文件期间,记录服务器执行的所有写命令。当子进程完成创建新 AOF 文件的工作之后,服务器会将重写缓冲区中的所有内容追加到新 AOF 文件的末尾,使得新旧两个 AOF 文件所保存的数据库状态一致。最后,服务器用新的 AOF 文件替换旧的 AOF 文件,以此来完成 AOF 文件重写操作

你可能感兴趣的:(redis,数据库)