深入Redis原理与应用——Redis的数据持久化

深入Redis原理与应用——Redis的数据持久化


持久化方式:AOF 和 RDB,默认是 RDB 方式,但 AOF 开启后优先使用 AOF。

RDB 持久化

(1)RDB 持久化可以手动执行也可以根据服务器配置选项定期执行。
(2)RDB 持久化所产生的 RDB 文件是一个经过压缩的二进制文件,通过该文件可以还原生成 RDB 时数据库的状态。
(3)生成 RDB 文件的命令 SAVE 和 BGSAVE。SAVE 会阻塞 redis 服务器进程直到 RDB 文件创建完毕。BGSAVE 会派生出一个子进程然后由子进程负责创建 RDB 文件(通常说 redis 是单线程说的是其服务线程只有一个,不代表其不能派生出多个线程完成别的任务)。
(4)在 BGSAVE 启动子进程保存数据库时,客户端发送的 SAVE 命令和 BGSAVE 命令都会被服务器拒绝,且 BGSAVE 和 BGREWRITE 命令不能同时执行。
(5)服务器载入 RDB 文件时将一直处于阻塞状态。
(6)自动间隔保存:服务器每隔一段时间会自动保存 RDB 文件,默认配置如下:

  • save 900 1 // 九百秒内有一次修改就保存 RDB
  • save 300 10
  • save 60 10000
  • 相关配置保存在 redisServer 的 saveparams 属性中。

(7)dirty 计数器记录距离上次成功执行 SAVE 或 BGSAVE 命令进行了多少次修改lastsave 属性是一个 unix 时间戳,记录了上次成功执行 SAVE 或 BGSAVE 命令的时间戳。
(8)redis 的周期性操作函数 serverCron 每隔 100 毫秒就会执行一次,其中一项工作就是检查 RDB 是否满足保存条件,满足则执行 BGSAVE 命令。
(9)RDB 文件结构:最开头保存了 REDIS 五个字符用于检查文件是否是 RDB 文件,之后跟着 4 字节的db_version 表示 RDB 文件的版本号,之后跟了 0 个或任意多个数据库(取决于使用了几个数据库),最后跟一个 1 字节的 EOF。每一个 database 部分可保存为 SELECTDB(1 字节表示接下来要读入的是一个数据库号码)、db_number(当前的数据库号码)和 key_value_pairs(每一个键值对对象又包括 type、key 和 value,type 记录了 value 的类型,如果是带过期时间的键值对的话前面还要加EXPIRETIME_MS 和 ms 两个属性)。
(10)RDB 文件中的字符串:以 int 或 raw 保存,若以 raw 保存且长度大于 20 字节会启动字符串的压缩后保存(若关闭字符串压缩则不会压缩)。没有压缩的字符串 len+string,压缩过的字符串压缩方式+压缩长度+原始长度+压缩后的字符串。

AOF 持久化

(1)AOF 持久化即将执行的命令保存到 AOF 文件中,服务器启动时可以通过载入和执行 AOF文件中保存的命令来还原服务器关闭前的数据库状态。
(2)AOF 持久化功能可以分为命令追加(服务器每执行完一个写命令都会将写命令追加到aof_buf 缓冲区的末尾)、文件写入和文件同步(服务器每结束一个事件循环都考虑是否将aof_buf 缓冲区中的内容同步到 AOF 文件中,具体服务器的设置有 always,everysec 和 no,默认 everysec)(写入和同步的区别是在调用 write 函数写入文件之前还有一个缓冲区缓冲区满了才真正写入,而同步则是强制将缓冲区数据写入文件中)三个步骤。
(3)AOF 文件的载入与数据还原:redis 会首先创建一个不带网络连接的伪客户端,再依次从 AOF 文件中分析并读取出一条条记录交给伪客户端执行。
(4)AOF 重写:随着服务器的运行 AOF 文件会越来越大,为了解决这个问题 redis 提供了AOF 文件重写功能。因为 AOF 中的大量操作是重复冗余的,所以重写就是从数据库中读取键现在的值然后使用一条命令去记录这个键的值,替代之前关于这个键值对的多条命令。
(5)AOF 后台重写:因为重写操作比较占用资源所以 redis 将重写操作放到后台执行,但这回导致 AOF 重写期间服务器新处理的命令对数据库状态进行修改,最终导致数据库与 AOF文件不一致。解决办法是设置一个 AOF 重写缓冲区,这个缓冲区在 AOF 创建子进程的时候使用,当 redis 服务器执行完一个写命令之后它会同时将这个写命令发送给 AOF 缓冲区和 AOF重写缓冲区,这样既可以保证对现有 AOF 文件的正常处理也能保证 AOF 重写过程正常。子进程的 AOF 重写工作完成之后会给父进程发送一个信号,父进程接收到信号后会调用信号处理函数并执行:将 AOF 重写缓冲区中的所有内容写入到新的 AOF 文件中,对新的 AOF 文件进行改名并原子地覆盖现有的 AOF 文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值