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

相关推荐
问道飞鱼几秒前
【前端知识】React生态你了解多少?
前端·react.js·前端框架·生态
Pu_Nine_9几秒前
前端SSE(Server-Sent Events)实现详解:从原理到前端AI对话应用
前端·langchain·sse·ai对话
optimistic_chen10 分钟前
【Vue3入门】Pinia 状态管理 和 ElementPlus组件库
前端·javascript·vue.js·elementui·pinia·组件
酉鬼女又兒13 分钟前
零基础入门前端JavaScript 核心语法:var/let/const、箭头函数与 setTimeout 循环陷阱全解析(可用于备赛蓝桥杯Web应用开发)
开发语言·前端·javascript·蓝桥杯
Bling_Bling_117 分钟前
【无标题】
前端·网络协议
We་ct18 分钟前
React Diff & Key 核心解析
开发语言·前端·javascript·react.js·前端框架·reactjs·diff
哥本哈士奇19 分钟前
Vue 3 快速入门:从零搭建前后端 CRUD 应用
前端·javascript·vue.js
biubiubiu070620 分钟前
Agent 是如何拥有“手脚”的(ReAct 运行流程)
开发语言·前端·javascript
摸鱼的春哥23 分钟前
Agent教程21:知识图谱🕸,让AI🤖学会联想
前端·javascript·后端
SuperEugene23 分钟前
Vue3 组件拆分实战规范:页面 / 业务 / 基础组件边界清晰化,高内聚低耦合落地指南|Vue 组件与模板规范篇
前端·javascript·vue.js·前端框架