Redis持久化存储详解

一、核心持久化机制

Redis提供两种主要持久化方式:RDB(快照)AOF(追加文件),以及两者的混合模式。

RDB(Redis Database)快照持久化

工作原理

RDB通过创建数据集的二进制快照进行持久化,默认保存在dump.rdb文件中。

成功
失败
客户端请求
Redis主进程
fork子进程
子进程写入新RDB文件
主进程继续处理请求
替换旧RDB文件
配置示例(redis.conf)
# 保存策略(每15分钟至少1次修改)
save 900 1# 每5分钟至少10次修改
save 300 10# 每1分钟至少10000次修改
save 60 10000# RDB文件名
dbfilename dump.rdb# 工作目录
dir /var/lib/redis# 压缩RDB文件
rdbcompression yes# 启用CRC64校验
rdbchecksum yes
手动触发命令
# 阻塞式保存(生产环境避免使用)
127.0.0.1:6379> SAVE
OK# 后台异步保存(推荐)
127.0.0.1:6379> BGSAVE
Background saving started
RDB文件结构
+---------+---------+---------+-----+---------+
| REDIS   | RDB版本 | 数据库  | ... | EOF     |
| 魔数(5字节) | (4字节) | 内容     |     | (1字节) |
+---------+---------+---------+-----+---------+

AOF(Append Only File)日志持久化

工作原理

AOF记录所有写操作命令,以Redis协议格式保存到文件。

always
everysec
no
客户端写命令
命令执行
写入AOF缓冲区
同步策略
立即同步到磁盘
每秒同步
OS决定同步
配置示例
# 启用AOF
appendonly yes# AOF文件名
appendfilename "appendonly.aof"# 同步策略(推荐每秒)
appendfsync everysec# 重写时是否同步
no-appendfsync-on-rewrite no# 触发重写的增长百分比
auto-aof-rewrite-percentage 100# 触发重写的最小大小
auto-aof-rewrite-min-size 64mb
AOF重写过程
def bgrewriteaof():# 1. 创建子进程child_pid = fork()if child_pid == 0:  # 子进程# 2. 创建临时AOF文件temp_file = create_temp_aof()# 3. 遍历数据库,写入当前状态for db in databases:for key in db:write_command(temp_file, "SET", key, db[key])# 4. 将重写期间的新命令追加到文件append_rewrite_buffer(temp_file)# 5. 原子替换旧AOF文件rename(temp_file, "appendonly.aof")exit(0)else:  # 主进程# 记录重写开始时间start_time = time.now()# 继续处理客户端请求while True:# 处理请求...# 将新命令写入AOF缓冲区和重写缓冲区write_to_buffers(new_command)
AOF文件修复
# 修复损坏的AOF文件
$ redis-check-aof --fix appendonly.aof# 修复前的备份
0x0000: *2 $6 SELECT $1 0
0x0013: *3 $3 set $4 name $5 Alice
0x002b: *3 $3 set $4 age $2 30  # 损坏行# 修复后
0x0000: *2 $6 SELECT $1 0
0x0013: *3 $3 set $4 name $5 Alice
# 损坏行被移除

混合持久化(Redis 4.0+)

配置
aof-use-rdb-preamble yes
文件结构
+---------+---------+---------+-----+---------+
| RDB     | AOF     | AOF     | ... | AOF     |
| 数据快照 | 追加命令1 | 追加命令2 |     | 追加命令N |
+---------+---------+---------+-----+---------+

二、持久化操作与监控

命令行操作

# 查看持久化状态
127.0.0.1:6379> INFO PERSISTENCE
# Output:
# aof_enabled:1
# aof_rewrite_in_progress:0
# rdb_last_bgsave_status:ok# 手动触发AOF重写
127.0.0.1:6379> BGREWRITEAOF
Background append only file rewriting started# 获取当前配置
127.0.0.1:6379> CONFIG GET *append*
1) "appendonly"
2) "yes"
3) "appendfsync"
4) "everysec"

持久化监控脚本

import redis
import timedef monitor_persistence(r):while True:info = r.info('persistence')# 检查RDB状态rdb_status = "OK" if info['rdb_last_bgsave_status'] == 'ok' else "ERROR"print(f"RDB Status: {rdb_status}, Last save: {info['rdb_last_save_time']}")# 检查AOF状态aof_status = "OK" if info['aof_last_bgrewrite_status'] == 'ok' else "ERROR"print(f"AOF Status: {aof_status}, Size: {info['aof_current_size']/1024/1024:.2f}MB")# 检查重写状态if info['aof_rewrite_in_progress']:print(f"AOF rewrite in progress: {info['aof_rewrite_buffer_length']} commands buffered")time.sleep(60)if __name__ == "__main__":r = redis.Redis(host='localhost', port=6379)monitor_persistence(r)

三、数据恢复流程

恢复优先级

启动Redis
是否存在AOF文件?
加载AOF文件
是否存在RDB文件?
加载RDB文件
启动空实例

恢复操作步骤

# 1. 停止Redis服务
$ redis-cli shutdown# 2. 备份当前数据文件
$ cp /var/lib/redis/dump.rdb /backup/dump-$(date +%F).rdb
$ cp /var/lib/redis/appendonly.aof /backup/appendonly-$(date +%F).aof# 3. 恢复RDB文件
$ mv /backup/dump-restore.rdb /var/lib/redis/dump.rdb# 4. 恢复AOF文件(可选)
$ mv /backup/appendonly-restore.aof /var/lib/redis/appendonly.aof# 5. 修改文件权限
$ chown redis:redis /var/lib/redis/*# 6. 启动Redis
$ systemctl start redis-server# 7. 验证数据
$ redis-cli DBSIZE
(integer) 123456  # 预期的键数量

四、性能优化与故障处理

性能优化策略

  1. RDB优化

    # 禁用不必要的保存规则
    save ""# 使用现代Linux系统(优化fork性能)
    # 配置大页内存
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
    
  2. AOF优化

    # 使用everysec策略(默认)
    appendfsync everysec# 增加重写缓冲区大小
    aof-rewrite-buffer-size 128mb# 使用SSD存储
    dir /ssd/redis-data
    

常见故障处理

1. OOM(内存不足)错误

场景:执行BGSAVE时因fork失败导致

Can't save in background: fork: Cannot allocate memory

解决方案

# 检查系统配置
$ sysctl vm.overcommit_memory
vm.overcommit_memory = 1  # 应设置为1# 增加交换空间
$ sudo fallocate -l 4G /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile# 减少Redis最大内存
127.0.0.1:6379> CONFIG SET maxmemory 8gb
2. AOF文件损坏

症状:Redis启动失败,日志报"AOF is not valid"

修复步骤

# 1. 创建备份
$ cp appendonly.aof appendonly.bak# 2. 修复文件
$ redis-check-aof --fix appendonly.aof# 3. 验证修复后文件
$ head -n 20 appendonly.aof
*2
$6
SELECT
$1
0
*3
$3
SET
...
3. RDB生成缓慢

优化方案

# 降低保存频率
save 3600 1    # 1小时内至少1次修改
save 86400 10  # 1天内至少10次修改# 禁用压缩(CPU紧张时)
rdbcompression no# 使用外部工具并行压缩
rdbcompression no

五、生产环境最佳实践

部署架构

同步
同步
持久化
持久化
持久化
主节点
从节点1
从节点2
本地SSD
网络存储
对象存储
监控系统

配置推荐

# 混合持久化配置
appendonly yes
aof-use-rdb-preamble yes
appendfsync everysec# RDB配置
save 3600 1     # 每小时保存
save 86400 10   # 每天保存
rdbcompression yes# 内存管理
maxmemory 16gb
maxmemory-policy volatile-lru# 安全配置
requirepass "StrongPassword123!"
rename-command FLUSHDB ""

备份策略

# 每日全量备份
0 2 * * * redis-cli BGSAVE && cp /var/lib/redis/dump.rdb /backup/dump-$(date +\%F).rdb# 每小时AOF备份
0 * * * * cp /var/lib/redis/appendonly.aof /backup/aof/appendonly-$(date +\%H).aof# 异地备份
0 3 * * * aws s3 cp /backup/dump-$(date +\%F).rdb s3://redis-backup/

灾难恢复测试

import redis
import subprocessdef disaster_recovery_test():# 1. 创建测试数据r = redis.Redis(password='StrongPassword123!')for i in range(10000):r.set(f'key:{i}', f'value-{i}')# 2. 模拟故障r.shutdown()# 3. 恢复最新备份subprocess.run(['cp', '/backup/latest.rdb', '/var/lib/redis/dump.rdb'])subprocess.run(['systemctl', 'start', 'redis-server'])# 4. 验证数据recovered = redis.Redis(password='StrongPassword123!')assert recovered.dbsize() == 10000print("Disaster recovery test passed!")if __name__ == "__main__":disaster_recovery_test()

六、总结与选择指南

持久化方案选择矩阵

需求推荐方案配置要点
最大化性能RDBsave "", rdbcompression no
最小化数据丢失AOF(always) + 混合持久化appendfsync always, aof-use-rdb-preamble yes
快速重启恢复混合持久化aof-use-rdb-preamble yes, rdbcompression yes
有限磁盘空间RDB调整save间隔,增加压缩比
大数据集(>10GB)RDB + 副本增加repl-backlog-size, 优化fork性能

关键决策因素

  1. 数据重要性:金融数据使用AOF(always),缓存数据使用RDB
  2. 恢复时间目标(RTO):RDB恢复更快,适合大型数据集
  3. 恢复点目标(RPO):AOF提供秒级数据保护
  4. 系统资源:内存充足时使用混合模式,CPU受限时使用RDB
  5. 运维复杂性:AOF需要更多监控和管理

通过合理配置RDB和AOF,结合混合持久化模式,Redis可以在各种场景下实现性能与数据安全的最佳平衡。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/92181.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/92181.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/92181.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python学智能算法(三十四)|SVM-KKT条件回顾

【1】引言 前序学习进程中,对软边界拉格朗日方程进行了初步构建。 其中约定了两个拉格朗日乘子要非负,其本质是要满足KKT条件。 今天就乘此次机会,在回顾一下KKT条件。 【2】定义 当问题无约束的时候,只要让函数梯度为零&#…

【网络基础】计算机网络发展背景及传输数据过程介绍

本文旨在帮助初学者建立起计算机网络的基础认知,从网络的发展背景到网络协议的分层模型,再到IP与MAC地址的基本概念,全面覆盖第一阶段学习重点。 📌 本节重点 了解计算机网络的发展背景,掌握局域网(LAN&am…

阿里云-通义灵码:解锁云原生智能开发新能力,让云开发更“灵”~

免责声明:此篇文章所有内容皆是本人实验,并非广告推广,并非抄袭,如有侵权,请联系笔者。 每日一句 信念其实就是相信未来, 相信内在, 以及坦然美好的心境。 目录 每日一句 一. 引言 二.通义…

lesson33:Python协程详解:从原理到实战的异步编程指南

目录 一、协程核心概念:轻量级并发的本质 1.1 什么是协程? 1.2 协程与线程/进程的对比 二、协程工作原理:事件循环与协作式调度 2.1 事件循环(Event Loop):协程的"调度中心" 2.2 协作式调度…

深入理解C++模板进阶:非类型参数、特化与分离编译

前言C模板是泛型编程的核心,它允许我们编写与类型无关的代码。在掌握了模板的基础知识后,我们需要进一步了解模板的高级特性,以便更灵活地使用它们。本文将深入探讨三个重要的模板进阶主题:非类型模板参数、模板特化以及模板的分离…

使用winsw把SpringBoot项目注册成window服务

目录 一、使用winsw注册 1.1、项目打jar包 1.2、下载winsw 1.3、把 WinSW.NET4.exe 重新命名 1.4、编写m配置文件用于配置注册信息 1.5、创建文件夹存放你的文件 1.6、安装服务 1.7、启动服务 1.8、卸载服务 1.8、停止服务 一、使用winsw注册 1.1、项目打jar包 例如项目jar包名…

进阶向:Python开发简易QQ聊天机器人

数字化时代的聊天机器人应用在当今数字化时代,聊天机器人已经成为日常生活和商业活动中不可或缺的一部分。根据市场研究数据显示,全球聊天机器人市场规模预计将在2026年达到102亿美元,年复合增长率达到34.75%。这些智能助手正广泛应用于以下场…

基于开源链动2+1模式AI智能名片S2B2C商城小程序的用户留存策略研究

摘要:在数字化商业竞争白热化的当下,用户留存成为企业可持续发展的核心命题。本文聚焦开源链动21模式AI智能名片S2B2C商城小程序这一创新技术组合,通过分析其技术架构、模式创新与生态闭环的协同效应,揭示其在降低用户决策成本、提…

单词的划分(动态规划)

题目描述有一个很长的由小写字母组成字符串。为了便于对这个字符串进行分析,需要将它划分成若干个部分,每个部分称为一个单词。出于减少分析量的目的,我们希望划分出的单词数越少越好。你就是来完成这一划分工作的。输入第一行,一…

C语言学习笔记——文件

目录1 文件的概念2 程序文件和数据文件3 二进制文件和文本文件4 流4.1 流的概念4.2 标准流5 文件信息区和文件指针6 处理文件的库函数6.1 fopen6.2 fclose6.3 fgetc6.4 fputc6.5 fgets6.6 fputs6.7 fscanf6.8 fprintf6.9 fread6.10 fwrite6.11 fseek6.12 ftell6.13 rewind6.14 …

C++语法与面向对象特性(2)

一.inline函数1.inline的基本特性被inline修饰的函数被称为内联函数。inline函数设计的初衷是为了优化宏的功能,编译器会在编译阶段对inline函数进行展开。然而需要注意的是,inline对于编译器而言是一种建议,它通常会展开一些简短的&#xff…

Linux中grep命令

Linux 中的 grep 用法详解grep 是 Linux 中强大的文本搜索工具,用于在文件或输入流中查找匹配指定模式的行。其基本语法为:grep [选项] "模式" [文件]核心功能基础搜索在文件中查找包含特定字符串的行:grep "error" log.…

【遥感图像入门】遥感中的“景”是什么意思?

在遥感成像中,“3景城市影像”和“5景城市影像”中的“景”是遥感数据的基本单位,通常指一次成像过程中获取的独立遥感影像块。这一概念的具体含义需结合技术背景和应用场景理解: 一、“景”的技术定义 单次成像的独立覆盖区域 遥感平台(如卫星、飞机)在特定时间和位置对…

Pytorch-07 如何快速把已经有的视觉模型权重扒拉过来为己所用

下载,保存,加载,使用模型权重 在这一节里面我们会过一遍对模型权重的常用操作,比如: 如何下载常用模型的预训练权重如何下载常用模型的无训练权重(只下载网络结构)如何加载模型权重如何保存权…

C语言零基础第9讲:指针基础

目录 1.内存和地址 2.指针变量和地址 2.1 取地址操作符(&) 2.2 指针变量 2.3 解引用操作符(*) 2.4 指针变量的大小 3.指针变量类型的意义 3.1 指针的解引用 3.2 指针 - 整数 3.3 void*指针 4.指针运算 4.1 指针…

013 HTTP篇

3.1 HTTP常见面试题 1、HTTP基本概念: 超文本传输协议:在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据的「约定和规范」HTTP常见的状态码 [[Pasted image 20250705140705.png]]HTTP常见字段 Host 字段:客户…

每日面试题20:spring和spring boot的区别

我曾经写过一道面试题,题目是为什么springboot项目可以直接打包给别人运行?其实这涉及到的就是springboot的特点。今天来简单了解一下springboot和spring的区别, Spring 与 Spring Boot:从“全能框架”到“开箱即用”的进化之路 …

ClickHouse数据迁移

ClickHouse实例是阿里云上的云实例,想同步数据到本地,本地部署有ClickHouse实例,下面为单库单表 源实例:阿里云cc-gs5xxxxxxx.public.clickhouse.ads.aliyuncs.com:8123 目标实例:本地172.16.22.10:8123 1、目标实例建…

sqli-labs-master/Less-41~Less-50

Less-41这一关还是用堆叠注入,这关数字型不需要闭合了。用堆叠的话,我们就不爆信息了。我们直接用堆叠,往进去写一条数据?id-1 union select 1,2,3;insert into users (id,username,password) values(666,zk,180)--看一下插进去了没?id-1 u…

Tiger任务管理系统-10

十是个很好美好的数字,十全十美,确实没让人失望,收获还是很大的。 温习了前端知识,巩固了jQuery,thymeleaf等被忽视的框架,意外将之前的所学所用的知识都连起来了,感觉有点像打通了任督二脉一样…