Redis的持久化方式

1.RDB

RDB全称(Redis Database Backup file)(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,redis从dump.rdb文件读取,恢复数据。这有两种方式执行RDB机制:

1.save

2.bgsave(自动save)

Redis的持久化方式_第1张图片

如果在900s内至少有1个key被修改,那么就执行RDB机制。

bgsave时主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并写入RDB文件。下图为RDB的底线原理。Redis的持久化方式_第2张图片主进程不能直接操作物理内存,而是操作虚拟内存,而虚拟内存通过页表间接操作物理内存,从而实现对物理内存的读写。

在执行bgsave时,主进程fork子进程,将页表复制过去,由于子进程共享父进程的页表,因此,子进程也能通过页表访问物理内存,从而写入新的RDB文件。

但是这里会出现一种场景:

就是子进程从物理内存读数据,而主进程从物理内存中写数据。因此会出现一些脏数据,针对这种情况:fork采用的是copy on write技术。

当主进程执行读操作时,访问共享内存。

当主进程执行写操作时,则会拷贝一份数据,执行写操作。

RDB在什么时候执行呢?

1.默认是服务停止时。

2.手动save

3.bgsave (save 60 1000) 代表60s内至少执行1000次修改则触发RDB

RDB的缺点?

1.如果每60save一次,如果在60s内执行写操作,一旦宕机,这数据就丢失了。

2.fork子进程、写出RDB都比较耗时。

2.AOF

为了解决上述问题,引入了另外一种方式aof(append only file)(追加文件)。Redis处理的每一个写命令都会记录在AOF文件,可以看作是命令日志文件。

Redis的持久化方式_第3张图片

AOF记录的是所有的写操作,如果说一个操作写很多次也会记录下来,因此aof文件的大小一定比rdb大。我们可以通过执行bgrewriteaof命令,让aof文件执行重写aof文件。阈值也可以在redis.conf中配置

总结一下RDB和AOF的优缺点:

Redis的持久化方式_第4张图片

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