Skip to content

第10章:Redis 持久化(防止数据丢失,核心)

10.1 持久化的意义

Redis是基于内存的数据库,所有数据默认存储在内存中。当Redis服务重启时,内存中的数据会全部丢失。持久化机制可以将内存中的数据保存到磁盘,确保数据不会因为服务重启而丢失,是生产环境中必须配置的核心功能。

10.2 两种持久化方式

RDB(快照持久化)

RDB是Redis默认的持久化方式,通过创建内存数据的快照来实现持久化。

触发方式

  • 手动触发

    • SAVE:同步执行,会阻塞Redis服务器,直到快照创建完成
    • BGSAVE:异步执行,会fork一个子进程来创建快照,不阻塞主进程

    示例:

    bash
    # 手动触发快照(同步)
    SAVE
    
    # 手动触发快照(异步)
    BGSAVE
  • 自动触发:在redis.conf配置文件中设置

    txt
    # 900秒内有1个键被修改时触发
    save 900 1
    # 300秒内有10个键被修改时触发
    save 300 10
    # 60秒内有10000个键被修改时触发
    save 60 10000

优点与缺点

  • 优点
    • 恢复速度快,直接加载快照文件
    • 对性能影响小,只有在创建快照时会有短暂影响
    • 适合用于备份和灾难恢复
  • 缺点
    • 可能丢失最近一段时间的数据(从上次快照到服务重启之间的数据)
    • 大内存实例创建快照可能会导致服务短暂阻塞

AOF(Append Only File)

AOF通过记录所有写命令来实现持久化,重启时通过重新执行这些命令来恢复数据。

配置方式

  1. 开启AOF:在redis.conf中设置

    txt
    appendonly yes
  2. 设置同步频率

    • always:每次写命令都同步到磁盘,最安全但性能最差
    • everysec:每秒同步一次,平衡安全性和性能(默认)
    • no:由操作系统决定何时同步,性能最好但安全性最差

    配置示例:

    txt
    appendfsync everysec

优点与缺点

  • 优点
    • 数据安全性高,最多丢失1秒的数据
    • 日志文件可读性好,可手动修复错误命令
  • 缺点
    • 文件体积大,占用更多磁盘空间
    • 恢复速度慢,需要重新执行所有命令
    • 对性能影响较大,特别是使用always同步策略时

10.3 RDB与AOF对比与选择

特性RDBAOF
持久化方式快照命令日志
数据安全性较低(可能丢失数据)较高(最多丢失1秒数据)
恢复速度
文件大小
对性能影响小(仅在快照时)较大(每次写操作)

新手推荐:生产环境可开启混合持久化(Redis 4.0+支持),结合RDB和AOF的优点:

txt
# 开启混合持久化(Redis 4.0+)
aof-use-rdb-preamble yes

10.4 实操案例

案例1:配置并测试RDB持久化

  1. 修改配置文件
    txt
    # 设置RDB文件名称

dbfilename dump.rdb

设置RDB文件存储路径

dir /var/lib/redis

设置自动触发条件

save 900 1 save 300 10 save 60 10000


2. **手动触发并验证**:
```bash
# 连接Redis
redis-cli

# 设置一些测试数据
SET name "zhangsan"
SET age 25

# 手动触发BGSAVE
BGSAVE

# 查看RDB文件是否生成
ls -la /var/lib/redis/dump.rdb
  1. 测试数据恢复
    bash
    # 停止Redis服务
    sudo systemctl stop redis
    
    # 启动Redis服务
    sudo systemctl start redis
    
    # 连接Redis并验证数据
    redis-cli
    GET name  # 应该返回 "zhangsan"
    GET age   # 应该返回 "25"

案例2:配置并测试AOF持久化

  1. 修改配置文件

    txt
    # 开启AOF
    appendonly yes
    # 设置AOF文件名称
    appendfilename "appendonly.aof"
    # 设置同步频率
    appendfsync everysec
    # 设置AOF重写触发条件
    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb
  2. 验证AOF文件

    bash
    # 连接Redis并设置数据
    redis-cli
    SET foo bar
    SET counter 1
    INCR counter
    
    # 查看AOF文件内容
    cat /var/lib/redis/appendonly.aof
  3. 测试AOF重写

    bash
    # 手动触发AOF重写
    BGREWRITEAOF
    
    # 查看重写后的文件大小
    ls -lh /var/lib/redis/appendonly.aof

10.5 AOF文件修复

如果AOF文件损坏,可以使用Redis提供的修复工具:

bash
# 修复AOF文件
redis-check-aof --fix /var/lib/redis/appendonly.aof

新手易错点

  • 未开启持久化:导致服务重启后数据全部丢失
  • AOF文件过大未清理:占用过多磁盘空间,影响性能
  • 持久化配置错误:如同步频率设置不合理,导致性能问题或数据丢失
  • 混合持久化未开启:无法充分利用两种持久化方式的优点
  • 未定期备份:即使开启了持久化,也应该定期备份RDB或AOF文件

© 2026 编程马·菜鸟教程 版权所有