三种持久化策略

AOF

ps:AOF的诞生是为了解决早期的RDB无法及时持久化的问题

redis执行写命令操作后,会把其命令追加到AOF文件里,AOF是文本格式文件,AOF持久化默认是默认关闭

AOF的刷盘时机有三种,具体是由config里的appendfsync 参数控制的

1.always:每执行一条写命令就写入一次(每次write,每次fsync)

2.Everysec:每秒执行追加到文件一次,会先将命令写到AOF对应的内核缓冲区,后每隔一秒再写入

磁盘中的文件(每次write,每秒fsync)

3.no:由操作系统来决定啥时候刷盘(每次write)

AOF重写

它这个就是说当AOF文件大小到达某些阈值后(可配置),会读取redis中的所有键值对,生成命令写入 新的AOF文件里,然后用新的替换旧的

目的:给文件瘦身,比如说一开始有set saki 69,set saki 91两个命令,重写后就只有set saki 91一条

命令了

为什么要用新的文件替换旧的文件,而不是直接覆盖呢

怕重写一般失败了,污染了旧文件

写入是在主线程执行的,因为写入的量不多。但重写是会fork子进程来完成的,这其中会把父进程的数据拷贝一份

….(待补充)

为了避免子进程在重写时,主进程的数据发生了变化,导致AOF文件里的数据和内存里的对应起来不一致。redis对其进行了一层优化,即将重写阶段新来的数据写入AOF的重写缓冲区里,等到AOF重写完成后,再把AOF重写缓冲区里的数据追加到新的AOF文件中。

RDB快照

RDB快照就是指记录某一时间段的内存数据,记录的是实际数据,因此在做内存恢复时效率是要比AOF高不

少的。

RDB可以直接读入内存就好了,不用像AOF那样需要执行命令

RDB是紧凑的二进制文件

RDB还提供了两种命令来生成RDB文件

save:主线程直接执行,会阻塞正常命令的执行

bgsave:操作系统fork子进程执行,可以避免主线程的阻塞

生成RDB时,不会保存过期的key

导入RDB时,主节点会对过期key进行过滤,而从不会

bgsave和AOF重写一致,都会fork子进程,但在bgsave期间新来的数据是不会被保存到此时的RDB的,只能等到下一次RDB

其他生成

正常停机时生成一次RDB

内部触发机制 比如save/bgsave 91 1:代表91秒内至少有1个key被修改,就RDB一次

redis默认的持久化策略:采用RDB

save 900 1

save 300 10

save 60 10000

appendonly no

注意:这个save不会阻塞主线程,**Redis 自动触发 ****bgsave** 来生成快照

4.x后的混合持久化