[准备面试|Redis]- 持久化

190 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第14天,点击查看活动详情

前言

本系列主要从基础知识,而后进阶,再逐步深入 Redis 的原理分析,以保证对 Redis 的学习深入浅出,学以致远并输出自己对 Redis 学习和了解的成果。本系列将划分四个部分:

持久化

将 Redis 作为数据库使用时,为了避免重启后数据不丢失,希望 Redis 将数据从内存中以某种形式同步到硬盘中。这一过程就是持久化。

持久化的方式有两种:

  • RDB 根据指定规则“定时”将内存中的数据存储在硬盘中
  • AOF 每次执行命令后将命令本身记录下来

RDB 方式

RDB 方式就是通过快照完成持久化。当符合一定条件时 Redis 自动将内存中所有的数据生成副本存储在硬盘上。

四种方式会对数据进行快照:

  • 根据配置规则进行自动快照     save second num 由 2 个参数构成,时间和更改的键个数
save 300 10 // 300秒内至少有 10 个键被更改时则进行快照
  • 用户执行 Save 或bgSave 命令:当我们进行重启服务器或者手动迁移、备份时,则可以执行命令进行备份。

    • save   该命令进行快照时会阻塞所有客户端的请求,避免在生产环境使用,容易导致其他客户端因其导致无响应
    • bgSave 后台异步地进行快照,不会影响其他客户端请求
  • 执行 Flushall 命令,将会数据看中所有的数据。若过程中触发快照条件则会执行一次快照操作。

  • 执行复制(replication)命令,都会执行快照操作,将数据从一个数据库自动将数据同步到其他数据库上。

RDB 复制原理

  • Redis 使用 fork 函数复制父进程从而创建出子进程
  • 父进程继续工作,子进程负责持久化工作,将数据从内存中写入硬盘
  • 子进程写入所有数据后会用该临时文件替换旧的 RDB 文件,至此完成一次快照操作

AOF 方式

当使用 Redis 存储非临时数据时,可打开 AOF 持久化来降低因进程终止导致的数据丢失。AOF 方式是将 redis 执行的每个写命令追加到硬盘文件中,恢复的时候只需重新执行下该文件的所有命令。

AOF 默认不开启,需要进行配置。

appendonly yes  # 默认是不开启aof模式的,默认是使用rdb方式持久化的,在大部分的情况下,rdb完全够用
appendfilename "appendonly.aof"

# appendfsync always # 每次修改都会sync 消耗性能
appendfsync everysec # 每秒执行一次 sync 可能会丢失这一秒的数据
# appendfsync no # 不执行 sync ,这时候操作系统自己同步数据,速度最快

优势

  • 每次修改都会同步,保证文件的完整性
  • 默认情况下,每秒执行一次同步操作

RDB 与 AOF 的抉择

  • Redis 支持同时使用 RDB 和 AOF 方式。如果可以接受数分钟内的数据丢失,可以只使用 RDB 持久化。
  • RDB 相对于 AOF 方式数据恢复的数据是更快的,且 RDB 方式更便于进行数据备份,所以不建议只使用 AOF 方式 。

参考资料: