首页 > 数据库 >Redis6️⃣持久化

Redis6️⃣持久化

时间:2022-10-13 14:33:34浏览次数:70  
标签:AOF 持久 Redis6 Redis RDB 进程 日志

Redis 持久化

Redis 持久化:将内存数据写入持久存储(如磁盘)

四种策略

  • 无持久性:禁用持久性。
  • RDB(Redis DataBase)
    • 以指定的时间间隔,记录内存中的数据集快照
    • 恢复时将快照文件直接读到内存里。
  • AOF(Append Only File)
    • 追加日志文件的形式,记录服务器接收到的写操作
    • 服务器启动时读取日志文件,重建数据集。
    • 当日志文件过大时,Redis 会在后台重写日志(Rewrite)
  • RDB + AOF
    • 同一个 Redis 实例中,可结合 AOF 和 RDB 使用。
    • Redis 重启时,使用 AOF 文件重建原始数据集。

RDB

RDB(Redis DataBase)

  • 以指定的时间间隔,记录内存中的数据集快照
  • 恢复时将快照文件直接读到内存里。

image-20220415215813602

  1. 持久化时,将数据写入到一个临时文件中(而不是直接写入 dump.rdb
  2. 持久化完成后,将临时文件的内容覆盖到 dump.rdb

1.1、持久化流程

  1. 调用 bgsave 开始持久化。

  2. 判断是否已有子进程(正在持久化),有则直接返回,没有则开始持久化。

  3. 当前进程 fork 一个子进程,fork 完成后可响应其它命令。

    • 父进程 fork 的过程是阻塞的。
    • 子进程的 I/O 不会阻塞父进程。
  4. 子进程持久化完成后生成 RDB 文件,通知父进程。

    image-20220415222557294

1.1.1、bgsave

用于持久化

  • save:阻塞式,直接在主进程中持久化。
  • bgsave:异步,在后台创建子进程进行持久化。

1.1.2、fork

执行 bgsave 时,Redis 不会在主进程进行持久化,而是 fork 创建一个子进程

fork:复制当前进程,作为当前进程的子进程。

  • 子进程由系统 exec 调用,引入写时复制技术以提高效率。
  • 通常,父进程和子进程共用物理内存。
  • 当进程空间的内容发生变化时,将父进程的内容复制给子进程。

1.1.3、相关配置

redis.conf

含义 说明
dbfilename RDB 文件名称 默认 dump.rdb
dir RDB 保存位置 默认是 Redis 启动时命令行所在目录
stop-writes-on-bgsave-error 持久化发生错误时关闭写操作 推荐 yes
rdbcompression 使用 LZF 算法压缩 RDB 文件 推荐 yes
rdbchecksum 检查数据的完整性和准确性 推荐 yes

1.2、特点

优点

  • 适用于大规模数据的恢复,且对数据完整性和一致性不敏感。
  • 节省磁盘空间,恢复速度快。

缺点

  • fork 会复制当前进程的所有数据,占用 2 倍内存。
  • 虽然 fork 采用写时拷贝技术,但在海量数据下消耗性能。
  • 服务器异常停止时,可能丢失最后一次快照后的修改。

AOF

AOF(Append Only File)

  • 追加日志文件的形式,记录服务器接收到的写操作
  • 服务器启动时读取日志文件,重建数据集。
  • 当日志文件过大时会重写日志(Rewrite),压缩文件。

2.1、持久化流程

  1. 客户端请求的写操作,会被追加到 AOF 缓冲区

  2. AOF 缓冲区根据 AOF 持久化策略,将写操作同步到磁盘 AOF 文件中。

  3. AOF 文件大小超过重写策略手动重写时,重写压缩 AOF 文件容量。

  4. Redis 服务器重启时,加载 AOF 文件中的写操作以恢复数据。

    image-20220415230308082

2.1.1、配置

redis.conf

含义 说明
appendonly 开启 AOF 默认 no
appendfilename 文件名称 默认 appendonly.aof
appendfsync 同步频率 always:每个写操作
everysec:每秒
no:Redis 不主动同步,由操作系统进行同步

2.1.2、Rewrite

压缩 AOF 文件内容,仅保留可恢复数据的最小指令集

2.2、特点

优点

  • 备份机制更稳健,丢失数据概率更低。
  • 日志文件存放写操作指令,具有可读性,可处理误操作。

缺点

  • 相比 RDB 占用更多磁盘空间。
  • 恢复备份速度慢。
  • 若同步频率为 always 或 everysec,有一定性能压力。
  • 若日志文件中存在 Bug(如人为修改),会导致无法恢复。

RDB or AOF ?

  • 可以单独使用 RDB,不建议单独使用 AOF,建议结合使用。
  • 若对数据的完整性和一致性要求不高,可单独使用 RDB。
  • 若仅作为内存缓存,可不考虑持久化。

标签:AOF,持久,Redis6,Redis,RDB,进程,日志
From: https://www.cnblogs.com/secretmrj/p/16788076.html

相关文章