2022-01-01
把当前进程数据生成快照(.rdb)文件保存到磁盘的过程
两种触发方式:手动触发(save命令),自动触发(bgsave命令,推荐)
save命令:阻塞当前redis直到rdb持久化完成。若内存实例较大,会造成长时间阻塞,线上环境不建议使用。
bgsave命令:redis进程执行fork命令创建子进程来完成持久化,阻塞时间短(微秒级),save命令的优化。
bgsave触发的条件:
1在redis-cli中执行shutdown关闭redis服务时,如果没有开启aof持久化,自动执行bgsave命令
2redis.conf中save m n 若redis在m秒内有n次命令执行则触发
3从节点刚上线时,触发主节点bgsave命令,然后将生成的rdb文件发送给从节点完成全量复制
bgave执行的前提:没有其他子进程正在执行,包含aof重写命令和bgsave命令
进程是操作系统里面资源分配的最小单位。所以进程之间的内存是隔离的,虽然实际可能是同一部分。
操作系统中,内存区域是分页的,一页大概4KB。
fork是linux系统的调用:在当前进程中,fork一个子进程,子进程最初与主进程是共享一份内存区域的。由于主进程不断进行数据的写操作,与子进程存在并发冲突问题。此时,redis采用写时复制技术(cow):
当主进程写操作时,首先会复制一份将要涉及写操作的内存页。然后主进程在新复制的内存页上进行写操作,原有内存页继续供子进程持久化。
rdb持久化
命令:config set dir /usr/local 设置rdb文件保存路径
备份:bgsave 将dump.rdb保存到/usr/local下
恢复:将dump.rdb放到redis安装目录与redis.conf同级目录,重启redis即可
优点:1压缩后的二进制文件,适于备份,全量赋值,用于灾难恢复,2加载rdb恢复数据远快于aof
缺点:1无法做到实时持久化,每次都要创建子进程,频繁操作成本过高,2保存后的二进制文件,存在老版本不兼容新版本rdb文件的问题
关闭rdb:注释掉redis.conf中所有save m n,并添加save ""保存即可。