RDB全称(Redis Database Backup file)(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,redis从dump.rdb文件读取,恢复数据。这有两种方式执行RDB机制:
1.save
2.bgsave(自动save)
如果在900s内至少有1个key被修改,那么就执行RDB机制。
bgsave时主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并写入RDB文件。下图为RDB的底线原理。主进程不能直接操作物理内存,而是操作虚拟内存,而虚拟内存通过页表间接操作物理内存,从而实现对物理内存的读写。
在执行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都比较耗时。
为了解决上述问题,引入了另外一种方式aof(append only file)(追加文件)。Redis处理的每一个写命令都会记录在AOF文件,可以看作是命令日志文件。
AOF记录的是所有的写操作,如果说一个操作写很多次也会记录下来,因此aof文件的大小一定比rdb大。我们可以通过执行bgrewriteaof命令,让aof文件执行重写aof文件。阈值也可以在redis.conf中配置
总结一下RDB和AOF的优缺点: