Redis 的持久化机制有哪些?

Redis持久化机制(面试结构化)

Redis持久化就是把内存的数据保存到磁盘,防止宕机数据全部丢失,有两种:RDB、AOF,也可以两者同时开启。

1. RDB(快照)

把某一时刻全量内存数据,生成一个二进制快照文件dump.rdb保存磁盘。

触发方式

  1. 手动触发
    save:主线程同步执行,会阻塞,大数据量不建议用。
    bgsave:fork子进程,子进程做快照,主线程继续处理请求,日常主要用这个。
  2. 自动触发 :配置save 秒 改动次数,比如save 900 1,900秒内至少1个key改动,自动执行bgsave。

优点

  • 文件体积小,二进制文件,适合做备份、迁移。
  • 恢复速度快,直接加载rdb文件。

缺点

  • 会丢失最后一次快照之后的数据:两次快照之间宕机,这部分内存数据没落地磁盘,直接丢失。
  • fork子进程时,如果数据量大,会短暂阻塞主线程。

2. AOF(追加日志)

记录每一条写命令,以文本日志形式追加到aof文件;Redis重启时,重新回放日志命令恢复数据。

三种刷盘策略 appendfsync

  1. always:每写一条就刷磁盘,几乎不丢数据,性能很差。
  2. everysec:每秒刷一次磁盘,默认配置,最多丢失1秒数据,性能和安全折中。
  3. no:交给操作系统自己刷盘,不可控,丢失数据多。

AOF重写 bgrewriteaof

AOF日志会越写越大。重写会fork子进程,读取当前内存数据,生成一份精简AOF日志,替换旧大文件,不会记录无效的中间命令。

注意:重写不会阻塞主线程。

优点

  • 数据丢失极少,默认everysec最多丢1秒数据,安全性高。

缺点

  • AOF日志文件体积一般比RDB大;恢复数据需要回放命令,速度慢于RDB。

3. RDB + AOF同时开启

Redis4.0以后混合持久化:

bgsave生成RDB快照,同时把快照之后增量写命令追加到AOF,aof文件开头是rdb二进制,后面是aof日志。

  • 恢复的时候:先加载rdb快照,再回放后面增量AOF命令。
    兼顾RDB恢复快、AOF丢失少的优点。

注意:同时开启时,Redis重启优先加载AOF文件。

4. 各自适用场景

  • RDB:适合定时冷备份,可以容忍少量数据丢失。
  • AOF:追求数据安全,不想丢失大量数据,线上一般开启AOF。

总结

  1. RDB:全量快照,bgsave子进程,恢复快,存在数据丢失风险;
  2. AOF:记录写命令日志,三种刷盘策略,靠AOF重写压缩文件;
  3. 4.0+支持混合持久化,线上最推荐;
  4. 两种持久化都会fork子进程,大数据量要注意fork带来的短暂阻塞。
相关推荐
杨杨杨大侠13 小时前
知识库已经有了,Java 程序员还要做什么?Spring AI RAG 实战
java·openai·ai编程
伊信13 小时前
Spring AI 基础学习与应用
java·后端
Omics Pro13 小时前
上海AI Lab孙思琦×高张阳:虚拟细胞代码库智能体
数据库·人工智能·算法·机器学习·自然语言处理
夜郎king14 小时前
基于 Java + Playwright 实现网站自动访问与数据采集(以腾讯云开发者社区为例)
java·playwright·网页数据获取
Anastasiozzzz14 小时前
重新定义 Agent 基建:Redis 在现代 AI 与智能体系统中的工程实践
java·人工智能·redis·ai
careathers14 小时前
【数据结构】队列
java·数据结构
步行cgn14 小时前
Spring 通过 factory-method 实例化 Bean 详解与常见错误排查
java·后端
lv__pf14 小时前
seata【实战 msb】
java·开发语言·后端
旺仔不是程序员14 小时前
相关子查询与性能优化:PostgreSQL 逐行执行的代价与 JOIN 重写
数据库·后端·sql
cxoptics14 小时前
偏振片(起偏器/检偏器)怎么区分?
java