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带来的短暂阻塞。
相关推荐
有想法的py工程师几秒前
PostgreSQL 字符集双重转义击穿 磁盘 I/O
数据库·postgresql
霸道流氓气质1 分钟前
OpenTelemetry 入门与实战:Java Agent、Spring Boot Starter与LLM调用追踪示例
java·开发语言·spring boot
头发还在的女程序员4 分钟前
【无标题】
网络·数据库·短剧小程序·短剧系统·海外短剧·短剧后台
m0_587383007 分钟前
24 小时自助健身房系统软件开发实战指南与案例解析
java·spring boot·spring·系统架构·需求分析
千千寰宇7 分钟前
[数据库系统] 数据库系统的设计原理研究
数据结构·数据库·database-opengemini/influxdb·database-dament/达梦
栖凤13 分钟前
Java 的 try-catch 在 Agent 里失效了,我用了 5 个模式才兜住
java·前端·python
小师兄吃牛肉13 分钟前
Java 同步系列之 ZooKeeper 分布式锁
java·分布式·java-zookeeper
麦壳饼23 分钟前
SonnetDB SQL 分页查询:LIMIT/OFFSET 与 FETCH 语法
数据库·sonnetdb
马剑威(威哥爱编程)26 分钟前
【AI全栈后端12-12】Spring Boot 3.x 到 4.x 迁移实操:Jakarta 11、Jackson 3 与 AI 2.0
java·开发语言·spring boot·后端
Gauss松鼠会27 分钟前
【GaussDB】破除gaussdb ugin索引支持中文模糊查询的迷思-字符序
java·运维·服务器·网络·数据库·gaussdb·经验总结