[Redis]持久化机制

news2024/11/20 8:44:24

众所周知,Redis是内存数据库,也就是把数据存在内存上,读写速度很快,但是,内存的数据容易丢失,为了数据的持久性,还得把数据存储到硬盘上

也就是说,内存有一份数据,硬盘也应该有一份数据,而且两份数据应该是相同的

也就是说硬盘上的数据应该是内存上数据的备份。

Redis给我们提供了两种策略来实现数据的持久化,RDB和AOF

RDB

RDB定期的把Redis内存中的所有数据,都写到硬盘上,生成一个“快照”,这个快照,本质上就是一个.rdb后缀的文件

.rdb的位置在redis.conf配置里设置

配置文件位置: 

 设置的工作目录

 

 查看工作目录

生成快照时机

手动触发

通过redis客户端,执行特定的命令,来触发快照生成

1)save

save命令会阻塞其他客户端的命令,一般不建议使用,在高并发场景下容易挂掉

2)bgsave

用fork创建子进程的方式,来完成并发编程,让子进程去生成快照

如果多个客户端同时bgsave,也只会生成一个子进程

fork命令创建子进程,子进程复制父进程的内存、文件描述符等,但是是写时拷贝,父子进程共享相同的物理内存页,在内存没有改变的时候,指向的同一块内存地址空间,省去复制的开销

自动触发

在redis配置文件中设置,让redis自动每隔多长时间/产生多少次修改 就触发生成快照

这表示

  • 每900秒(15分钟)如果有至少1次写操作,则触发RDB快照。
  • 每300秒(5分钟)如果有至少10次写操作,则触发RDB快照。
  • 每60秒如果有至少10000次写操作,则触发RDB快照。
  • (如果设置为 save "")表示关闭自动生成快照

 当生成rdb镜像操作的时候,先把要生成的快照数据保存到一个临时文件中,当快照生成完毕之后,再把原来的rdb文件删掉,把新文件改名为刚才的文件名(dump.rdb)

从始至终,rdb文件都只有一个

rdb文件损坏

一般不要手动去修改rdb文件,会出现不可预知的问题。

丢失数据外,还可能因为读取数据失败而启动redis服务器失败

如果redis服务器挂了,可以看看redis的日志,看看发生了啥

 (这个路径也是在配置文件中设置的)

打开日志文件后,发现

 表示在恢复数据的时候没读完,意外读到了EOF文件结束符

这时候,可以通过redis提供的rdb文件的检查工具,检查问题

redis-check-rdb dump.rdb命令不会真的启动服务器,而是以检查工具的方式运行

 发现了问题所在

AOF

AOF通过将每个写操作记录到日志文件来实现持久化

AOF默认是关闭状态

可以在Redis配置文件(redis.conf)中进行配置

# 启用AOF
appendonly yes

# 设置AOF文件名称
appendfilename "appendonly.aof"

# 设置AOF同步策略
appendfsync everysec

# 启用AOF重写
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

 AOF工作流程

AOF不会影响Redis对请求的处理速度 

AOF会把写操作写入内存中的EAOF缓冲区,积累一波后,再统一刷盘到硬盘

刷盘时机

在Redis配置文件(redis.conf)中可以进行配置

# 设置AOF同步策略
appendfsync everysec

 appendfsync always

线程调用 write 执行写操作后,后台线程( aof_fsync 线程)立即会调用 fsync 函数同步 AOF 文件(刷盘),fsync 完成后线程返回,这样会严重降低 Redis 的性能(write + fsync

appendfsync everysec

主线程调用 write 执行写操作后立即返回,由后台线程( aof_fsync 线程)每秒钟调用 fsync 函数(系统调用)同步一次 AOF 文件(write+fsyncfsync间隔为 1 秒)

appendfsync no

主线程调用 write 执行写操作后立即返回,让操作系统决定何时进行同步,Linux 下一般为 30 秒一次(write但不fsyncfsync 的时机由操作系统决定)

 重写机制

当 AOF 变得太大时,Redis 能够在后台自动重写 AOF 产生一个新的 AOF 文件,这个新的 AOF 文件和原有的 AOF 文件所保存的数据库状态一样,但体积更小。

重写原理

如果某个键经历了多次更新操作,AOF文件中会有多条命令记录该键的变化。

例如set key 111;set key 222; set key 333 这里对key执行了多次更新操作,但对于现在来说,只有最后的更新有意义,所以只需要保存最后一次更新就好
 

 重写流程

  • 1.触发重写: AOF重写可以由用户手动触发(通过 bgrewriteaof 命令)或根据配置自动触发。自动触发通常基于两个条件:

    • AOF文件的大小增长到上次重写后的两倍。
    • AOF文件的大小超过指定的最小值。

可以在配置文件中设置自动触发

# 启用AOF重写

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

  • auto-aof-rewrite-percentage 100 : 执行 AOF 重写时,当前 AOF 大小(aof_current_size)和上一次重写时 AOF 大小(aof_base_size)的比值。如果当前 AOF 文件大小增加了这个百分比值,将触发 AOF 重写。将此值设置为 0 将禁用自动 AOF 重写。默认值为 100。
  • auto-aof-rewrite-min-size 64mb:如果 AOF 文件大小小于该值,则不会触发 AOF 重写。默认值为 64 MB;
  • 2.创建子进程: Redis会fork一个子进程来执行AOF重写操作。子进程会创建一个新的AOF文件,并将当前的数据集以Redis命令的形式写入该文件。

  • 3.记录重写期间的写操作: 当子进程在进行AOF重写时,主进程仍然在处理新的写操作。这些新的写操作会被记录到重写缓冲区(rewrite buffer)中。

  • 4.完成重写并同步数据: 当子进程完成新的AOF文件写入后,它会通知主进程。主进程会将重写缓冲区中的数据同步到新的AOF文件中,以确保所有写操作都被记录。

  • 5.替换旧的AOF文件: 一旦新AOF文件完成并同步所有数据,Redis会用新的AOF文件替换旧的AOF文件。

 

校验机制

AOF 校验机制是 Redis 在启动时对 AOF 文件进行检查,以判断文件是否完整,是否有损坏或者丢失的数据。这个机制的原理其实非常简单,就是通过使用一种叫做 校验和(checksum) 的数字来验证 AOF 文件。这个校验和是通过对整个 AOF 文件内容进行 CRC64 算法计算得出的数字。如果文件内容发生了变化,那么校验和也会随之改变。因此,Redis 在启动时会比较计算出的校验和与文件末尾保存的校验和(计算的时候会把最后一行保存校验和的内容给忽略点),从而判断 AOF 文件是否完整。如果发现文件有问题,Redis 就会拒绝启动并提供相应的错误信息。AOF 校验机制十分简单有效,可以提高 Redis 数据的可靠性。

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

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

相关文章

python是TIOBE编程语言排名第一的编程语言,它有什么优点?它的使用场景有哪些?用python打印数字1--100,用python打印九九乘法表怎么写?

Python是TIOBE编程语言排行榜排名第一的编程语言 。 python是一种解释性、交互式、面向对象的跨平台的语言。 python设计者及名称由来 Guido van Rossum 荷兰人---吉多范罗苏姆,是 Python 编程语言的最初设计者,在 Python 社区一直担当终身仁慈独裁者&…

【权威出版/投稿优惠】2024年水利水电与能源环境科学国际会议(WRHEES 2024)

2024 International Conference on Water Resources, Hydropower, Energy and Environmental Science 2024年水利水电与能源环境科学国际会议 【会议信息】 会议简称:WRHEES 2024 大会时间:点击查看 截稿时间:点击查看 大会地点:…

聊一聊大模型应用落地那些事

大模型并不神奇 很多人听到"大模型"这个词可能会觉得很神秘,其实,LLM 就是神经网络,只是很大的神经网络,相对传统神经网络,大就是它的特点。我们用一个压缩算法的简单例子来帮助理解这个巨大的神经网络。 …

.[nicetomeetyou@onionmail.org].faust深入剖析勒索病毒及防范策略

引言: 在数字化时代,网络安全问题日益凸显,其中勒索病毒无疑是近年来网络安全的重大威胁之一。勒索病毒以其独特的加密机制和恶意勒索行为,给个人和企业带来了巨大的经济损失和数据安全风险。本文将从勒索病毒的传播方式、攻击链、…

.net 6 api 修改URL为小写

我们创建的api项目,url是[Route(“[controller]”)],类似这样子定义的。我们的controller命名是大写字母开头的,显示在url很明显不是很好看(url不区分大小写)。转换方式: var builder WebApplication.Crea…

SpringBoot整合阿里云短信服务

文章目录 1. 准备工作2. 添加依赖3. 配置阿里云短信服务4. 创建配置类5. 创建服务类6.自定义异常7.使用服务类发送短信8.测试短信 1. 准备工作 注册阿里云账号:首先确保你有一个阿里云账号,并且已经开通了短信服务。获取AccessKey ID和AccessKey Secret…

奇怪的缓存一致性问题

天猫国际用户Push中心承接了国际用户触达相关的需求,比如短信、端内消息投放等等,并存在较高的并发场景。 该系统此前发现了一个查询投放计划plan为null的异常情况,在初期排查时有些丈二和尚摸不着头脑,后面突然灵光乍现——原来是…

探索线性回归模型

目录 一 线性回归的理论基础 什么是线性回归? 线性回归的假设 最小二乘法 二 线性回归的数学推导 线性回归参数的推导 多元线性回归 三 线性回归的模型构建 数据准备 训练模型 模型评估 四 线性回归的代码实现 基本实现 多元线性回归 五 线性回归的应用场景 预…

pygame游戏开发

Pygame游戏开发 pygame简介 模块库请参考:pygame官方文档 pygame可以用作游戏开发,但在商业游戏中真正的开发工具却不是pygame。使用pygame开发游戏周期长。 安装pygame 在pycharm中安装第三方库pygame: 在计算机中安装pygame&#xf…

C# OCCT Winform 界面搭建

目录 1.创建一个WInform项目 2.代码总览 代码解析 3.添加模型到场景 4.鼠标交互 1.创建一个WInform项目 2.代码总览 using Macad.Occt.Helper; using Macad.Occt; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Remoting.Co…

机器学习课程复习——支持向量机

支持向量机是一种二类分类模型。基本模型:定义在特征空间上的间隔最大的线性分类器模型升级:线性分类器+核技巧=非线性分类器学习策略:间隔最大化(可形式化为求解凸二次规划的问题;可等价于正则化的合页损失函数的最小化问题)学习算法:求解图二次规划的最优化算法支持向…

什么是Linux挂载

首先先说一下在Linux中一切皆文件(硬件设备也是文件),所有文件都是存放在以根目录为树形目录结构中;下面来说说一下什么是挂载 挂载:指的就是将设备文件中的顶级目录连接到 Linux 根目录下的某一目录(最好是…

架构师篇-1、总体架构设计

业务架构哲学本质 定位:赋予业务架构设计能力,具备业务架构设计思维模型,掌握业务架构哲学本质,形成以不变应万变的业务架构设计能力。 架构师所需要的能力: 带领业务成功通过框架思维赋能业务架构师知识体系构建掌…

如何卸载windows系统自带游戏

为了清晰地指导如何卸载Windows系统自带游戏,我们可以参考以下步骤进行: 方法一:通过控制面板卸载 打开控制面板进入程序和功能在控制面板中,找到并点击“程序和功能”。在程序列表中,找到你想要卸载的自带游戏。 方…

反激开关电源压敏电阻选型及计算

作用:在浪涌时间里面吸收一个很高的浪涌电压 压敏电阻对电压敏感,有变阻电压阈值 在电压阈值以下,表现出阻抗很大,超过电压阈值,表现出阻抗很小 压敏的选型及计算 压敏电阻的作用是抑制来自电源在异常时的尖峰电压和瞬态过电压&a…

C++编程入门,五个学习阶段让你变成高手

C是一门非常复杂而强大的编程语言,涵盖了广泛的知识领域,从语法基础到高级特性,再到网络通信和数据库操作,都需要逐步掌握。如果你是一个编程新手,尤其是对C感兴趣的新手,可能会发现这门语言的学习曲线有些…

【Linux】进程间通信3——system V共享内存

1.system V进程间通信 管道通信本质是基于文件的,也就是说操作系统并没有为此做过多的设计工作,而system V IPC是操作系统特地设计的一种通信方式。但是不管怎么样,它们的本质都是一样的,都是在想尽办法让不同的进程看到同一份由操…

HTML静态网页成品作业(HTML+CSS)——新媒体专业介绍介绍网页(1个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有1个页面。 二、作品演示 三、代…

韩国裸机云站群服务器托管租用方案

随着网络技术的飞速发展,站群服务器在网站运营中扮演着越来越重要的角色。韩国裸机云站群服务器,以其独特的优势,如地理位置优越、价格相对较低、技术实力雄厚等,吸引了众多企业的关注。本文将为您详细介绍韩国裸机云站群服务器的…

机器学习课程复习——朴素贝叶斯

1. 定义 是一种基于贝叶斯定理与特征条件独立假设的生成式分类方法。 2. 公式 原版公式 简化版公式 由于上述公式无法计算,引入条件独立假设 条件独立版公式 3. 贝叶斯分类器 由上述公式可得贝叶斯分类器 化简为 4. 参数估计 4.1. 极大似然估计 4.2. 学习与分…