Redis持久化
Redis持久化
在redis中,提供了两种数据持久化的方式:1.RDB 2.AOF
RDB
RDB全称Redis Databases Backup file 即 Redis 数据备份文件,也叫Redis数据快照。
就是把内存中的所有数据都记录到磁盘中,当Redis故障重启后,从磁盘中读取快照文件,恢复数据。
备份
主动备份
建议使用bgsave子进程进行备份
被动备份
redis内有出发RDB的机制,可以在redis.conf中找到
# 900秒内,如果至少有1个key被修改,则执行bgsave
save 900 1
RDB执行原理
bgsave开始的时候会fork主进程到子进程(fork的是页表,后续会提到),子进程共享主进程的内存数据。完成fork后读取内存数据写入到RDB文件。
写入RDB文件是交给子进程的,它是异步的,对主进程几乎是没有阻塞的,但是,在开启新进程的时候会产生阻塞,阻塞是纳秒级的,所以几乎可以忽略不记。
在Linux,所有的进程都无法直接操作物理内存,因此操作系统会为每个进程分配虚拟内存,这儿的主进程当然也只能操作虚拟内存。
操作系统会维护一个物理内存和虚拟内存的映射关系表,也就是页表,记录物理地址和虚拟地址的映射关系。
copy-on-write技术
子进程在写RDB文件的过程(读内存,写磁盘)中,主进程同时修改数据(写内存),出现脏数据怎么办?
fork底层采用的是copy-on-write技术
当主进程执行读操作的时候,访问的是共享内存;
当主进程执行写操作的时候,会拷贝一份数据,执行写操作。
我们在fork的时候,会把共享的内存数据标记为read-only,它是一个只读模式,任何一个进程都只能读不能写
如果这时候主进程有写请求怎么办?
会先把内存中的数据复制一份出来(复制完成后主进程如果有读操作也会到复制的数据里面去读,页表映射关系也会映射到新的数据),让主进程执行写操作。这样就避免了脏数据出现。
AOF
AOF全称Appedn Only File 即 追加文件 。Redis每写一个命令都会记录在 AOF文件中,可以当作是命令日志文件。
AOF默认是关闭的,需要redis.conf 配置才能开启。
# 是否开启AOF功能,默认是no
appendonly yes
# AOF文件的名称
appendfilename "appendonly.aof"
# 表示每执行一次写命令,立即记录到AOF文件
appendfsync always
# 写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案
appendfsync everysec
# 写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
appendfsync no
由于是记录命令,因此AOF文件要比RDB文件大得多。而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。所以可以通过bgrewriteof命令进行重写。
可以通过配置触发阈值让redis自动重写