Redis的三种持久化方式

Redis的三种持久化方式

  • 1 RDB方式
    • 1.1 触发机制
    • 1.2 如何恢复rdb文件
    • 1.3 优缺点
  • 2 AOF方式
    • 2.1 AOF重写
    • 2.2 AOF重写流程
    • 2.3 优缺点
    • Redis重启时加载持久化文件的顺序
  • 3 AOF+RDB混合

Redis的持久化简单来讲就是将数据放到断电后数据不会丢失的设备中,也就是我们通常理解的硬盘上。

1 RDB方式

redis默认的持久化方式就是RDB方式

1.1 触发机制

save的规则满足的情况下,会自动触发rdb规则
执行flushall命令,也会触发我们的rdb规则
推出redis的时候,也会产生rdb文件
备份的话,就自动生成一个dump.rdb文件

1.2 如何恢复rdb文件

只需要将rdb启动目录就可以了,redis启动的时候会自动检查dump.rdb恢复其中的数据

1.3 优缺点

优点:
1.适合大规模的数据恢复
2.对数据的完整性要求不高
缺点:
1.需要一定的时间间隔进程操作,如果redis意外宕机了,最后一次修改的数据就没有了
2.fork进程的时候,会占用一定的内容空间

2 AOF方式

以日志的形式来记录每个写操作,将redis执行过的所有指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,就是redis重启的话,就根据日志文件的内容将写指令从前到后执行一次完成数据的恢复。aof方式保存的文件是appendonly.aof文件

2.1 AOF重写

AOF重写的触发机制也分为手动触发和自动触发两种方式

  1. 手动触发
    执行bgrewriteaof命令直接触发AOF重写
  2. 自动触发
    在redis.config配置文件中有两个配置项
    auto-aof-rewrite-min-size 64MB
    auto-aof-rewrite-min-percenrage 100
    上面两个配置表示:
  • 当AOF文件小于64MB的时候不进行AOF重写
  • 当当前AOF文件比上次AOF重写后的文件大100%的时候进行AOF重写

2.2 AOF重写流程

1.执行bgrewriteaof命令的时候,如果当前有进程正在执行AOF重写,那么直接返回;如果有进程正在执行bgsave,那么等待bgsave执行完毕再执行AOF重写。
2.Redis主进程会fork一个子进程执行AOF重写,开销和RDB重写一样。
3.AOF重写过程中,不影响Redis原有的AOF过程,包括写消息到AOF缓存以及同步AOF缓存中的数据到硬盘。
4.AOF重写过程中,主进程收到的写操作还会将命令写到AOF重写缓冲区,注意和AOF缓冲区区分开。
5.由于AOF重写过程中原AOF文件还在陆续写入数据,所以AOF重写子进程只会拿到fork子进程时的AOF文件进行重写。
6.子进程拿到原AOF文件中的数据写道一个临时的AOF文件中。
7.子进程完成AOF重写后会发消息给主进程,主进程会把AOF重写缓冲区中的数据写道AOF缓冲区,并且用新的AOF文件替换旧的AOF文件。

2.3 优缺点

优点
1.每一次修改都同步,文件的完整性会更好
2.每秒同步一次,可能会丢失一秒的数据
3.从不同步,效率最高的
缺点
1.相对于数据文件来说,aof远远大于rdb,修复的速度也比rdb慢
2.aof运行效率也要比rdb慢

Redis重启时加载持久化文件的顺序

  1. Redis重启的时候优先加载AOF文件,如果AOF文件不存在再去加载RDB文件。
  2. 如果AOF文件和RDB文件都不存在,那么直接启动。
  3. 不论加载AOF文件还是RDB文件,只要发生错误都会打印错误信息,并且启动失败。

3 AOF+RDB混合

通过对上面的RDB和AOF的介绍后,可以发现,使用RDB持久化会有数据丢失的风险,但是恢复速度快,而使用AOF持久化可以保证数据完整性,但恢复数据的时候会很慢。于是从Redis4之后新增了混合AOF和RDB的模式,先使用RDB进行快照存储,然后使用AOF持久化记录所有的写操作,当重写策略满足或手动触发重写的时候,将最新的数据存储为新的RDB记录。这样的话,重启服务的时候会从RDB何AOF两部分恢复数据,即保证了数据完整性,又提高了恢复的性能。
开启混合模式后,每当bgrewriteaof命令之后会在AOF文件中以RDB格式写入当前最新的数据,之后的新的写操作继续以AOF的追加形式追加写命令。当redis重启的时候,加载 aof 文件进行恢复数据:先加载 rdb 的部分再加载剩余的 aof部分。

需要开启的配置项:
aof-use-rdb-preamble yes

开启混合持久化模式后,重写之后的aof文件里和rdb一样存储二进制的 快照数据,继续往redis中进行写操作,后续操作在aof中仍然是以命令的方式追加。因此重写后aof文件由两部分组成,一部分是类似rdb的二进制快照,另一部分是追加的命令文本;

你可能感兴趣的:(java,redis,java,redis)