redis数据结构-11(了解 Redis 持久性选项:RDB 和 AOF)

了解 Redis 持久性选项:RDB 和 AOF

Redis 提供了多个持久性选项,以确保数据持久性并防止在服务器发生故障或重启时丢失数据。了解这些选项对于为您的特定使用案例选择正确的策略、平衡性能和数据安全至关重要。本章节将深入探讨 Redis 中的两种主要持久性机制:Redis 数据库 (RDB) 快照和仅附加文件 (AOF)。我们将探讨它们的工作原理、优点和缺点以及如何配置它们。

了解 RDB 快照

RDB(Redis 数据库)持久性按指定的时间间隔执行数据集的时间点快照。这些快照表示 Redis 数据库在特定时刻的整个状态。

RDB 的工作原理

当指示 Redis 创建 RDB 快照时,它会执行以下步骤:

  1. **分 叉:**Redis 使用 fork() 系统调用创建子进程。此子进程是父进程(Redis 服务器)的精确副本。
  2. 数据转储: 然后,子进程遍历内存中的整个数据集,并将其写入磁盘上的临时文件。
  3. 文件压缩(可选): 默认情况下,Redis 使用 LZF 压缩来压缩 RDB 文件以减小其大小。这可以进行配置。
  4. 原子替换: 子进程完成 RDB 文件的写入后,它会以原子方式将旧的 RDB 文件(如果存在)替换为新的 RDB 文件。这可确保 RDB 文件始终处于一致状态。
  5. 子进程终止: 然后,子进程将退出,从而释放系统资源。

在整个过程中,父进程继续为客户端请求提供服务,从而最大限度地减少停机时间。但是,fork() 作可能会占用大量资源,尤其是对于大型数据集,因为它暂时需要双倍的内存。

配置 RDB 快照

您可以使用 redis.conf 文件中的 save 指令配置 RDB 快照。save 指令采用两个参数:秒数和在这些秒内必须发生的更改数才能触发快照。

例如:

save 900 1       # Save the DB if at least 1 key changed in 900 seconds
save 300 10      # Save the DB if at least 10 keys changed in 300 seconds
save 60 10000    # Save the DB if at least 10000 keys changed in 60 seconds

redis.conf 中的这些行定义了三个不同的保存点。如果满足_这些条件中的任何一个_ ,Redis 将触发 RDB 快照。您可以通过注释掉所有保存行来完全禁用 RDB 快照。

您还可以使用 redis-cli 中的 SAVEBGSAVE 命令手动触发 RDB 快照。

  • SAVE: 此命令执行同步保存,阻止 Redis 服务器,直到快照完成。通常不建议将其用于生产环境。
  • BGSAVE: 此命令使用上述相同的分叉机制执行异步保存。它允许 Redis 服务器在创建快照时继续为客户端请求提供服务。

RDB 的优势

  • **压 实 度:**RDB 文件非常紧凑,非常适合用于备份和灾难恢复。
  • **性能:**RDB 快照的创建(尤其是压缩)和还原速度相对较快。
  • **灾难恢复:**RDB 非常适合灾难恢复,因为单个文件代表整个数据集。
  • **数据可移植性:**RDB 文件易于移植,可以传输到其他服务器或存档以进行长期存储。

RDB 的缺点

  • **数据丢失可能性:**RDB 快照是时间点备份,因此在快照之间写入的任何数据在服务器发生故障时都将丢失。可能的数据丢失量取决于配置的存储间隔。
  • 分叉开销:fork() 作可能会占用大量资源,尤其是对于大型数据集,这可能会导致暂时的性能下降。

RDB 配置选项

除了 save 指令之外,redis.conf 中其他与 RDB 相关的配置选项还包括:

  • stop-writes-on-bgsave-error:如果设置为 yes(默认值),则当 BGSAVE 命令失败时,Redis 将停止接受写入作。这可以防止在出现磁盘错误或磁盘空间不足时损坏数据。
  • rdbcompression:如果设置为 yes(默认值),Redis 将使用 LZF 压缩 RDB 文件。将其设置为 no 可以提高 CPU 性能,但会导致 RDB 文件变大。
  • rdbchecksum:如果设置为 yes(默认值),Redis 将在 RDB 文件中包含一个校验和,以检测数据损坏。将其设置为 no 可以提高性能,但会降低数据完整性。
  • dbfilename:指定 RDB 文件的名称(默认值:dump.rdb)。
  • dir:指定 RDB 文件的存储目录(默认:Redis 工作目录)。

了解 AOF(仅追加文件)

AOF(仅附加文件)持久性为 RDB 快照提供了更持久的替代方案。AOF 不会定期拍摄快照,而是记录服务器收到的每个写入作。

AOF 的工作原理

启用 AOF 后,Redis 会将每个写入作(例如 SETHSET、``LPUSH) 附加到 AOF 文件中。此文件实质上包含对数据库执行的所有写入作的完整历史记录。

  1. 命令附加: 每次执行写入作时,Redis 都会将相应的命令附加到 AOF 文件中。该命令以 Redis 协议格式编写。
  2. **文件同步:**AOF 文件会定期同步到磁盘,以保证数据的持久性。此同步的频率是可配置的。
  3. AOF 重写: 随着时间的推移,AOF 文件可能会变得非常大,因为它包含所有写入作的历史记录。为了减小文件大小,Redis 可以执行 AOF 重写。AOF 重写会创建一个新的、更小的 AOF 文件,其中包含重新创建当前数据集所需的最少命令集。这与 RDB 快照的工作方式类似,但结果仍然是 AOF 文件。

配置 AOF

AOF 在 redis.conf 文件中配置。关键配置选项包括:

  • appendonly:设置为 yes 以启用 AOF 持久化。设置为 no 可禁用它(默认)。
  • appendfilename:指定 AOF 文件的名称(默认:appendonly.aof)。
  • appendfsync:指定 Redis 应将 AOF 文件同步到磁盘的频率。它可以具有以下值之一:
    • always:在每次写入作后同步。这提供了最高级别的数据持久性,但也提供了最低的性能。
    • everysec:每秒同步一次。这是数据持久性和性能之间的良好平衡(推荐)。
    • no:让作系统决定何时同步。这提供了最佳性能,但数据持久性级别最低。

AOF 重写配置

使用以下选项配置 AOF 重写:

  • auto-aof-rewrite-percentage:指定在触发重写之前 AOF 文件必须增长的百分比。例如,值 100 表示 AOF 文件的大小必须翻倍才能触发重写。
  • auto-aof-rewrite-min-size:指定触发重写之前 AOF 文件的最小大小。这可以防止重写非常小的 AOF 文件。

您还可以使用 redis-cli 中的 BGREWRITEAOF 命令手动触发 AOF 重写。

AOF 的优势

  • **高数据持久性:**AOF 提供比 RDB 更高的数据持久性,尤其是在使用 appendfsync alwaysappendfsync everysec 时。
  • 减少数据丢失: 如果服务器发生故障,AOF 可确保将数据丢失降至最低,因为只有最后几个尚未同步到磁盘的命令会丢失。
  • **人类可读格式:**AOF 文件采用人类可读格式(Redis 协议),因此可以更轻松地在需要时手动调试和恢复数据。

AOF 的缺点

  • **较大的文件大小:**AOF 文件通常比 RDB 文件大,因为它们包含所有写入作的历史记录。
  • **性能开销:**AOF 可能会带来性能开销,尤其是在始终使用 appendfsync 时。
  • **重写开销:**AOF 重写可能是资源密集型的,尽管它是在后台执行的。

RDB 与 AOF:比较

特征RDBAOF
数据持久性较低 (可能丢失数据)更高(最小数据丢失)
文件大小较小较大
性能更快更慢(尤其是 always
恢复时间更快较慢(需要重放命令)
配置save 指令appendonlyappendfsync 指令
使用案例备份、灾难恢复、缓存需要高数据持久性的应用程序

选择正确的持久性选项

RDB 和 AOF 之间的选择取决于您的具体要求:

  • RDB: 如果您需要快速备份和恢复,并且可以容忍一些数据丢失,请使用 RDB。它适用于数据丢失不严重的缓存方案。
  • 主干: 如果您需要高数据持久性并且无法承受丢失数据,请使用 AOF。它适用于数据完整性至关重要的应用程序,例如金融系统或存储关键用户信息的数据库。
  • 混合方法: 您还可以同时使用 RDB 和 AOF。在这种情况下,Redis 将使用 AOF 来恢复数据,因为它提供了最完整的数据集。RDB 仍可用于非关键情况下的备份和更快的恢复。

实例

示例 1:为缓存服务器配置 RDB

假设您使用 Redis 作为网站的缓存服务器。数据丢失是可以接受的,因为可以从主数据库中检索数据。在这种情况下,您可以配置具有相对不频繁的保存间隔的 RDB:

save 600 100      # Save if at least 100 keys changed in 600 seconds
save 300 1000     # Save if at least 1000 keys changed in 300 seconds
save 60 10000     # Save if at least 10000 keys changed in 60 seconds

此配置为缓存服务器提供了性能和数据持久性之间的良好平衡。

示例 2:为会话存储配置 AOF

假设您使用 Redis 作为电子商务网站的会话存储。数据丢失是不可接受的,因为它可能导致用户丢失购物车或被注销。在这种情况下,您应该每 sece 使用 appendfsync 配置 AOF:

appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec

此配置可确保每秒将每个会话更改写入磁盘,从而最大限度地降低数据丢失的风险。

示例 3:同时使用 RDB 和 AOF

对于假设的财务应用程序,您可以同时使用 RDB 和 AOF。每 squad 使用 appendfsync 的 AOF 可确保将事务记录的数据丢失降至最低。RDB 快照每天在非高峰时段拍摄,为灾难恢复和报告目的提供方便的备份。如果服务器发生故障,Redis 将使用 AOF 文件进行恢复。如果 AOF 文件已损坏或不可用,则可以将每日 RDB 快照用作回退,从而承认自上次快照以来可能会丢失数据。

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

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

相关文章

LLaMA-Factory:环境准备

一、硬件和系统 操作系统: Ubuntu 24.04.2 LTS(64位)GPU: NVIDIA RTX 4090 笔记本 GPU,16GB显存CPU: 建议高性能多核 CPU(如 Intel i7/i9 或 AMD Ryzen 7/9)以支持数据预处理,我的是32核。RAM: 至少 32GB&…

2025 uniapp的请求封装工具类以及使用【拿来就用】

一、创建一个http请求封装的js文件,名字自定义:my_http.js /*** 基础API请求地址(常量,全大写命名规范)* type {string}* constant*/ let BASE_URL //通过环境来判断基础路径 if (process.env.NODE_ENV development…

Qt应用程序启动时的一些思路:从单实例到性能优化的处理方案

程序启动时优化的价值 在桌面软件开发领域,应用程序的启动过程就像音乐的序曲,决定了用户对软件品质的第一印象。比如首次启动等待超过3秒时,会让大多数用户产生负面看法,而专业工具软件的容忍阈值甚至更低。Qt框架作为跨平台开发的利器,其启动过程的优化不仅关乎用户体验…

Node.js入门指南:开启JavaScript全栈开发之旅

Hi,我是布兰妮甜 !Node.js让JavaScript突破了浏览器的限制,成为全栈开发的利器。作为基于V8引擎的高性能运行时,它彻底改变了JavaScript只能做前端开发的局面。本文将带你快速掌握Node.js的核心用法:环境搭建与模块系统…

MySQL MCP 使用案例

## 概述 MySQL MCP(MySQL Multi-Channel Protocol)是MySQL的多通道协议实现,提供了高效的数据库连接池和负载均衡功能。本文档将介绍MySQL MCP的基本使用方法和常见案例。 ## 环境准备 ### 安装MySQL MCP bash pip install mysql-mcp ### 基…

基于 React Hook 封装 Store 的三种方案

基于 React Hook 封装 Store 的三种方案 方案一&#xff1a;基于 useSyncExternalStore 的轻量级 Store&#xff08;推荐&#xff09; import { useSyncExternalStore } from react;type Store<T> {state: T;listeners: Set<() > void>; };function createSt…

MySQL 8.0 OCP 1Z0-908 131-140题

Q131.You have upgraded the MySQL binaries from 5.7.28 to 8.0.18 by using an in-place upgrade. Examine the message sequence generated during the first start of MySQL 8.0.18: 。。。[System]。。。/usx/sbin/mysqld (mysqld 8.0.18-commercial) starting as process…

正向代理和反向代理的区别?

前言 在现代网络架构中&#xff0c;代理服务器扮演着至关重要的角色。无论是企业网络还是互联网服务&#xff0c;代理技术都广泛应用以提高性能、安全性和可管理性。正向代理和反向代理是两种最常见的代理类型&#xff0c;虽然它们都作为中间人处理客户端和服务器之间的通信&am…

技术融资:概念与形式、步骤与案例、挑战与应对、发展趋势

一、技术融资概述 技术融资是指通过外部资金支持技术研发、产品开发或市场扩展的过程。它通常涉及风险投资、天使投资、私募股权、众筹等多种形式。技术融资的核心目标是为技术创新提供资金保障&#xff0c;推动技术从概念到市场的转化。 技术融资的主要形式包括以下几种&…

从硬件角度理解“Linux下一切皆文件“,详解用户级缓冲区

目录 前言 一、从硬件角度理解"Linux下一切皆文件" 从理解硬件是种“文件”到其他系统资源的抽象 二、缓冲区 1.缓冲区介绍 2.缓冲区的刷新策略 3.用户级缓冲区 这个用户级缓冲区在哪呢&#xff1f; 解释关于fork再加重定向“>”后数据会打印两份的原因 4.内核缓冲…

车道线检测----CLRERNet

CLRerNet&#xff1a;利用LaneIoU提升车道检测置信度 摘要 车道标检测在自动驾驶和驾驶辅助系统中至关重要。现代深度车道检测方法在车道检测基准测试中表现出色。通过初步的预言机实验&#xff0c;我们首次拆解车道表示组件以确定研究方向。我们表明&#xff0c;正确的车道位…

ML307R 的 USB Vendor ID (VID):0x2ECC ML307R 的 USB Product ID (PID):0x3012

可以的&#xff0c;在文档的「Table 3. VID、PID查询表」中明确指出&#xff1a; ML307R 的 USB Vendor ID (VID)&#xff1a;0x2ECCML307R 的 USB Product ID (PID)&#xff1a;0x3012 你可以将这对 VID/PID 加到 Linux 的 option 驱动中&#xff0c;比如&#xff1a; ech…

论信息系统项目的范围管理

论信息系统项目的范围管理 前言一、规划范围管理&#xff0c;收集需求二、定义范围三、创建工作分解结构四、确认范围五、控制范围 前言 为了应对烟草零售客户数量大幅度增长所带来的问题&#xff0c;切实履行控烟履约的相关要求&#xff0c;同时也为了响应国务院“放管服”政策…

MongoDB与PostgreSQL两个数据库的特点详细对比

MongoDB 和 PostgreSQL 是两种不同类型的数据库&#xff0c;分别属于 ​​NoSQL&#xff08;文档型&#xff09;​​ 和 ​​关系型&#xff08;SQL&#xff09;​​ 数据库。它们在数据模型、查询语言、扩展性、事务支持等方面有显著差异。以下是详细对比&#xff1a; ​​1. …

计算机网络:什么是电磁波以及有什么危害?

电磁波详解 电磁波(Electromagnetic Wave)是由电场和磁场相互激发、在空间中传播的能量形式。它既是现代通信的基石(如手机、Wi-Fi、卫星信号),也是自然界中光、热辐射等现象的本质。以下从定义、产生、特性、分类及应用全面解析: 一、电磁波的本质 1. 核心定义 电场与…

如何使用 Solana Yellowstone gRPC 重新连接和重放插槽

Yellowstone gRPC 是一个功能强大、可用于生产环境且经过实战检验的工具&#xff0c;用于流式传输实时的 Solana 数据。但在实际条件下&#xff0c;网络中断或服务器重启可能导致连接中断。如果没有适当的重连策略&#xff0c;你的应用程序可能会错过区块链的关键更新。 为了防…

foxmail - foxmail 启用超大附件提示密码与帐号不匹配

foxmail 启用超大附件提示密码与帐号不匹配 问题描述 在 foxmail 客户端中&#xff0c;启用超大附件功能&#xff0c;输入了正确的账号&#xff08;邮箱&#xff09;与密码&#xff0c;但是提示密码与帐号不匹配 处理策略 找到 foxmail 客户端目录/Global 目录下的 domain.i…

MySQL 事务(一)

文章目录 CURD不加控制&#xff0c;会有什么问题CURD满足什么属性&#xff0c;能解决上述问题&#xff1f;什么是事务为什么要有事务事务的版本支持了解事务的提交方式 事务常见操作方式研究并发场景事务的正常操作事务的非正常情况的案例结论事务操作的注意事项 CURD不加控制&…

CSS面试题汇总

在前端开发领域&#xff0c;CSS 是一项不可或缺的技术。无论是页面布局、样式设计还是动画效果&#xff0c;CSS 都扮演着重要的角色。因此&#xff0c;在前端面试中&#xff0c;CSS 相关的知识点往往是面试官重点考察的内容。为了帮助大家更好地准备面试&#xff0c;本文汇总了…

Java 后端给前端传Long值,精度丢失的问题与解决

为什么后端 Long 类型 ID 要转为 String&#xff1f; 在前后端分离的开发中&#xff0c;Java 后端通常使用 Long 类型作为主键 ID&#xff08;如雪花算法生成的 ID&#xff09;。但如果直接将 Long 返回给前端&#xff0c;可能会导致前端精度丢失的问题&#xff0c;特别是在 J…