Redis是内存型数据库,运行期间数据都保存在内存中.因此,一旦断电,redis的数据就将丢失.所以需要定时地将内存中的数据持久化到磁盘中.
Redis支持的持久化方式有两种,一种是RDB快照,一种是AOF命令.
RDBredis中的serverCorn()负责定时生成RDB文件.这个函数的逻辑是
- 当前程序是否含有子进程,如果含有子进程,就减产子进程是否执行完成,若执行完成,则父进程进行收尾工作
- 如果没有子进程,就调用rdbSaveBackground()函数,在后台生成RDB文件
需要注意的是,rdbSaveBackground()函数也是BGSAVE命令的执行函数,他会进行fork系统调用,创建一个子进程 来完成rdb操作.而主进程继续提供服务.
检查父进程中是否存在已经结束的子进程是调用wait3()函数,如果存在,会立刻返回子进程的pid.
由于父进程和子进程有各自独立的地址空间,因此,在子进程完成rdb操作后,父进程要进行收尾工作,修改一些信息.
rdb文件是二进制文件,对于不同类型的数据,redis使用不同的方式保存.
AOFAOF(Append Only File)是指,在redis运行期间,不断将Redis的写命令写到文件中,在Redis重启后,只需要将写命令重新执行一遍,就可以恢复数据.
AOF功能主要分为两个:
- AOF持久化:将写命令写入AOF缓冲区,并定时将缓冲区数据冲刷进文件
- AOF重写:将数据库内容保存一份到文件中,替换原先的AOF文件
AOF持久化分为三个步骤:
- 命令传播:将写命令传播到AOF缓冲区
- 刷新缓冲区:将缓冲区数据写入文件
- 同步磁盘
AOF重写在开启混合持久化后,会先讲数据库内容以rdb快照的形式保存,再将缓冲区的增量命令,以AOF的格式写入文件.
如果关闭了混合持久化,则将所有数据以写入命令的方式写入AOF文件
与RDB文件不同,AOF是文本格式的文件,以RESP(Redis Serialization Protocol)协议格式存储.
主从复制Redis主从复制是Redis分布式机制(Sentinel,Cluster)的基础.
在Redis主从复制中分为两个角色,主节点和从节点.这里指的节点都是Redis服务端.
主节点用来处理用户请求,并将数据复制到从节点.主要作用如下:
- 数据冗余备份,即使主节点数据丢失,从节点依然保留完整的数据
- 读写分离,从节点提供读服务,主节点提供写服务,提高Redis的吞吐量
- 故障恢复,主节点崩溃后,可以手动将从节点切换为主节点,继续提供服务
主从复制主要分为三个阶段:
- 握手
- 同步
- 复制
主从复制是由从节点发起的,从节点将自身信息发送给主节点,随后等待主节点建立连接.
随后进行数据同步阶段,同步分为全量同步和部分同步.
最后是复制阶段,主节点在运行期间会将写命令异步发送给从节点,并不会等待从节点ACK确认.



