redis 如何持久化

Redis 持久化机制详解

Redis 提供三种主要的持久化方式,确保在重启或故障时数据不丢失:

1. RDB(Redis Database) - 快照持久化

核心原理

  • 定时生成内存数据的二进制快照
  • 将某一时刻的数据集保存到磁盘上的 .rdb 文件

触发机制

方式 命令/配置 特点
手动触发 SAVE 阻塞式保存,生产环境慎用
后台触发 BGSAVE 创建子进程执行,不阻塞主线程
自动触发 配置文件规则 save 900 1(15分钟至少1次修改)

配置示例(redis.conf)

conf复制代码

复制代码
save 900 1        # 15分钟内至少1个key变化
save 300 10       # 5分钟内至少10个key变化
save 60 10000     # 1分钟内至少10000个key变化

dbfilename dump.rdb  # RDB文件名
dir ./               # 保存路径

优点

  • 紧凑的二进制格式,文件小
  • 恢复速度快(适合大规模数据)
  • 最大化Redis性能(子进程处理)

缺点

  • 可能丢失最后一次快照后的数据
  • 大数据量时fork子进程可能阻塞服务

2. AOF(Append Only File) - 日志持久化

核心原理

  • 记录所有写操作命令(类似MySQL binlog)
  • 命令以Redis协议格式追加到文件末尾

工作流程

同步策略

策略 命令 数据安全 性能
always appendfsync always 最高(每条命令同步) 最低
everysec appendfsync everysec 中等(每秒同步) 平衡(默认)
no appendfsync no 最低(OS决定) 最高

AOF重写机制

  • 解决AOF文件膨胀问题
  • 创建当前数据集的最小命令集
  • 触发方式:
    • 手动:BGREWRITEAOF
    • 自动:auto-aof-rewrite-percentage 100 + auto-aof-rewrite-min-size 64mb

配置示例

conf复制代码

复制代码
appendonly yes               # 启用AOF
appendfilename "appendonly.aof" 
appendfsync everysec         # 推荐配置
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

优点

  • 数据安全更高(最多丢失1秒数据)
  • 可读性好(Redis协议文本)
  • 意外宕机恢复更可靠

缺点

  • 文件体积通常比RDB大
  • 恢复速度较慢
  • 对性能影响稍高于RDB

3. 混合持久化(Redis 4.0+)

最佳实践方案

  • 结合RDB和AOF优势
  • 生成包含RDB格式 + 增量AOF命令的文件

工作流程

  1. 使用BGSAVE创建RDB快照
  2. 后续命令写入AOF缓冲区
  3. 重写时生成RDB头 + AOF尾的混合文件

配置

conf复制代码

复制代码
aof-use-rdb-preamble yes  # 启用混合模式

优势

  • 快速加载(RDB部分)
  • 数据完整性(AOF部分)
  • 文件更紧凑

持久化方案选择指南

场景 推荐方案 说明
数据备份 RDB 文件小,恢复快
高数据安全 AOF everysec 最多丢失1秒数据
生产环境 混合持久化 最佳平衡方案
缓存服务 关闭持久化 纯缓存场景

数据恢复优先级

Redis重启时按以下顺序恢复数据:

  1. 只使用AOF文件(如果启用)
  2. 使用RDB文件(如果未启用AOF)
  3. 混合持久化文件(优先加载RDB部分)

运维技巧

  1. 禁用透明大页 :防止fork延迟

    bash复制代码

    复制代码
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
  2. 监控持久化状态

    bash复制代码

    复制代码
    redis-cli info persistence
  3. 灾难恢复测试:定期验证备份文件有效性

  4. 多数据中心备份:异地保存RDB/AOF文件

⚠️ 重要提示:持久化不能替代备份!仍需定期将RDB/AOF文件复制到异地安全存储。

相关推荐
世界尽头与你3 分钟前
详解 MySQL 数据库索引实现机制 - B 树和 B + 树
数据库·mysql·索引
德彪稳坐倒骑驴8 分钟前
MySQL Oracle面试题
数据库·mysql·oracle
数据知道16 分钟前
PostgreSQL 核心原理:什么场景下开启 JIT 能提升性能?(JIT 编译)
数据库·postgresql
吕司18 分钟前
MySQL库的操作
数据库·mysql·oracle
LaughingZhu23 分钟前
Product Hunt 每日热榜 | 2026-02-05
大数据·数据库·人工智能·经验分享·搜索引擎·产品运营
indexsunny25 分钟前
互联网大厂Java面试实战:微服务与Spring生态技术解析
java·spring boot·redis·kafka·mybatis·hibernate·microservices
逃逸线LOF26 分钟前
mysql本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止
数据库
Remember_99337 分钟前
MySQL 索引详解:从原理到实战优化
java·数据库·mysql·spring·http·adb·面试
dishugj44 分钟前
【Oracle】 rac的一些问题以及解决方案
数据库·oracle
Ronin3051 小时前
日志打印和实用 Helper 工具
数据库·sqlite·rabbitmq·文件操作·uuid生成