Redis---持久化策略

发布于:2025-08-20 ⋅ 阅读:(22) ⋅ 点赞:(0)

持久化:这个概念是从MySQL的事务中提出的:原子性,一致性,隔离性,持久性。而Redis进行持久化主要是用于服务器重启后恢复内存数据的。

持久化策略

一、RDB策略

全称RedisDataBase,是一种定期备份策略,它将定期将内存中的数据信息备份到一个后缀为rdb的文件中,称为“快照”,一旦服务器重启,将根据快照中的信息进行数据恢复,而且由于RDB文件采用的为二进制文件,相较于AOF的文本文件,Redis在进行加载时,速度是远远大于AOF文件的。


触发方式

分为手动触发和自动触发两种,手动触发也有两种方式,一种是通过save命令,此命令会使得Redis全力进行RDB文件的生成,这样的话,生成快照的速度更快,但是有个很大的弊端是在此期间,Redis无法处理客户端的请求,这往往是无法忍受的,所以很少使用这个命令。另一种是使用bgsave,在该命令下,快照的生成将在后台进行,具体过程就是redis会生成一个子进程,该子进程有当前接受客户端命令的父进程复制而来,拥有父进程的数据,然后该子进程将进行快照的生成,在此之前,子进程会先进行检测是否有一个子进程在进行bgsave命令,如果有,则返回正在进行bgsave命令的子进程。在子进程完成快照生成后,会通过进程间通信通知父进程完成快照生成,父进程在接收到通知后,会进行更新rdb文件(快照),同时销毁子进程。

值得注意的是,如果内存中有很多数据,在进行fork(复制父进程生成子进程)时,会不会有很大的开销?答案是不会,因为fork采用的是“写时复制”机制,也就是如果内存中数据未被修改时,子进程和父进程双方共用一份数据,只有内存数据被修改时,子进程才会进行复制。

第二种触发方式为自动触发,触发规则可以根据需要进行修改,格式为save<seconds><exchanges>,表示当seconds秒中至少发生了exchanges变化时进行rdb文件重写,这个在redis的配置文件中可以找到,其次当正常流程的关闭redis时/进行主从复制时,也会触发rdb文件的重写。

二、AOF策略

全称:Append Only File,为一种实时备份策略,当redis每次接受到命令时,都会将命令写入到AOF文件中(对应RDB的快照)。但是这里存在两个问题,一是每次操作都进行硬盘写入的话,这会大大降低redis读写速度快的优点,其次,当操作很多时,AOF文件的大小也是不容小觑的。

首先针对问题1,redis引入了一个内存缓冲区,这样每次操作都会先写入到内存缓冲区中,当达到预定值后才会写入内存,其次,每次写入都是写到上次的后面,这是属于顺序读写,速度是远远大于随机读写的,一定程度也加快了速度。针对问题2,redis会对aof文件进行“瘦身”,因为很多操作是冗余的,比如写了很多操作来设置一个key-value,但是最后进行了delete,这样完全没有必要记录中间的操作,只需要记录最后该key-value消失了即可,这种瘦身机制称为“重写机制”。

但是对于内存缓冲区,又会引入一个新的问题,当redis因为突发情况断电时,这时内存缓存区的数据就会因为没有写入硬盘而丢失,这样在设置内存缓冲区策略时,就需要平衡性能和可靠性能。

“重写机制”触发策略同RDB策略一样,也是分为手动触发和自动触发策略。首先手动触发使用“bgwriteaof”命令(异步执行命令,和RDB的bgsave类似)。自动触发则是有两种触发策略,1是当aof文件达到指定值时,会进行重写文件,来达到瘦身的目的。2是当前文件大小相较于上次文件大小增长的比例,默认是100%,即当前文件大小是上次重写文件的2倍。

重写的流程

1.创建子进程fork,父进程仍然进行接受命令。

2.子进程对aof文件进行重写,但此时父进程仍会往旧的aof文件中写数据,同时,也会向一个名叫 aof_rewrire_buf 缓冲区中写数据,这个缓存区是专门负责接受在子进程重写文件时错过的命令的。

3.子进程完成aof文件重写后,会通知父进程,此时父进程会将aof_rewrite_buf中的数据添加到重写后的aof文件的末尾,然后替换旧aof文件。

父进程为什么往旧的aof文件中写数据呢?因为如果在子进程重写aof文件时redis宕机了,此时新的aof文件没有生成,而aof_rewrite-buf由于是在内存中,也会丢失,这时父进程写在旧aof文件的数据起了大作用。

注意区分RDB的重写和AOF的重写:RDB的重写是属于更新机制,它重写rdb文件属于更新rdb文件,将两次重写之间的数据添加进去,如果说两次重写之间宕机了怎么办,那会丢失两次重写之间的数据。而AOF的重写属于文件瘦身,它刚开始生成aof文件时,只有判断文件大小这一种策略(自动情况下),只有达到指定大小,才有可能触发第二种文件瘦身机制。得益于父进程的存放数据策略,即使重写时宕机了,数据也大概率不会丢失。

当Redis同时开启AOF和RDB时,优先使用AOF策略。

混合持久化策略

redis后来引入的一一种更合理的持久化策略,它结合了rdb文件采用二进制从而数据恢复速度快的优点,也结合了aof的持久化策略,具体是先按照aof方式进行持久化,在触发重写机制后,将内存数据状态按照二进制写入aof文件中,但是父进程的缓存区中的数据仍然才用文本文件的方式加入到aof文件末尾。


网站公告

今日签到

点亮在社区的每一天
去签到