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数据的安全性和可靠性。

相关推荐
涂兵兵_青石疏影几秒前
绘制图像-clip方法
前端
焦糖玛奇朵婷18 分钟前
解锁扭蛋机小程序的五大优势
java·大数据·服务器·前端·小程序
SwJieJie29 分钟前
windsurf的配置和项目规则、工作流、agent技巧使用
前端
白日梦想家68137 分钟前
从基础入手,分清一次性定时器与永久定时器
前端
Lumos_77738 分钟前
Linux -- exec 进程替换
linux·运维·chrome
AIwork4me1 小时前
别再把 RAG 当知识库:用 AutoClaw 搭一套会进化的 Karpathy LLM Wiki
前端
彩票管理中心秘书长1 小时前
Git 归档与补丁命令大全(完整详解版)
前端
RePeaT1 小时前
【Nginx】前端项目部署与反向代理实战指南
前端·nginx
索木木2 小时前
ShortCut MoE模型分析
前端·html
MXN_小南学前端2 小时前
Vue3 + Spring Boot 工单系统实战:用户反馈和客服处理的完整闭环(提供gitHub仓库地址)
前端·javascript·spring boot·后端·开源·github