Redis 持久化 备份 还原

1. Redis 持久化方式

RDB (Redis Database)

快照式持久化

  • 在指定时间间隔内,将内存中的数据生成快照保存到磁盘

  • 默认文件名:dump.rdb

配置示例:

bash 复制代码
# redis.conf
save 900 1      # 900秒内有1个key变化则保存
save 300 10     # 300秒内有10个key变化则保存
save 60 10000   # 60秒内有10000个key变化则保存
dir /var/lib/redis  # RDB文件保存目录
dbfilename dump.rdb

优点:

  • 性能好,适合备份和灾难恢复

  • 恢复大数据集速度比AOF快

缺点:

  • 可能丢失最后一次保存后的数据

  • 数据集大时fork子进程可能耗时

AOF (Append Only File)

日志式持久化

  • 记录所有写操作命令

配置示例:

bash 复制代码
# redis.conf
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec  # 同步频率:always/everysec/no

重写机制:

bash 复制代码
# 自动重写配置
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

优点:

  • 数据安全性更高

  • AOF文件易读

缺点:

  • 文件体积通常比RDB大

  • 恢复速度较慢


2. 备份策略

手动备份

bash 复制代码
# 创建RDB备份
redis-cli SAVE        # 同步保存,阻塞其他命令
redis-cli BGSAVE      # 后台异步保存

# 创建AOF备份
# 只需复制当前的AOF文件即可
cp appendonly.aof /backup/appendonly-$(date +%Y%m%d).aof

自动化备份脚本

bash 复制代码
#!/bin/bash
# backup_redis.sh

BACKUP_DIR="/backup/redis"
DATE=$(date +%Y%m%d_%H%M%S)
REDIS_CLI="/usr/bin/redis-cli"

# 创建备份目录
mkdir -p $BACKUP_DIR

# 执行BGSAVE
$REDIS_CLI BGSAVE

# 等待RDB文件生成
sleep 30

# 复制RDB文件
cp /var/lib/redis/dump.rdb $BACKUP_DIR/dump_$DATE.rdb

# 如果使用AOF,也备份AOF文件
if [ -f /var/lib/redis/appendonly.aof ]; then
    cp /var/lib/redis/appendonly.aof $BACKUP_DIR/appendonly_$DATE.aof
fi

# 删除7天前的备份
find $BACKUP_DIR -name "*.rdb" -mtime +7 -delete
find $BACKUP_DIR -name "*.aof" -mtime +7 -delete

3. 还原/恢复操作

从RDB文件恢复

bash 复制代码
# 1. 停止Redis服务
sudo systemctl stop redis

# 2. 备份当前数据文件
cp /var/lib/redis/dump.rdb /var/lib/redis/dump.rdb.bak

# 3. 复制备份文件到数据目录
cp /backup/dump_backup.rdb /var/lib/redis/dump.rdb

# 4. 修改文件权限
chown redis:redis /var/lib/redis/dump.rdb

# 5. 启动Redis服务
sudo systemctl start redis

从AOF文件恢复

bash 复制代码
# 1. 停止Redis服务
sudo systemctl stop redis

# 2. 备份当前AOF文件
cp /var/lib/redis/appendonly.aof /var/lib/redis/appendonly.aof.bak

# 3. 复制备份文件
cp /backup/appendonly_backup.aof /var/lib/redis/appendonly.aof

# 4. 修改权限
chown redis:redis /var/lib/redis/appendonly.aof

# 5. 启动Redis(Redis会自动加载AOF并重放命令)
sudo systemctl start redis

数据迁移恢复

bash 复制代码
# 将数据从一台Redis迁移到另一台
# 方法1:使用redis-cli
redis-cli -h source_host -p 6379 --rdb /tmp/dump.rdb
scp /tmp/dump.rdb user@dest_host:/tmp/
ssh user@dest_host "redis-cli -h localhost -p 6379 --pipe < /tmp/dump.rdb"

# 方法2:使用redis-dump工具
redis-dump -u source_host:6379 > data.json
redis-load -u dest_host:6379 < data.json

4. 最佳实践

混合持久化配置

bash 复制代码
# redis.conf
# 同时启用RDB和AOF
save 900 1
save 300 10
save 60 10000

appendonly yes
appendfsync everysec

# AOF重写时使用RDB格式(Redis 4.0+)
aof-use-rdb-preamble yes

监控持久化状态

bash 复制代码
# 查看持久化信息
redis-cli INFO persistence

# 查看最近一次保存状态
redis-cli INFO | grep -A5 "持久化"

# 检查AOF文件状态
redis-cli INFO persistence | grep aof

灾难恢复演练脚本

bash 复制代码
#!/bin/bash
# disaster_recovery_test.sh

echo "=== Redis灾难恢复演练 ==="

# 1. 模拟数据丢失
echo "1. 清空测试数据库..."
redis-cli -n 15 FLUSHDB

# 2. 从备份恢复
echo "2. 从备份恢复数据..."
sudo systemctl stop redis
cp /backup/latest/dump.rdb /var/lib/redis/
sudo systemctl start redis

# 3. 验证数据
echo "3. 验证恢复结果..."
redis-cli DBSIZE
echo "恢复完成!"

5. 注意事项

  1. 备份前确保有足够磁盘空间

  2. 定期测试恢复流程

  3. 对于生产环境,建议:

    • RDB和AOF同时启用

    • 备份文件存放到不同物理位置

    • 使用监控工具监控持久化状态

  4. 大Key处理:

    • 避免单个Key过大影响持久化性能

    • 使用redis-cli --bigkeys分析大Key


6. 常用命令总结

bash 复制代码
# 持久化相关
BGSAVE           # 后台保存RDB
LASTSAVE         # 获取最后保存时间
BGREWRITEAOF     # 重写AOF文件

# 备份相关
redis-cli --rdb <filename>  # 导出RDB
redis-cli --pipe < <rdb-file> # 导入RDB

# 状态检查
redis-cli INFO persistence
redis-cli CONFIG GET dir

通过合理配置持久化策略和定期备份,可以确保Redis数据的安全性和可靠性。

相关推荐
卸任1 小时前
Vibe coding工具使用心得
前端·ai编程
brien92 小时前
为什么模型标称 1M,Google Antigravity 聊到 256K 却突然失忆?我们给它做了个原生行内监控圆环
前端
用户2265414712952 小时前
浏览器扩展 + CDP 调试实践:多平台文章同步的五个坑
chrome
修炼的dance2 小时前
录屏关键帧间隔多少合适?六档实测,2秒到10秒小了75.6%
前端
Lank_M2 小时前
关键帧从1秒拉到10秒,录屏小87.3%,摄像头小10.8%
前端
补码缩写2 小时前
用 ffprobe 拆录屏,八成字节在 29 个关键帧上
前端
百思不得小李2 小时前
一个复杂的动态表单是如何实现的
前端·设计模式
陈随易2 小时前
Cmder 停更 17 个月,2.0 支持 Windows Terminal
前端·后端·程序员
风骏时光牛马2 小时前
前沿视界
前端
kyriewen2 小时前
我扫了 814 个依赖,97 个还敢要 Node 10
前端·javascript·程序员