Redis持久化
快照方式
快照方式是采用二进制方式对数据进行编码存储,采用Copy on Write方法进行的,因为Redis是单线程的,在持久化的时候还要同时处理来自客户端套接字的操作,同时快照操作不能注册到Selector线程,不能使用多路复用,所以Redis采用的是多进程的COW方式进行持久化
持久化过程:
1.产生子进程,这个阶段子进程和主进程,使用的还是同一个数据主体,这里的子进程指的就是持久化进程,主进程指的是客户端读写的进程
2.子进程对数据进行快照存储,此时会先copy出数据,这时候子进程和主进程的数据开始分离,这样的好处就是在主进程操作数据的同时不会影响子进程的持久化操作,这时候内存占用量会上升,
但是一般不会超过数据量的2倍
快照方式的缺点就是会丢失在子进程和主进程数据分离时的这段时间主进程产生的数据变更,所以这也是快照这个名称的由来
AOF方式
AOF指的是Redis的操作指令集,是一个从Redis刚开始到备份节点的一个增量指令集合,是以文件的形式存储,在备份恢复的时候采用指令回放的方式进行数据恢复
正因为AOF是所有指令的集合,所以当进行数据恢复的时候效率很低,同时,因为是向AOF里面写数据的形式进行持久化,就涉及到了IO的一些缺点,要先将数据写到内核,再将内核写到AOF文件的缓存区,如果在将文件写到内核后就突然宕机,也会造成数据的丢失
fsync指令
fsync指令可以强制的将数据从内核刷新到AOF文件中,缺点就是如果每执行一个指令就刷新一个效率会非常低,不实时执行的话还是会有丢失风险,等于啥也没做。。
混合持久化
鉴于上面两种方式都有明显的缺点
快照是丢失数据,AOF是效率低,实际业务中我们往往采用混合持久化的模式,对于数据先进行快照存储,然后对于存储过程中的指令进行AOF记录,这样可以显著提高效率