目录

一、RDB持久化机制

1.1 RDB概述

1.2 RDB触发机制

1) 手动执行save命令

2) 手动执行bgsave命令

3) Redis正常关闭时

4) 自动触发条件满足时

1.3 RDB详细配置

1.4 RDB实现原理

1.5 RDB的优缺点分析

二、AOF持久化机制

2.1 AOF概述

2.2 AOF工作流程

2.3 AOF同步策略

2.4 AOF重写机制

手动触发重写:

自动触发条件:

2.5 AOF进阶配置

三、RDB与AOF对比与选型

3.1 核心差异对比

3.2 生产环境建议

四、性能优化与最佳实践

4.1 持久化性能优化

4.2 运维实践

4.3 特殊场景处理

五、总结与展望


Redis作为高性能的内存数据库,其持久化机制是保证数据安全性的关键。本文将深入探讨Redis的两种持久化方案:RDB和AOF,从原理到配置,从使用场景到优缺点对比,为您提供全面的技术解析。

一、RDB持久化机制

1.1 RDB概述

RDB(Redis Database Backup file)是Redis默认的持久化方式,它通过创建数据快照的方式,将内存中的所有数据以二进制格式保存到磁盘中。当Redis实例需要恢复时,可以直接读取RDB文件快速重建数据库状态。

RDB文件是一个经过压缩的二进制文件,其默认文件名为"dump.rdb",保存在Redis服务器的当前运行目录下。这种持久化方式特别适合用于备份、灾难恢复以及快速重启场景。

1.2 RDB触发机制

RDB持久化主要在以下四种情况下会被触发:

1) 手动执行save命令

save

save命令会立即阻塞式地执行RDB持久化操作,期间Redis将停止处理所有客户端请求,直到RDB文件创建完成。这种方式的优势是能够确保数据一致性,但会对服务可用性造成显著影响,因此仅建议在数据迁移或维护时段使用。

2) 手动执行bgsave命令

bgsave

bgsave(background save)是save的异步版本,Redis会fork出一个子进程来执行持久化操作,主进程继续正常处理请求。这是生产环境中最常用的RDB创建方式。

3) Redis正常关闭时

当通过SHUTDOWN命令正常关闭Redis服务时,Redis会自动执行一次save操作,确保关机前的数据不会丢失。

4) 自动触发条件满足时

在redis.conf配置文件中可以设置自动触发RDB的条件,默认配置如下:

save 900 1     # 900秒(15分钟)内至少有1个key发生变化
save 300 10    # 300秒(5分钟)内至少有10个key发生变化
save 60 10000  # 60秒内至少有10000个key发生变化

这些条件满足任意一个时,Redis会自动执行bgsave操作。如需禁用RDB,可以配置save ""

1.3 RDB详细配置

在redis.conf中,与RDB相关的重要配置项包括:

# RDB文件名称
dbfilename dump.rdb# 工作目录,RDB和AOF文件都会存储在此
dir /var/lib/redis# 是否启用压缩
rdbcompression yes# 是否进行RDB文件校验
rdbchecksum yes# 当bgsave失败时是否停止写入
stop-writes-on-bgsave-error yes

关于压缩选项的说明:虽然压缩会消耗额外的CPU资源,但在网络传输或磁盘空间受限的场景下,开启压缩(默认值)通常更为有利。现代服务器CPU通常足够强大,而磁盘I/O往往是更稀缺的资源。

1.4 RDB实现原理

bgsave的核心机制依赖于Linux的fork()系统调用和写时复制(Copy-On-Write)技术:

  1. fork阶段:主进程调用fork()创建子进程,此时父子进程共享相同的内存页

  2. 数据写入阶段

    • 子进程遍历内存中的所有数据,将其序列化写入临时RDB文件

    • 主进程继续正常处理请求,对于写操作,内核会将被修改的内存页复制一份供主进程使用

  3. 替换阶段:子进程完成写入后,用新的RDB文件原子替换旧文件

这种机制的优势在于:

  • 子进程几乎不需要复制内存数据(得益于COW)

  • 主进程仅在写入时会有少量性能开销

  • 整个过程中Redis服务基本保持可用

1.5 RDB的优缺点分析

优势

  • 性能影响小:bgsave方式对服务影响极小

  • 恢复速度快:二进制格式加载效率极高

  • 文件紧凑:适合备份和传输

  • 单文件管理:便于维护和迁移

局限性

  • 数据安全性较低:两次RDB之间的数据可能丢失

  • fork可能阻塞:大数据量时fork操作可能耗时

  • 版本兼容性:不同Redis版本的RDB格式可能有差异

二、AOF持久化机制

2.1 AOF概述

AOF(Append Only File)以日志形式记录每个写操作命令,通过重新执行这些命令来恢复数据。与RDB的"快照"思维不同,AOF采用"操作日志"的方式,提供了更好的持久性保证。

AOF默认处于关闭状态,需要通过修改redis.conf来启用:

appendonly yes
appendfilename "appendonly.aof"

2.2 AOF工作流程

AOF的工作流程可以分为以下几个步骤:

  1. 命令传播:客户端发送写命令到Redis服务器

  2. 命令执行:服务器执行命令并将变更应用到内存

  3. 命令追加:将命令以Redis协议格式追加到AOF缓冲区

  4. 文件同步:根据配置策略将缓冲区内容写入磁盘

2.3 AOF同步策略

Redis提供了三种不同的同步策略,通过appendfsync参数配置:

策略机制说明优点缺点
always每个写命令都立即同步到磁盘数据安全性最高性能影响严重(约降低至几百TPS)
everysec每秒同步一次(默认值)平衡安全性与性能可能丢失1秒数据
no由操作系统决定同步时机(通常每30秒)性能最好可能丢失较多数据

生产环境中,everysec通常是理想的选择,它在保证较好性能的同时,将数据丢失窗口控制在1秒内。

2.4 AOF重写机制

随着运行时间增长,AOF文件会不断膨胀,例如:

  • 对同一key的多次操作只有最后一次有效

  • 已过期的数据仍然占空间

  • 冗余的命令可以合并

Redis提供了AOF重写(rewrite)机制来优化:

手动触发重写:
BGREWRITEAOF
自动触发条件:
auto-aof-rewrite-percentage 100  # 当前AOF文件比上次重写后体积增大100%
auto-aof-rewrite-min-size 64mb   # AOF文件至少达到64MB才会重写

重写原理

  1. fork子进程扫描当前数据库状态

  2. 根据内存数据生成最小命令集

  3. 将新命令写入临时文件

  4. 完成后替换旧AOF文件

示例优化
原始AOF可能包含:

SET counter 1
INCR counter
INCR counter
DEL counter
SET counter 5

重写后简化为:

SET counter 5

2.5 AOF进阶配置

# 开启AOF-RDB混合持久化(Redis 4.0+)
aof-use-rdb-preamble yes# AOF重写期间是否同步
no-appendfsync-on-rewrite no# 加载AOF时发现错误是否继续
aof-load-truncated yes

混合持久化是Redis 4.0引入的重要特性,重写后的AOF文件包含两部分:

  1. RDB格式的全量数据

  2. 增量AOF日志

这种组合既保证了重写效率,又保留了AOF的实时性优势。

三、RDB与AOF对比与选型

3.1 核心差异对比

特性RDBAOF
持久化方式定时快照实时命令日志
数据安全性可能丢失最后一次快照后的数据根据配置可做到基本不丢失
恢复速度
磁盘占用
对性能影响较小(bgsave)较大(取决于同步策略)
适用场景备份、灾难恢复高数据安全性要求

3.2 生产环境建议

  1. 综合使用:建议同时开启RDB和AOF,利用各自的优势

    • RDB用于定期备份和快速恢复

    • AOF确保数据安全性

  2. 关键配置

    save 300 10            # 适当减少RDB频率
    appendonly yes         # 开启AOF
    appendfsync everysec   # 平衡性能与安全
    aof-use-rdb-preamble yes # 启用混合持久化
  3. 监控指标

    • 持久化延迟:监控rdb_last_bgsave_statusaof_last_bgrewrite_status

    • fork耗时:关注latest_fork_usec指标

    • AOF增长:定期检查AOF文件大小

  4. 灾难恢复

    • 定期将RDB和AOF文件备份到异地

    • 测试恢复流程,确保备份文件有效

四、性能优化与最佳实践

4.1 持久化性能优化

  1. 内存控制:单实例内存建议不超过10GB,过大内存会导致fork耗时增加

  2. 磁盘选择:使用SSD硬盘提升I/O性能

  3. 系统配置

    • 设置vm.overcommit_memory=1避免bgsave失败

    • 禁用透明大页(THP):echo never > /sys/kernel/mm/transparent_hugepage/enabled

  4. 监控fork时间info stats中的latest_fork_usec指标

4.2 运维实践

  1. 备份策略

    • 每小时备份RDB文件

    • 每天将备份文件传输到异地

  2. 恢复测试

    redis-check-rdb dump.rdb
    redis-check-aof appendonly.aof
  3. 版本升级:注意不同版本的RDB/AOF格式兼容性

4.3 特殊场景处理

  1. 大key问题

    • 避免单个key过大(如超过1MB)

    • 对大key进行拆分

  2. 多实例部署

    • 为每个实例配置独立的工作目录

    • 错开持久化时间点

  3. 云环境适配

    • 利用云厂商的持久化托管服务

    • 注意云磁盘的性能特性

五、总结

Redis的持久化机制是其作为内存数据库却能够保证数据安全性的关键。RDB提供了高效的快照能力,而AOF则确保了操作的持久性。在实际生产环境中,两者结合使用往往能够取得最佳效果。

随着Redis的发展,持久化机制也在不断进化:

  • Redis 4.0引入的混合持久化结合了两者优势

  • Redis 6.0对持久化进行了多线程优化

  • 未来版本可能会进一步降低持久化对性能的影响

理解这些持久化机制的原理和特性,有助于我们根据业务需求做出合理的架构决策,在性能和数据安全性之间找到最佳平衡点。

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

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

相关文章

介绍一下jQuery的AJAX异步请求

目录 一、核心方法:$.ajax() 二、简化方法(常用场景) 1. $.get():快速发送 GET 请求(获取数据) 2. $.post():快速发送 POST 请求(提交数据) 3. $.getJSON()&#xf…

Win10系统Ruby+Devkit3.4.5-1安装

Win10系统RubyDevkit3.4.5-1安装安装步骤软件工具安装Ruby安装gem mysql2处理libmysql.dll验证mysql2安装步骤 软件工具 mysql-connector-c-6.1.11-winx64.zip rubyinstaller-devkit-3.4.5-1-x64.exe 安装Ruby 执行rubyinstaller-devkit-3.4.5-1-x64.exe,期间可…

社交工程:洞穿人心防线的无形之矛

在网络安全领域,一道无形的裂痕正在迅速蔓延。它不是复杂的零日漏洞,也不是精妙的恶意代码,而是利用人性弱点进行攻击的古老技艺——社交工程。当全球网络安全支出突破千亿美元大关,防火墙筑得越来越高,加密算法越来越…

Go 并发控制利器 ants 使用文档

https://github.com/panjf2000/ants1.1 什么是 ants ants 是一个高性能的 Go 语言 goroutine 池,它能复用已完成任务的 goroutine,避免频繁创建和销毁 goroutine,节省 CPU 与内存开销,并且能限制并发数量防止资源被耗尽。 1.2 安装…

Day57--图论--53. 寻宝(卡码网)

Day57–图论–53. 寻宝(卡码网) 今天学习:最小生成树。有两种算法(Prim和Kruskal)和一道例题。 prim 算法是维护节点的集合,而 Kruskal 是维护边的集合。 最小生成树:所有节点的最小连通子图&am…

解决海洋探测数据同步网络问题的新思路——基于智能组网技术的探索

随着海洋探测技术的不断发展,数据同步网络的稳定性和低延迟需求变得愈发重要。海洋探测数据来自多个分布式采集点,这些点需要高效的组网方式来实现实时数据传输。然而,由于海洋环境的特殊性(如复杂的网络拓扑、高湿度和极端温度&a…

设计模式笔记_行为型_责任链模式

1. 责任链模式介绍责任链模式(Chain of Responsibility)是一种行为设计模式,它允许将多个处理器(处理对象)连接成一条链,并沿着这条链传递请求,直到有一个处理器处理它为止。职责链模式的主要目…

pygame的帧处理中,涉及键盘的有`pg.event.get()`与`pg.key.get_pressed()` ,二者有什么区别与联系?

一、pg.event.get() 返回的是一组事件 pg.event.get() 返回的是一组事件(一个包含多个事件对象的列表)。这是因为在游戏的“一帧”时间内(通常1/60秒左右),用户可能会触发多个事件(比如同时按下多个键、快速…

TF - IDF算法面试与工作常见问题全解析

在自然语言处理领域,TF - IDF算法是一个基础且重要的概念。无论是在求职面试还是在实际工作中,都经常会遇到与TF - IDF相关的问题。以下是一些常见的问题及其详细解答: 一、基本概念类问题 1. 什么是TF - IDF算法? TF - IDF&#…

Transformer网络结构解析

博主会经常分享自己在人工智能阶段的学习笔记,欢迎大家访问我滴个人博客!(都不白来!) 小牛壮士 - 个人博客https://kukudelin.top/ 前言 Transformer 广泛应用于自然语言处理(如机器翻译、文本生成&…

gateway进行接口日志打印

打印需求:对所有的接口打印:请求方式,请求路径,请求参数,用户id,访问IP,访问时间对增删改操作的接口打印:接口响应打印方案:给GET设置一个白名单(因为get请求…

MATLAB实现图像增强(直方图均衡化)

直方图均衡化是一种常用的图像增强技术,它通过重新分布图像的像素强度值来增强图像的对比度。以下是MATLAB中实现直方图均衡化的详细方法。%% 直方图均衡变换 clc;close all;clear all;warning off;%清除变量 rand(seed, 100); randn(seed, 100); format long g;%% …

java15学习笔记-密封类

360:Sealed Classes (Preview) 封闭类(预览) 总结 使用密封类和接口增强Java编程语言。密封类和接口限制了哪些其他类或接口可以扩展或实现它们。这是JDK 15中的预览语言功能。 目标 允许类或接口的作者控制负责实现它的代码。 提供一种比访问…

西门子PLC通过稳联技术EtherCAT转Profinet网关连接baumuller伺服器的配置案例

西门子PLC用稳联技术的EtherCAT转Profinet网关,连上baumuller伺服器的配置例子本案例实现西门子S71200 PLC通过EtherCAT转Profinet网关对baumuller(Baumller)伺服器的实时控制,适用于高精度运动控制场景(如精密机床、自…

Ansible 详细笔记

Ansible 详细笔记 一、Ansible 基础概述 1.1 定义与定位 Ansible 是由 Red Hat 主导开发的开源自动化运维工具,基于 Python 语言实现,专注于简化 IT 基础设施的配置管理、应用部署、任务编排等操作。它采用无代理架构,通过 SSH 协议与被控节点…

【Java 后端】Spring Boot 集成 JPA 全攻略

Spring Boot 集成 JPA 全攻略 一、前言 在 Java Web 开发中,数据库访问是绕不开的话题。 传统方式使用 JDBC 编写 SQL,维护困难、可读性差。后来有了 MyBatis 这种半自动 ORM 框架,再到 JPA(Java Persistence API)这…

pytorch学习笔记-加载现有的网络模型(VGG16)、增加/修改其中的网络层(修改为10分类)

写在前面:有些地方和视频里不一样的是因为官方文档更新了,一些参数用法不一样也很正常,包括我现在的也是我这个时间节点最新的,谁知道过段时间会不会更新呢 建议大家不要一味看视频/博客,多看看官方文档才是正道&#…

RocketMQ 4.9.3源码解读-NameServer组件启动流程分析

作者源码阅读笔记主要采用金山云文档记录的,所有的交互图和代码阅读笔记都是记录在云文档里面,本平台的文档编辑实在不方便,会导致我梳理的交互图和文档失去原来的格式,所以整理在文档里面,供大家阅读交流 【金山文档 | WPS云文档】 namesrv 启动流程 相关重要类介绍说明…

《嵌入式 C 语言编码规范与工程实践个人笔记》参考华为C语言规范标准

《嵌入式 C 语言编码规范与工程实践个人笔记》参考华为C语言规范标准 前言 在电子系统开发领域,C 语言作为底层开发的核心语言,其代码质量直接关系到系统的稳定性、可维护性和扩展性。良好的编码规范不仅是团队协作的基础,更是降低生命周期成…

纯半精度模型和全精度模型的耗时分别为248微秒和1400微秒。混合精度模型371微秒比原始模型快大约四倍!

不过有一点需要注意:在上下文管理器内部生成的任何输出,必然会采用该上下文管理器的数据类型。因此,之后我们必须将这些输出转换回FP32(例如,使用float()函数)。 with torch.autocast(device_type="cuda", dtype=torch.float16): res16 = mixed32(torch.randn…