Redis 7.x 系列【15】持久化机制之 RDB

有道无术,术尚可求,有术无道,止于术。

本系列Redis 版本 7.2.5

源码地址:https://gitee.com/pearl-organization/study-redis-demo

文章目录

    • 1. 概述
    • 2 执行原理
    • 3. 配置项
      • 3.1 save
      • 3.2 stop-writes-on-bgsave-error
      • 3.3 rdbcompression
      • 3.4 rdbchecksum
      • 3.5 sanitize-dump-payload
      • 3.6 dbfilename
      • 3.7 rdb-del-sync-files
      • 3.8 dir
    • 4. save/bgsave 命令

1. 概述

Redis 的数据都在内存中,一旦服务器宕机或者重启,所有的数据都将丢失。Redis 提供了持久化机制,将内存数据进行磁盘持久化保存,以便重启时重新加载数据到内存中。

目前提供了两种持久化机制:

  • RDBRedis Database):默认方式,在指定的时间间隔内,通过创建快照保存数据,重启时,加载快照数据
  • AOFAppend Only File):将每一个写命令都追加到 AOF 文件的末尾,重启时,执行文件中的所有命令来恢复数据

RDB优点:

  • RDB 文件是一个紧凑的二进制文件,可以很方便地进行备份、传输和恢复。
  • 保存的是数据集的完整快照,所以恢复起来也很快。
  • 在恢复大的数据集时,比AOF更快。

RDB缺点:

  • RDB 是定期保存,所以在两次保存之间如果发生宕机,那么最近一次保存之后的数据将会丢失。
  • Redis Save 命令可能会阻塞客户端的请求。
  • 依赖于主进程的fork,在更大的数据集中,这可能会导致服务请求的瞬间延迟。

2 执行原理

执行流程如下所示:
在这里插入图片描述
RDB默认开启,但是快照生成不是连续的,而是在满足特定条件时触发。在以下情况时,会触发生成RDB

  • 手动触发:
    • 手动save/bgsave命令
    • 执行shutdown且没有设置开启AOF持久化
    • 执行flushall/flushdb命令也会产生dump.rdb文件,但里面是空的,无意义
  • 自动触发:
    • 达到save配置项的条件
    • 主从复制时,主节点自动触发

当触发后,Redis 会创建一个子进程,与主进程共享相同的地址空间,责遍历内存中的键值对,并将它们编码后写入一个临时RDB文件中。

子进程完成写入后,用新的RDB文件替换旧的RDB文件,并更新生成时间戳,默认的文件名为dump.rdb
在这里插入图片描述
Redis 重启时,会加载RDB文件中的数据并读回到内存中。

3. 配置项

redis.confRDB 相关的配置如下:

################################ SNAPSHOTTING  ################################

# Save the DB to disk.
#
# save <seconds> <changes> [<seconds> <changes> ...]
#
# Redis will save the DB if the given number of seconds elapsed and it
# surpassed the given number of write operations against the DB.
#
# Snapshotting can be completely disabled with a single empty string argument
# as in following example:
#
# save ""
#
# Unless specified otherwise, by default Redis will save the DB:
#   * After 3600 seconds (an hour) if at least 1 change was performed
#   * After 300 seconds (5 minutes) if at least 100 changes were performed
#   * After 60 seconds if at least 10000 changes were performed
#
# You can set these explicitly by uncommenting the following line.
#
# save 3600 1 300 100 60 10000

# By default Redis will stop accepting writes if RDB snapshots are enabled
# (at least one save point) and the latest background save failed.
# This will make the user aware (in a hard way) that data is not persisting
# on disk properly, otherwise chances are that no one will notice and some
# disaster will happen.
#
# If the background saving process will start working again Redis will
# automatically allow writes again.
#
# However if you have setup your proper monitoring of the Redis server
# and persistence, you may want to disable this feature so that Redis will
# continue to work as usual even if there are problems with disk,
# permissions, and so forth.
stop-writes-on-bgsave-error yes

# Compress string objects using LZF when dump .rdb databases?
# By default compression is enabled as it's almost always a win.
# If you want to save some CPU in the saving child set it to 'no' but
# the dataset will likely be bigger if you have compressible values or keys.
rdbcompression yes

# Since version 5 of RDB a CRC64 checksum is placed at the end of the file.
# This makes the format more resistant to corruption but there is a performance
# hit to pay (around 10%) when saving and loading RDB files, so you can disable it
# for maximum performances.
#
# RDB files created with checksum disabled have a checksum of zero that will
# tell the loading code to skip the check.
rdbchecksum yes

# Enables or disables full sanitization checks for ziplist and listpack etc when
# loading an RDB or RESTORE payload. This reduces the chances of a assertion or
# crash later on while processing commands.
# Options:
#   no         - Never perform full sanitization
#   yes        - Always perform full sanitization
#   clients    - Perform full sanitization only for user connections.
#                Excludes: RDB files, RESTORE commands received from the master
#                connection, and client connections which have the
#                skip-sanitize-payload ACL flag.
# The default should be 'clients' but since it currently affects cluster
# resharding via MIGRATE, it is temporarily set to 'no' by default.
#
# sanitize-dump-payload no

# The filename where to dump the DB
dbfilename dump.rdb

# Remove RDB files used by replication in instances without persistence
# enabled. By default this option is disabled, however there are environments
# where for regulations or other security concerns, RDB files persisted on
# disk by masters in order to feed replicas, or stored on disk by replicas
# in order to load them for the initial synchronization, should be deleted
# ASAP. Note that this option ONLY WORKS in instances that have both AOF
# and RDB persistence disabled, otherwise is completely ignored.
#
# An alternative (and sometimes better) way to obtain the same effect is
# to use diskless replication on both master and replicas instances. However
# in the case of replicas, diskless is not always an option.
rdb-del-sync-files no

# The working directory.
#
# The DB will be written inside this directory, with the filename specified
# above using the 'dbfilename' configuration directive.
#
# The Append Only File will also be created inside this directory.
#
# Note that you must specify a directory here, not a file name.
dir ./

3.1 save

stop-writes-on-bgsave-error配置 Redis 如何触发 RDB持久化。

# 禁用 RDB
# save ""
# 多少秒内,如果数据集至少发生了多少次写操作,执行一次快照保存(下面为默认值)
# save 3600 1 300 100 60 10000 

save "" 将配置设置为一个空字符串,表示禁用 RDB ,但通常不建议这样做,除非你使用了 AOF 持久化或其他备份策略。

save <seconds> <changes> 配置指定了在多少秒(seconds)内,如果数据集至少发生了多少次写(changes)操作(例如SETLPUSH等),则执行一次 RDB 快照保存。

save 3600 1 300 100 60 10000 表示:

  • 3600秒内(1小时),如果至少进行了1次写操作,则保存
  • 300秒内(5分钟),如果至少进行了100次写操作,则保存
  • 60秒内,如果至少进行了10000次写操作,则保存

可以自定义配置,比如 :

# 每隔600秒(10分钟)检查一次,如果在这段时间内至少发生了10次写操作,则执行一次RDB快照保存
save 600 10

在执行RDB快照保存时,Redis可能会阻塞客户端的请求,特别是当使用SAVE命令而不是BGSAVE(在后台保存)时。因此,在生产环境中,通常建议使用BGSAVE来避免阻塞。BGSAVE通过创建一个子进程来执行快照保存,而主进程则继续处理客户端的请求。

3.2 stop-writes-on-bgsave-error

stop-writes-on-bgsave-error配置 RedisRDB持久化过程中遇到错误时,是否应该停止接受新的写操作,默认为 yes

stop-writes-on-bgsave-error yes

如果设置为yes(默认值),那么在执行BGSAVE命令时如果遇到错误(例如磁盘空间不足、权限问题等),Redis会停止接受新的写操作,直到BGSAVE命令成功执行。这样做的目的是为了让用户意识到数据没有正确地持久化到磁盘上,从而可以采取适当的措施。

如果设置为no,即使BGSAVE命令失败,Redis也会继续接受新的写操作。这意味着数据可能会丢失,因为错误没有导致Redis停止写入。然而,如果你已经设置了适当的Redis服务器监控和持久化策略,并且希望Redis在发生磁盘、权限等问题时仍然能够继续工作,那么可以选择将这个选项设置为no

在大多数情况下,将stop-writes-on-bgsave-error设置为yes是一个比较安全的选择,因为它可以确保在发生错误时用户会注意到,并有机会采取措施。然而,如果对Redis的监控和持久化策略非常自信,并且希望即使在发生错误时也能继续工作,那么可以将其设置为no

3.3 rdbcompression

rdbcompression 配置 Redis 在创建RDB快照文件时是否使用LZF算法来压缩字符串对象的。

rdbcompression yes

如果设置为 yes(默认值),Redis会使用LZF压缩算法来压缩RDB文件中的字符串对象。LZF是一个快速且有效的压缩算法,可以在创建RDB文件时减少文件的大小,从而节省磁盘空间。然而,压缩过程会消耗一些额外的CPU资源。

如果设置为noRedis将不会使用LZF压缩算法来压缩,这样做可以节省CPU资源,但RDB文件可能会变得更大,尤其是当数据库中包含大量可压缩的字符串值或键时。

在大多数情况下,启用压缩是一个好的选择,因为它可以显著减少RDB文件的大小,节省磁盘空间,并且通常压缩和解压缩的开销对于Redis的性能影响是微乎其微的。然而,如果Redis实例运行在CPU资源非常受限的环境中,并且你更关心节省CPU资源而不是磁盘空间,那么你可以考虑禁用压缩。但请注意,这可能会导致RDB文件变得更大。

3.4 rdbchecksum

rdbchecksum 配置Redis在生成RDB持久化文件时是否应该包含CRC64校验和,并将这个校验和保存在文件的末尾。

rdbchecksum yes

如果设置为yes(默认值),Redis会在RDB文件的末尾添加一个CRC64校验和。这个校验和用于在加载RDB文件时验证文件的完整性,确保文件在写入磁盘后没有被损坏。虽然这会增加在保存和加载文件时的CPU消耗(大约10%的性能开销),但它提高了RDB文件的抗损坏能力。

如果设置为noRedis将不会在文件的末尾添加校验和。这样可以减少保存和加载RDB文件时的CPU消耗,但会增加RDB文件损坏的风险,因为在加载文件时无法验证其完整性。如果加载了一个损坏的RDB文件,Redis可能无法正确启动或导致数据丢失。

在大多数情况下,推荐启用CRC64校验和,因为它提供了对RDB文件完整性的验证,有助于确保数据的可靠性。除非你非常关注性能,并且确信RDB文件在保存和加载过程中不会受到损坏,否则建议不要禁用这个选项。

3.5 sanitize-dump-payload

sanitize-dump-payload配置Redis在加载RDB文件或RESTORE命令的payload时是否执行全面的数据校验。全面的数据校验可以减少在后续处理命令时遇到断言失败或崩溃的风险。

sanitize-dump-payload no

可配置选项:

  • no:从不进行全面的数据校验。
  • yes:始终进行全面的数据校验。
  • clients:仅对用户连接执行全面的数据校验。排除从主连接收到的RDB文件和RESTORE命令,以及具有skip-sanitize-payload ACL标志的客户端连接。

默认值是no,由于它目前会影响集群迁移(resharding via MIGRATE),所以默认设置为no。但在某些情况下,尤其是当安全性更重要时,可以设置为yesclients

3.6 dbfilename

dbfilename 用于指定Redis在生成RDB持久化文件时使用的文件名,默认文件名是dump.rdb

dbfilename dump.rdb

可以根据需要更改这个文件名,但请确保Redis进程有权写入指定的目录和文件。如果更改了dbfilename的值,那么当你需要恢复Redis数据时,也需要使用新的文件名来指定RDB文件。

3.7 rdb-del-sync-files

rdb-del-sync-files 控制Redis是否在没有启用持久化(即既没有启用RDB也没有启用AOF)的实例中删除用于复制的RDB文件。

rdb-del-sync-files no

如果设置为yesRedis会在完成初始同步或复制操作后删除这些RDB文件。在某些环境中,由于法规或其他安全考虑,可能需要尽快删除这些文件。但请注意,这个选项仅在实例同时禁用了RDBAOF持久化时才生效。如果启用了任何一种持久化方式,这个选项将被忽略。

如果设置为no(默认值),Redis将保留这些RDB文件。在某些情况下,这可能是有用的,例如,如果你希望稍后能够重新使用这些文件来恢复数据或重新配置复制。

此外,还有另外一种替代方法(在某些情况下可能是更好的方法),即在主节点和从节点上都使用无盘复制(diskless replication)。然而,在从节点上,无盘复制并不总是可行的选项。

3.8 dir

dir 用于指定RDB文件和AOF文件的存储目录。

dir ./

./ 表示当前目录。修改时请确保Redis进程对该目录有写入权限。如果在配置文件中没有指定dir配置项,会使用默认的工作目录,即服务器启动时的当前目录,或者是在编译时指定的目录。

4. save/bgsave 命令

Redis save 命令执行一个同步保存操作,将当前 Redis 实例的所有数据快照以 RDB 文件的形式保存到硬盘。

执行命令后会阻塞服务端进程,直到RDB文件创建完毕为止,在整个RDB文件生成过程中服务器不能处理任何命令请求,所以一般情况下我们不会使用该命令触发持久化。

127.0.0.1:6379> save
OK

Redis bgsave 命令执行时,Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短。基本上 Redis 内部所有的RDB操作都是采用 bgsave 命令。

执行后会立即返回 OK 状态码, Redis 父进程继续提供服务以供客户端调用,子进程将DB数据保存到磁盘然后退出。如果操作成功,可以通过客户端命令LASTSAVE来检查操作结果。

127.0.0.1:6379> bgsave
Background saving started
127.0.0.1:6379> lastsave
(integer) 1620784097

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HMI 的 UI 风格创造奇迹

HMI 的 UI 风格创造奇迹

关于巴图自动化Profinet协议转Modbus协议网关模块怎么配置IP地址教学

Profinet协议和Modbus协议是工业领域中常用的两种通讯协议&#xff0c;除此以外还有较为常见的&#xff1a;ModbusTCP协议&#xff0c;Profibus协议&#xff0c;Profibus DP协议&#xff0c;EtherCAT协议&#xff0c;EtherNET协议&#xff0c;CAN&#xff0c;CANOPEN等它们在自…

利用运放设计简单有源滤波器(低通、高通、带通)

本文旨在帮助刚接触模电的同学快速设计一个实用可靠的有源滤波器&#xff0c;故我将不会说一些晦涩难懂的原理&#xff0c;只给出仿真电路图。 低通滤波器 图1 低通滤波器 图1所示的是一个截止频率约为1KHz的低通滤波器。 图2 200Hz的情况 图3 2KHz的情况 设计步骤为&#x…

Lesson 47 A cup of coffee

Lesson 47 A cup of coffee 词汇 like v. 喜欢&#xff0c;想要 用法&#xff1a;like 物品 / 人 喜欢……    like 动词ing 喜欢做……&#xff08;习惯性&#xff09;    like to 动词原形 喜欢做……&#xff08;一次性&#xff09; 例句&#xff1a;我喜欢小狗…

一、强化学习基本概念

一、强化学习基本概念 1.1 何为强化学习&#xff1f;1.2 强化学习的环境1.3 强化学习的目标1.4 强化学习的数据 1.1 何为强化学习&#xff1f; 强化学习(Reinforcement Learning, RL)是机器通过与环境交互来实现目标的一种计算方法。机器和环境的一轮交互是指&#xff1a;机器在…

FlinkCDC-3.1.1 DataStream Source

问题&#xff1a; Caused by: java.lang.ClassNotFoundException: org.apache.flink.table.catalog.ObjectPath 解决&#xff1a; 在poml文件中&#xff0c;导入的flink-table依赖把“ <scope>”去掉 <properties><maven.compiler.source>8</maven.compi…

安卓稳定性之crash详解

目录 前言一、Crash 的基本原理二、Crash 分析思路三、实例分析四、预防措施五、参考链接 前言 在开发和测试 Android 应用程序时&#xff0c;遇到应用程序崩溃是很常见的情况。 Android 崩溃指的是应用程序因为异常或错误而无法正常执行&#xff0c;并且导致应用强制关闭。 一…

通过一个单相逆变器仿真深度学习PR控制器

目录 前言 ​编辑 PR控制器的理论 PR控制器不同表达式及其建模 PR控制器连续积分组合及模型 PR控制器连续传递函数及模型 PR控制器离散积分及模型 PR控制器离散传递函数及模型 PR控制器差分方程及模型 系统仿真效果 总结 前言 在项目开发中常用PI控制器&#xff0c;这次在…

java实现【 生成小程序二维码:图片+二维码备注】

1.逻辑&#xff1a;进行获取小程序的token进行-获取不限制的小程序码。2.参考的地址&#xff1a;微信官方文档&#xff1a;官网-获取不限制的小程序码 需要注意的点&#xff1a;1. 如果传入page这个参数的话必须定义check_path参数&#xff0c;不然无法识别-page指定的目录2. …

2024微信小程序期末大作业-点奶茶微信小程序(后端nodejs-server)(附下载链接)_微信小程序期末大作业百度网盘下载

菜单展示 购物车展示&#xff1a; 提交订单&#xff1a; 支付详情页展示&#xff1a; 订单查看&#xff1a; 查看历史消费&#xff1a; 部分代码展示&#xff1a; <!--pages/home/home.wxml--> <block wx:for"{{listData}}" wx:key"itemlist&qu…

国标GB28181视频汇聚平台LntonCVS视频监控安防平台与国标协议对接解决方案

应急管理部门以“以信息化推动应急管理能力现代化”为总体目标&#xff0c;加快现代信息技术与应急管理业务深度融合&#xff0c;全面支持现代应急管理体系建设&#xff0c;这不仅是国家加强和改进应急管理工作的关键举措&#xff0c;也是应对日益严峻的应急管理形势和满足公众…

数据列表组件-报表

当数据在后端接口查询到&#xff0c;需要在页面展示出来&#xff0c;如果项目有很多report &#xff0c;可以把列表做一个组件 效果如下&#xff1a; js代码&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8" /><title&g…

PKUMOD同学又双叒获奖啦~

近期王选所数据管理研究室的同学们 凭借在各自领域的卓越表现 获得了多项荣誉和奖励 让我们共赏风采~ 期待他们在未来的科研道路上 取得更加辉煌的成就 庞悦 前沿交叉学科研究院2020级博士生 荣获2024年北京大学校长奖学金 庞悦&#xff0c;北京大学元培学院2016级本科生&…

zabbix小白入门:从SNMP配置到图形展示——以IBM服务器为例

作者 乐维社区&#xff08;forum.lwops.cn&#xff09;许远 在运维实践中&#xff0c;Zabbix作为一款强大的开源监控工具&#xff0c;被广泛应用于服务器、网络设备和应用程序的监控&#xff0c;成为保障业务连续性和高效运行的关键。然而&#xff0c;对于Zabbix的初学者来说&a…

2024年前端面试题及答案

7、 nginx代理跨域 8、 nodejs中间件代理跨域 9、 WebSocket协议跨域 前端数据加密问题 1 一般如何处理用户敏感信息&#xff1f; 前端一般使用md5、base64加密、sha1加密&#xff0c;想要了解详情请自行百度。 前端http相关问题 1 HTTP常用状态码及其含义&#xff1f; …

vue-element-admin集成方案如何运行以及代码解读

文章目录 1.vue-admin-admin介绍2.运行方法3.代码解读3.1基础外层文件解读&#xff0c;以及eslint关闭&#xff08;如下图&#xff09;3.2内层src文件分析3.2.1 login流程解析 1.vue-admin-admin介绍 1.1 是一个后台前端解决方案(vueelementui)&#xff0c;内置i18国际化解决方…

行业洞察 | 2024应用程序安全领域现状报告

在信息爆炸的时代&#xff0c;我们每天都在使用各种应用&#xff0c;从社交娱乐到工作学习&#xff0c;应用已经成为我们生活中不可或缺的一部分。然而&#xff0c;你是否知道&#xff0c;在这些便捷的背后&#xff0c;隐藏着巨大的安全风险&#xff1f; 近年来&#xff0c;应用…

Build a Large Language Model (From Scratch)附录D(gpt-4o翻译版)

来源&#xff1a;https://github.com/rasbt/LLMs-from-scratch?tabreadme-ov-file https://www.manning.com/books/build-a-large-language-model-from-scratch

Windows系统安装SSH服务结合内网穿透配置公网地址远程ssh连接

前言 在当今的数字化转型时代&#xff0c;远程连接和管理计算机已成为日常工作中不可或缺的一部分。对于 Windows 用户而言&#xff0c;SSH&#xff08;Secure Shell&#xff09;协议提供了一种安全、高效的远程访问和命令执行方式。SSH 不仅提供了加密的通信通道&#xff0c;…

单片机IO

一、简单GPIO口 保护二极管&#xff1a;IO引脚上下两边两个二极管用于防止引脚外部过高、过低的电压输入。 当引脚电压高于VDD时&#xff0c;上方的二极管导通&#xff0c;电压被钳位在VDD0.7V&#xff1b; 当引脚电压低于VSS时&#xff0c;下方的二极管导通&#xff0c;防止不…