Redis 面试突破 - 持久化

大纲
Redis 对外提供数据访问服务时,使用的是常驻内存的数据。为了在Redis Server重启之后数据还可以得到恢复,Redis具备将数据持久化到硬盘中的能力。

1 持久化的作用

目录

持久化方式

2 RDB

Redis Server在有多db 中存储的key-value可以理解为Redis的一个状态
当发生写操作时,Redis就会从一个状态切换到另外一个状态
基于全量的持久化就是在某个时刻,将Redis的所有数据持久化到硬盘中,形成一个快照。当Redis 重启时,通过加载最近一个快照数据,可以将Redis 恢复至最近一次持久化状态上。
 全量模式持久化

2.1 全量写入流程

包含2种方式:save 和 bgsave

save 可以由客户端显示触发,也可以在redis shutdown 时触发
save本身是单线程串行化的方式执行的,因此当数据量大时,有肯能会发生Redis Server的长时间卡顿。但是其备份期间不会有其他命令执行,因此备份时期数据的状态始终是一致性的

save-1
save-2
bgsave 也可以由

  • 客户端显示触发
  • 通过配置定时任务触发
  • 在master-slave的分布式结构下由slave节点触发

bgsave命令在执行的时候,会fork一个子进程。子进程提交完成之后,会立即给客户端返回响应,备份操作在后台异步执行,在此期间不会影响Redis的正常响应

对于bgsave来说,当父进程Fork完子进程之后,异步任务会将当前的内存状态作为一个版本进行复制
在复制过程中产生的变更,不会反映在这次备份当中

在Redis的默认配置当中,当满足下面任一条件时,会自动触发bgsave 的执行
| 配置 | seconds | changes |
| --- | --- | --- |
| save | 900 | 1 |
| save | 300 | 10 |
| save | 60 | 10000 |

bgsave相对于save来说,其优势是异步执行,不影响后续的命令执行。但是Fork子进程时,涉及父进程的内存复制,此时会增加服务器的内存开销。当内存开销高到使用虚拟内存时,bgsave的Fork子进程会阻塞运行,可能会造成秒级的不可用。因此使用bgsave需要保证服务器空闲内存足够。
bgsave-1
bgsave-2
图示
| 命令 | save | bgsave |
| --- | --- | --- |
| IO类型 | 同步 | 异步 |
| 是否阻塞 | 阻塞 | 非阻塞(在fork是阻塞) |
| 复杂度 | O(n) | O(n) |
| 优点 | 不会消耗额外内存 | 不阻塞客户端命令 |
| 缺点 | 阻塞客户端命令 | 需要Fork子进程,内存开销大 |

不用命令,而使用配置

右边为最佳配置



导入大量数据

执行save,查看生成的 RDB 文件
save 命令是阻塞式执行的!!!!!, save时无法进行其他命令操作!!!
接着验证 bgsave

非阻塞式命令!!!
使用子进程执行,结束时进程灭亡
生产临时文件并替换更新 RDB 文件
总结

2.2 恢复流程

当Redis重新启动时,会从本地磁盘加载之前持久化的文件。当恢复完成之后,再受理后续的请求操作。

3 增量模式的持久化(AOF)

RDB 的缺点-1
RDB 的缺点-2

RDB记录的是每个状态的全量数据,而AOF(append-only-file)记录的则是每条写命令的记录,通过所有写命令的执行,最后恢复出最终的数据状态。其文件的生成如下所示:

创建
恢复

3.1 写入流程

  • always:每一次刷新缓冲区,都会同步触发同步操作。因为每次的写操作都会触发同步,所以该策略会降低Redis的吞吐量,但是这种模式会拥有最高的容错能力。
    always
  • every second:每秒异步的触发同步操作,这种是Redis的默认配置。
    every second
  • no:由操作系统决定何时同步,这种方式Redis无法决定何时落地,因此不可控。
    no

| 命令 | always | everysec | no |

优点 不丢失数据 每秒1次fsync,丢1秒数据 无需设置

缺点 IO开销大,一般的STAT盘只有几百TPS 丢1秒数据 不可控

3.2 回放流程

AOF的回放时机也是在机器启动时,一旦存在AOF,Redis会选择增量回放
因为增量的持久化持续的写入磁盘,相比全量持久化,数据更加完整。回放的过程就是将AOF中存放的命令,重新执行一遍。完成之后再继续接受客户端的新命令。

AOF模式的优化重写

随着Redis 持续的运行,会有大量的增量数据append 到AOF 文件中。为了减小硬盘存储和加快恢复速度,Redis 通过rewrite 机制合并历史AOF 记录。如下所示:













整个流程描述如下:

历史AOF:以快照的方式保存。

快照写入期间的增量:待快照写入完成之后append 到快照文件中。

后续的增量:写入新的AOF。

3 最终抉择及最佳实践





#面经##秋招##春招##笔试题目#
全部评论

相关推荐

点赞 13 评论
分享
牛客网
牛客企业服务