bigywater.tech
Redis · 67

Redis 重启恢复耗时

Redis 重启之后多久能服务?答案取决于两件事:要加载多少数据,以及数据是以什么格式落在磁盘上。这篇在 10 万到 200 万个 key 上,实测三种持久化配置的重启耗时,再看 AOF 增量没重写时会拖多久。

0.48 s / 百万 key
RDB(及 RDB base 的 AOF)的重启加载速度;200 万个 key 需要 0.95 s
0.87 s / 百万 key
纯命令 AOF 的加载速度,比 RDB 慢约 82%
0.47 → 3.31 s
100 万 key 的 base 之后追加 300 万条 SET 未重写时的重启耗时

不同数据量:重启耗时

每格一个新实例:写入 → 持久化 → 正常停止 → 重启,计时到 loading=0
实测 · 本机执行输出
    key 数 |              RDB |    AOF(RDB base) |         AOF(纯命令)
   100000 |           0.07 s |           0.08 s |           0.12 s
   500000 |           0.24 s |           0.25 s |           0.41 s
  1000000 |           0.47 s |           0.46 s |           0.85 s
  2000000 |           0.95 s |           0.95 s |           1.74 s

加载耗时随 key 数近似线性:RDB 200 万个 key 0.95 s,约每百万 0.48 s。AOF 用 RDB 作 base 时和 RDB 几乎一样;纯命令的 AOF 每百万 key 约 0.87 s,慢约 82%——它要解析并执行每一条命令。本机的 SSD、CPU 与 key/value 大小决定了这些绝对值,只有「线性」和「相对比例」可以迁移到别的机器。

磁盘上的大小

实测 · 本机执行输出
    key 数 |              RDB |    AOF(RDB base) |         AOF(纯命令)
   100000 |              7.8 |              7.8 |             10.1
   500000 |             39.4 |             39.4 |             50.9
  1000000 |             78.9 |             78.9 |            101.9
  2000000 |            158.9 |            158.9 |            204.9

RDB 与 AOF(RDB base)的文件大小完全一样(同一份 RDB);纯命令 AOF 大约多 29%。(value 是随机字符串,几乎不可压缩;value 重复度高时 RDB 会小得多。)

AOF 没重写:增量要回放

100 万个 key 的 base 之后又追加 X 条 SET
实测 · 本机执行输出
     追加命令数   incr 大小 MB      重启总耗时
         0          0.0     0.47 s
    200000         13.2     0.66 s
   1000000         66.8     1.39 s
   3000000        202.8     3.31 s

base 固定是 100 万个 key(重启 0.47 s),之后追加的命令不重写,重启时要逐条回放:20 万条(13 MB incr)多 0.18 s,100 万条多 0.91 s,300 万条(203 MB)多 2.84 s,每百万条约 0.93 s。这里的增量都是简单的 SET;对同一批 key 的反复修改,回放的条数远多于最终的 key 数。所以自动重写(第 59 篇)不只是省磁盘,也是在控制重启时间。

这个实验没有包含的部分

重启耗时只是「Redis 能服务」的一部分。真实的恢复时间还要加上:进程被外部拉起的延迟、从库场景下的复制追赶(第 54–58 篇)、客户端重连。同时,本机数据集最大只有 200 万个 key(约 160 MB),更大的数据集、更慢的磁盘、更大的 value 都会改变绝对值。

分步演示:三种配置与增量

Redis 重启恢复耗时
本步的数据

    本文用到的工具与边界

    • 本机 macOS 27 / Redis 8.10.2 独立实例(本机回环端口,save 关闭),redis-cli 风格输出由自写的 RESP 客户端打印;计时用 time.perf_counter,数字每次运行会有小幅抖动。正常停止(SIGTERM)后启动;耗时从启动进程到 INFO persistence 的 loading:0;value 是 random.Random 生成的 64 位十六进制字符串
    • 没有验证:崩溃后(而非正常停止)的启动、超过 200 万个 key 的数据集、RDB 压缩开启对加载耗时的影响(本文的 value 不易压缩)、从库启动后与主库追赶的时间
    京ICP备2026067502号-1京公网安备11010502063487号