首页 > 代码库 > Redis 数据持久化的理解

Redis 数据持久化的理解

一、对持久化的理解


Redis 平时的键值对都是在内存中的,但是一旦意外中断或关闭连接,我们将丢失数据。

为了避免这种情况,就有一个持久化的机制,在某种条件下将数据以某种方式转储到文件中,下次启动服务器时可以通过持久化文件恢复数据。

 

二、持久化的方式


Redis 提供了两种方式,分别是RDB 和 AOF,两者最大的区别是 RDB 存储的是数据库状态(键值对),AOF 则是通过保存 Redis 服务器所执行的命令来记录数据库状态。

 

三、RDB


3.1 RDB文件的创建与载入

RDB持久化可以手动执行,也可以根据配置定期执行。

RDB持久化生成一个经过压缩的二进制文件,通过这个文件可以还原生成文件时的数据库状态。

 

两个Redis命令可以用于生成RDB文件,一个是SAVE,另一个是BGSAVE。

SAVE命令会阻塞 Redis 服务器进程, 直到 RDB 文件创建完毕为止, 在服务器进程阻塞期间, 服务器不能处理任何命令请求。而BGSAVE会派生出一个子进程。

 

如果服务器开启 了AOF 持久化功能, 那么服务器会优先使用 AOF 文件来还原数据库状态。 

技术分享

 

3.2 自动间隔性保存   

指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合

save <seconds> <changes>

 

Redis默认配置文件中提供了三个条件:

save 900 1

save 300 10

save 60 10000

 

 

四、AOF


4.1 AOF持久化的实现

AOF持久化保存数据库状态的方法是将服务器执行的SET、SADD、RPUSH等命令保存到AOF文件中。

服务器在启动时,可以通过载入和执行AOF文件中保存的命令来还原服务器关闭之前的数据库状态。

 

AOF持久化的实现可以分为命令追加、文件写入、文件同步三个步骤。

    命令追加:当AOF持久化功能处于打开状态时,服务器在执行完一个写命令后,会以协议格式将被执行的写命令追加到服务器状态的aof_buf缓冲区的末尾。

    文件写入和同步:不同appendfsync值产生不同的持久化行为

    技术分享

    always每次都要写入、同步,所以其安全性最高,效率是最慢的;everysec效率也足够快,也安全性也可以得到保证;no效率最高,但安全性比较差。

 

4.2 AOF文件的载入与数据还原

AOF文件中记录了数据库中所有写操作的命令,所以服务器只需要重新执行一遍AOF文件中的命令即可恢复服务器关闭之前的状态。步骤如下:

  • 创建一个不带网络连接的伪客户端;
  • 从AOF文件中分析并读取一条写命令;
  • 使用伪客户端执行被读出的写命令

技术分享

 

4.3 AOF重写

随着AOF文件中的内容越来越多,体积越来越大,使用AOF文件进行数据还原也会耗费更多时间。

为了解决AOF文件体积膨胀的问题,Redis会创建一个新的AOF文件来替代。

 

 

实际上, AOF 文件重写并不需要对现有的 AOF 文件进行任何读取、 分析或者写入操作, 这个功能是通过读取服务器当前的数据库状态来实现的。

首先从数据库中读取键现在的值, 然后用一条命令去记录键值对, 代替之前记录这个键值对的多条命令, 这就 是 AOF 重写功能的实现原理。

 

Redis 数据持久化的理解