Redis持久化RDB与AOF

2023-10-27

前言

我们知道Redis是一款内存服务器,就算我们对自己的服务器足够的信任,不会出现任何软件或者硬件的故障,但也会有可能出现突然断电等情况,造成Redis服务器中的数据失效。因此,我们需要向传统的关系型数据库一样对数据进行备份,将Redis在内存中的数据持久化到硬盘等非易失性介质中,来保证数据的可靠性。

将Redis内存服务器中的数据持久化到硬盘等介质中的一个好处就是,使得我们的服务器在重启之后还可以重用以前的数据,或者是为了防止系统出现故障而将数据备份到一个远程的位置。

还有一些场景,例如:

对于一些需要进行大量计算而得到的数据,放置在Redis服务器,我们就有必要对其进行数据的持久化,如果需要对数据进行恢复的时候,我们就不需进行重新的计算,只需要简单的将这台机器上的数据复制到另一台需要恢复的Redis服务器就可以了。
1
Redis给我们提供了两种不同方式的持久化方法:快照(Snapshotting) 和 只追加文件(append-only-file)。

(1)名词简介

快照(RDB):就是我们俗称的备份,他可以在定期内对数据进行备份,将Redis服务器中的数据持久化到硬盘中;

只追加文件(AOF):他会在执行写命令的时候,将执行的写命令复制到硬盘里面,后期恢复的时候,只需要重新执行一下这个写命令就可以了。类似于我们的MySQL数据库在进行主从复制的时候,使用的是binlog二进制文件,同样的是执行一遍写命令;

(2)快照持久化通用的配置:

save 60 1000  #60秒时间内有1000次写入操作的时候执行快照的创建
stop-writes-on-bgsave-error no  #创建快照失败的时候是否仍然继续执行写命令
rdbcompression yes  #是否对快照文件进行压缩
dbfilename dump.rdb   #如何命名硬盘上的快照文件
dir ./  #快照所保存的位置

(3)AOF持久化配置:

appendonly no  #是否使用AOF持久化
appendfsync everysec  #多久执行一次将写入内容同步到硬盘上
no-appendfsync-on-rewrite no #对AOF进行压缩的时候能否执行同步操作
auto-aof-rewrite-percentage 100  #多久执行一次AOF压缩
auto-aof-rewrite-min-size 64mb  #多久执行一次AOF压缩
dir ./ #AOF所保存的位置

需要注意的是:这两种持久化的方式既可以单独的使用,也可以同时使用,具体选择哪种方式需要根据具体的情况进行选择。

快照持久化

快照就是我们所说的备份。用户可以将Redis内存中的数据在某一个时间点进行备份,在创建快照之后,用户可以对快照进行备份。通常情况下,为了防止单台服务器出现故障造成所有数据的丢失,我们还可以将快照复制到其他服务器,创建具有相同数据的数据副本,这样的话,数据恢复的时候或者服务器重启的时候就可以使用这些快照信息进行数据的恢复,也可以防止单台服务器出现故障的时候造成数据的丢失。

但是,没我们还需要注意的是,创建快照的方式,并不能完全保证我们的数据不丢失,这个大家可以很好的理解,因为快照的创建时定时的,并不是每一次更新操作都会创建一个快照的。系统发生崩溃的时候,用户将丢失最近一次生成快照之后更改的所有数据。因此,快照持久化的方式只适合于数据不经常修改或者丢失部分数据影响不大的场景。

一、创建快照的方式:

(1)客户端通过向Redis发送BGSAVE 命令来创建快照。

使用BGSAVE的时候,Redis会调用fork来创建一个子进程,然后子进程负责将快照写到硬盘中,而父进程则继续处理命令请求。

使用场景:

如果用户使用了save设置,例如:save 60 1000 ,那么从Redis最近一次创建快照之后开始计算,当“60秒之内有1000次写入操作”这个条件满足的时候,Redis就会自动触发BGSAVE命令。

如果用户使用了多个save设置,那么当任意一个save配置满足条件的时候,Redis都会触发一次BGSAVE命令。

(2)客户端通过向Redis发送SAVE 命令来创建快照。

接收到SAVE命令的Redis服务器在快照创建完毕之前将不再响应任何其他命令的请求。SAVE命令并不常用,我们通常只在没有足够的内存去执行BGSAVE命令的时候才会使用SAVE命令,或者即使等待持久化操作执行完毕也无所谓的情况下,才会使用这个命令;

使用场景:

当Redis通过SHUTDOWN命令接收到关闭服务器的请求时,或者接收到标准的TERM信号时,会执行一次SAVE命令,阻塞所有的客户端,不再执行客户端发送的任何命令,并且在执行完SAVE命令之后关闭服务器。

二、使用快照持久化注意事项:

我们在使用快照的方式来保存数据的时候,如果Redis服务器中的数据量比较小的话,例如只有几个GB的时候。Redis会创建子进程并将数据保存到硬盘里边,生成快照所需的时间比读取数据所需要的时间还要短。

但是,随着数据的增大,Redis占用的内存越来越大的时候,BGSAVE在创建子进程的时候消耗的时间也会越来越多,如果Redis服务器所剩下的内存不多的时候,这行BGSAVE命令会使得系统长时间地停顿,还有可能导致服务器无法使用。

各虚拟机类别,创建子线程所耗时间:

因此,为了防止Redis因为创建子进程的时候出现停顿,我们可以考虑关闭自动保存,转而通过手动的方式发送BGSAVE或者SAVE来进行持久化,

手动的方式发送BGSAVE也会出现停顿的现象,但是我们可以控制发送该命令的时间来控制出现停顿的时候不影响具体的业务请求。

另外,值得注意的是,在使用SAVE命令的时候,虽然会一直阻塞Redis直到快照生成完毕,但是其不需要创建子进程,所以不会向BGSAVE一样,因为创建子进程而导致Redis停顿。也正因为如此,SAVE创建快照的速度要比BGSAVE创建快照的速度更快一些。

创建快照的时候,我们可以在业务请求,比较少的时候,比如凌晨三、四点,通过手写脚本的方式,定时执行。

AOF持久化

AOF持久化会将被执行的写命令写到AOF文件的末尾,以此来记录数据发生的变化。这样,我们在恢复数据的时候,只需要从头到尾的执行一下AOF文件即可恢复数据。

一、打开AOF持久化选项

我们可以通过使用如下命令打开AOF:

appendonly yes

我们,通过如下命令来配置AOF文件的同步频率:

appendfsync everysec/always/no

二、appendfsync同步频率的区别

appendfsync同步频率的区别如下图:

(1)always的方式固然可以对没一条数据进行很好的保存,但是这种同步策略需要对硬盘进行大量的写操作,所以Redis处理命令的速度会受到硬盘性能的限制。

普通的硬盘每秒钟只能处理大约200个写命令,使用固态硬盘SSD每秒可以处理几万个写命令,但是每次只写一个命令,这种只能怪不断地写入很少量的数据的做法有可能引发严重的写入放大问题,这种情况下降严重影响固态硬盘的使用寿命。

(2)everysec的方式,Redis以每秒一次的频率大队AOF文件进行同步。这样的话既可以兼顾数据安全也可以兼顾写入性能。

Redis以每秒同步一次AOF文件的性能和不使用任何持久化特性时的性能相差无几,使用每秒更新一次 的方式,可以保证,即使出现故障,丢失的数据也在一秒之内产生的数据。

(3)no的方式,Redis将不对AOF文件执行任何显示的同步操作,而是由操作系统来决定应该何时对AOF文件进行同步。

这个命令一般不会对Redis的性能造成多大的影响,但是当系统出现故障的时候使用这种选项的Redis服务器丢失不定数量的数据。

另外,当用户的硬盘处理写入操作的速度不够快的话,那么缓冲区被等待写入硬盘的数据填满时,Redis的写入操作将被阻塞,并导致Redis处理命令请求的速度变慢,因为这个原因,一般不推荐使用这个选项。

三、重写/压缩AOF文件

随着数据量的增大,AOF的文件可能会很大,这样在每次进行数据恢复的时候就会进行很长的时间,为了解决日益增大的AOF文件,用户可以向Redis发送BGREWRITEAOF 命令,这个命令会通过移除AOF文件中的冗余命令来重写AOF文件,是AOF文件的体检变得尽可能的小。

BGREWRITEAOF的工作原理和BGSAVE的原理很像:Redis会创建一个子进程,然后由子进程负责对AOF文件的重写操作。

因为AOF文件重写的时候汇创建子进程,所以快照持久化因为创建子进程而导致的性能和内存占用问题同样会出现在AOF文件重写的 时候。

四、触发重写/压缩AOF文件条件设定

AOF通过设置auto-aof-rewrite-percentage 和 auto-aof-rewrite-min-size 选项来自动执行BGREWRITEAOF。

其具体含义,通过实例可以看出,如下配置:

auto-aof-rewrite-percentage 100 
auto-aof-rewrite-min-size 64mb

表示当前AOF的文件体积大于64MB,并且AOF文件的体积比上一次重写之后的体积变大了至少一倍(100%)的时候,Redis将执行重写BGREWRITEAOF命令。

如果AOF重写执行的过于频繁的话,可以将auto-aof-rewrite-percentage 选项的值设置为100以上,这种最偶发就可以让Redis在AOF文件的体积变得更大之后才执行重写操作,不过,这也使得在进行数据恢复的时候执行的时间变得更加长一些。

验证快照文件和AOF文件
无论使用哪种方式进行持久化,我们在进行恢复数据的时候,Redis提供了两个命令行程序:

redis-check-aof
redis-check-dump

他们可以再系统发生故障的时候,检查快照和AOF文件的状态,并对有需要的情况对文件进行修复。

如果用户在运行redis-check-aof命令的时候,指定了--fix 参数,那么程序将对AOF文件进行修复。

程序修复AOF文件的方法很简单:他会扫描给定的AOF文件,寻找不正确或者不完整的命令,当发现第一个出现错误命令的时候,程序会删除出错命令以及出错命令之后的所有命令,只保留那些位于出错命令之前的正确命令。大部分情况,被删除的都是AOF文件末尾的不完整的写命令。

总结
上述,一起学习了两种支持持久化的方式,一方面我们需要通过快照或者AOF的方式对数据进行持久化,另一方面,我们还需要将持久化所得到的文件进行备份,备份到不同的服务器上,这样才可以尽可能的减少数据丢失的损失。
--------------------- 
作者:徐刘根 
来源:CSDN 
原文:https://blog.csdn.net/xlgen157387/article/details/61925524 
版权声明:本文为博主原创文章,转载请附上博文链接!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis持久化RDB与AOF 的相关文章

  • socket.io redis 和内存泄漏

    我的socket io版本是 电子邮件受保护 cdn cgi l email protection and 电子邮件受保护 cdn cgi l email protection 我在 Windows 上 在某些地方 我看到问题已得到解决 我
  • 使用brew在MacOSx上安装Redis JSON

    如何使用brew 在 macOSx 上安装 RedisJSON 如何在不编译redis的情况下启用redis上的模块 我不想使用 docker 客户端 Redis Stack 可能是最简单的方法 它不仅仅是 RedisJSON 还包括 Re
  • Laravel - 缓存 Eloquent 并频繁更新

    是否可以对经常修改的对象使用缓存 例如 假设我们有一个 BlogPost 对象 并且有一个经常更改的 num of views 列 以及其他列 是否可以更新缓存和数据库中的 num of views 字段 而不破坏缓存对象并重新创建它 我可
  • Redis 块推送直到列表有空位

    我正在寻找类似的东西BLPUSH该命令将阻塞 直到列表的长度低于指定值max size 目的是防止生产者运行速度快于消费者时列表无限增长 功能与 python 非常相似Queue put https docs python org 3 li
  • 我的 Redis 自动生成的密钥

    我不知道我的 Redis 版本 4 0 9 到底发生了什么 我正在运行一个应用程序并使用 Redis 来存储我的数据库 但是 然后 Redis 自动创建 3 个新键 Backup1 Backup2 Backup3 并删除我的所有数据 这是我
  • redis集群不断打印日志WSA_IO_PENDING

    当我启动redis集群的所有redis服务器时 所有这些服务器不断打印类似WSA IO PENDING clusterWriteDone的日志 9956 03 Feb 18 17 25 044 WSA IO PENDING writing
  • WSL Redis 遇到系统尚未使用 systemd 作为 init 系统(PID 1)启动。无法操作[已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试遵循本文中讨论的 Redis 安装过程article https www digitalocean com community
  • 库存管理系统的 SQL 与 NoSQL

    我正在开发一个基于 JAVA 的网络应用程序 主要目的是拥有在多个称为渠道的网站上销售的产品的库存 我们将担任所有这些渠道的管理者 我们需要的是 用于管理每个渠道的库存更新的队列 库存表 其中包含每个通道上分配的正确快照 将会话 ID 和其
  • Redis hash写入速度非常慢

    我面临一个非常奇怪的问题 使用 Redis 时 我的写入速度非常糟糕 在理想的情况下 写入速度应该接近 RAM 上的写入速度 这是我的基准 package redisbenchmark import redis clients jedis
  • redis-cli 重定向到 127.0.0.1

    我在PC1上启动Redis集群 然后在PC2上连接它 当需要重定向到另一个集群节点时 它会显示Redirected to slot 7785 located at 127 0 0 1 但应该显示Redirected to slot 7785
  • 有没有办法在 ruby​​ 中重新定义 []=+

    我正在尝试编写一个简单的 DSL 针对 Redis 并且我想自己定义 I have def key val redis zadd name val key end 我想定义 def key val redis zincrby name va
  • Redis发布/订阅:查看当前订阅了哪些频道

    我目前有兴趣查看我拥有的 Redis 发布 订阅应用程序中订阅了哪些频道 当客户端连接到我们的服务器时 我们将它们注册到如下所示的通道 user user id 这样做的原因是我希望能够看到谁 在线 目前 我在不知道客户端是否在线的情况下盲
  • 如何在Redis中从hmset()切换到hset()?

    我收到弃用警告 即 Redis hmset 已弃用 请改用 Redis hset 但是 hset 采用第三个参数 我不知道是什么name应该是 info users 10 timestamp datetime utcnow strftime
  • Redis、会话过期和反向查找

    我目前正在构建一个网络应用程序 并想使用 Redis 来存储会话 登录时 会话会使用相应的用户 ID 插入到 Redis 中 并且过期时间设置为 15 分钟 我现在想实现会话的反向查找 获取具有特定用户 ID 的会话 这里的问题是 由于我无
  • redis - 使用哈希

    我正在使用 redis 为我的 Web 应用程序实现社交流和通知系统 我是 redis 的新手 我对哈希值及其效率有一些疑问 我读过这篇很棒的文章Instagram 帖子 http instagram engineering tumblr
  • 如何使redis中的“HSET”子键“过期”?

    我需要使 Redis 哈希中所有超过 1 个月的密钥过期 这不可能 https github com antirez redis issues 167 issuecomment 2559040 为了保持 Redis 简单 https git
  • 如何使 Redis 缓存中数据层次结构(树)的部分内容无效

    我有一些产品数据 需要在 Redis 缓存中存储多个版本 数据由 JSON 序列化对象组成 获取普通 基本 数据的过程很昂贵 将其定制为不同版本的过程也很昂贵 因此我想缓存所有版本以尽可能进行优化 数据结构看起来像这样 BaseProduc
  • StackExchange.Redis Get 函数抛出 TimeoutException

    我在用着StackExchange Redis与 C 和StackExchangeRedisCacheClient Get函数抛出以下异常 myCacheClient Database StringGet txtKey Text myCac
  • 如何在Redis中只保存一个数据库?

    我是 Redis 新手 有一个与备份相关的问题 目前 我有一个实例在 Windows 服务器上运行 在这个实例中 我当前有一项 工作 将数据存储在一个数据库中 我不想备份这些数据 我必须创造一份新工作 我的第一个想法是将数据存储在另一个数据
  • 如何将“.csv”数据文件导入Redis数据库

    如何将 csv 数据文件导入 Redis 数据库 csv 文件中包含 id 时间 纬度 经度 列 您能否向我建议导入 CSV 文件并能够执行空间查询的最佳方法 这是一个非常广泛的问题 因为我们不知道您想要什么数据结构 您期望什么查询等等 为

随机推荐

  • 刷题-leetcode-字节跳动高频题

    字节跳动研发岗高频考题之链表 lt 持续更新 7月8日 gt 链表 0 单链表的增删查改 1 反转链表 206 2 相交链表 160 3 环形链表II 142题 4 合并两个有序链表 5 合并K个排序链表 5 回文链表 6 环形链表 7 环
  • 如何设计一个安全的对外接口

    来源 juejin im post 5dd5283af265da47a11f5578 1 前言 最近有个项目需要对外提供一个接口 提供公网域名进行访问 而且接口和交易订单有关 所以安全性很重要 这里整理了一下常用的一些安全措施以及具体如何去
  • blender05乐高中级版

    1 新建一个2 4的平面 2 点击环切 将平面切割为两个平面 3 选中两个面 按下I内部挤压 变成下面的样子 但其实这样不对 x和y的距离不一样长 所以要回到物体模式 点击应用 点击缩放 将x y z的缩放比例都设置为1 4 继续环切 成下
  • IAR使用之破解

    http www amobbs com thread 5526625 1 1 html 对于学习AVR单片机的人来说 IAR是必不可少的开发软件 IAR以编译效率高著称 相比AVR STUDIO 6 0 它有小巧的体型 这点对于电脑配置不是
  • 大数据是什么意思

    在大数据的越来越火的今天 相信很多朋友都不清楚大数据到底是什么 可以解决实际生活中的什么问题 那么今天科多大数据老师就给各位小伙伴儿普及下大数据的概念吧 大数据到底是什么勒 大数据 是一个体量特别大 数据类别特别大的数据集 并且这样的数据集
  • 请用 python 打印出 10000 以内的对称数 (对称数特点:数字左右对称,如:1,2,11,121,1221 等)

    就用正序等于倒序的办法就可解决 lis for i in range 1 10000 i str i if i i 1 lis append i print lis ps 这个面试题在这么大的网站中找起来居然这么费劲 不是收费就是广告
  • 【硬创邦】跟hoowa学做智能路由(二):从芯片开始

    上一章我们讲了 这次DIY活动的来龙去脉 本章我们将一起了解下路由器的架构 芯片 操作系统相关的知识 我们的目标是让大家都能做智能路由 所以hoowa会尽可能少涉及到嵌入式的知识 因为这孩子本身学习就不好 他自己也害怕那些所谓的各种 定义
  • delphi xe10.2 FIREDAC 三种连接

    以下都是在DELPHI XE10 2中测试通过 FireDAC supports three distinct options for connecting to your database These are Temporary conn
  • 越狱iOS设备利用itms-services协议,实现Safari一键安装IPA

    http kryhear asia blog 2012 07 14 use itms services install ipa to a jailbreak ios device 利用MobileInstallation实现IPA程序安装后
  • Python 3.8 pandas 安装不了

    如果您在安装 Pandas 时遇到了问题 有以下几种常见解决方案 检查您的 Python 版本是否为 3 8 Pandas 对于 Python 3 8 的支持可能不是很好 因此您可以尝试安装旧版本的 Pandas 检查您是否安装了所有 Pa
  • C语言这么厉害,它自身又是用什么语言写的?

    作者 码农翻身刘欣 出自 码农翻身 ID coderising 这是来自我的星球的一个提问 C语言本身用什么语言写的 换个角度来问 其实是 C语言在运行之前 得编译才行 那C语言的编译器从哪里来 用什么语言来写的 如果是用C语言本身来写的
  • opencv中图像的旋转

    opencv中进行图像旋转的方法 flip函数 rotate函数但是这两种函数只能进行90 180 270的旋转 CV EXPORTS W void flip InputArray src OutputArray dst int flipC
  • 《数据挖掘导论》笔记(四)

    分类 本章介绍分类的基本概念 讨论诸如模型的过拟合等关键问题 并提供评估和比较分类技术性能的方法 尽管本章主要关注一种称作决策树归纳的技术 但是本章讨论的大部分内容也适用于其他的分类技术 预备知识 分类任务的输入数据是记录的集合 每条记录称
  • SQL查询半年内没有违纪记录,并且期末考试总分为每个班级前10名的学生名单。(日期函数、where、group by)

    面试题 有三张表 学生表 期末成绩表 违纪表 查询半年内没有违纪记录 并且期末考试总分为每个班级前10名的学生名单 解题思路 可以把这个复杂业务问题 使用多维度拆解分析方法 拆解为以下3个子问题 1 从 违纪表 中查询半年内有违纪记录的学生
  • MMClassification Python 教程(二)

    若纠结查看格式可以移步 学习笔记https study chenkequan cn E6 B7 B1 E5 BA A6 E5 AD A6 E4 B9 A0 E6 A1 86 E6 9E B6 openLab E7 B3 BB E5 88 9
  • FBX与Opengl骨骼系统

    转自 http blog csdn net mink365 article details 6328033 FBX是Autodesk提供的一个三维模型格式 由于AutoDesk已经收购了Maya 3D max等流行三维建模软件 FBX可以说
  • hadoop集群配置

    一个具体的配置 这里只搭建一个三台主机的小机群 10 37 128 2 master namenode jobtracker master 主机名 10 37 128 3 salve datanode tasktracker slave1
  • 在服务器上部署 Nginx 并设置图片服务器

    当您在服务器上部署 Nginx 并设置图片服务器时 以下是大致的步骤 安装 Nginx 使用适用于您的操作系统的包管理器安装 Nginx 编辑 Nginx 配置文件 找到 Nginx 的配置文件 通常位于 etc nginx nginx c
  • matplotlib柱状图给指定的柱换颜色_Python全栈之路-15-matplotlib

    本文jupyter notebook 地址 github com import numpy as np import pandas as pd import matplotlib import matplotlib pyplot as pl
  • Redis持久化RDB与AOF

    前言 我们知道Redis是一款内存服务器 就算我们对自己的服务器足够的信任 不会出现任何软件或者硬件的故障 但也会有可能出现突然断电等情况 造成Redis服务器中的数据失效 因此 我们需要向传统的关系型数据库一样对数据进行备份 将Redis