[Redis]持久化机制

众所周知,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 数据的可靠性。

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

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

相关文章

【iOS】编译二进制文件说明

编译二进制文件说明 如何生成文件路径文件说明第一部分:.o文件第二部分:link第三部分:Segment第四部分:Symbol 如何生成 使用Xcode进行编译 ,会生成二进制相关文件,可以更详细看产物的布局 项目Target -&…

使用粒子滤波(particle filter)进行视频目标跟踪

虽然有许多用于目标跟踪的算法,包括较新的基于深度学习的算法,但对于这项任务,粒子滤波仍然是一个有趣的算法。所以在这篇文章中,我们将介绍视频中的目标跟踪:预测下一帧中物体的位置。在粒子滤波以及许多其他经典跟踪…

容器之布局容器的演示

代码; #include <gtk-2.0/gtk/gtk.h> #include <glib-2.0/glib.h> #include <gtk-2.0/gdk/gdkkeysyms.h> #include <stdio.h>void change_image(GtkFileChooserButton *filebutton, // GdkEvent *event,GtkImage *image) {gtk_image_set_from_file(im…

Vue3 - 在项目中使用vue-i18n不生效的问题

检查和配置 Vue I18n 确保你已经正确安装了Vue I18n并且配置了组合API模式。 安装 Vue I18n npm install vue-i18nnext配置 i18n.js import { createI18n } from vue-i18n; import messages from ./messages;const i18n createI18n({legacy: false, // 使用组合 API 模式l…

DC-DC 高压降压、非隔离AC-DC、提供强大的动力,选择优质电源芯片-(昱灿)

畅享长续航&#xff0c;尽在我们的充电芯片&#xff01; 无论是手机、平板还是智能设备&#xff0c;长时间使用后电量不足总是令人头疼。然而&#xff0c;我们的充电芯片将为您带来全新的充电体验&#xff01;采用先进的技术&#xff0c;我们的充电芯片能够提供快速而稳定的充电…

逻辑地址 线性地址 物理地址 Linux kernel 内存管理设计

linux kernel 2.6以后的MM&#xff0c;受到了兼容 risc arch cpu 的 MM 的启发&#xff0c;新的 MM 架构对 x86 上任务切换的效率上也有明显提高。 新的MM架构&#xff0c;GDT 不再随着进程的创建与结束而创建和删除 新的表项。 TSS段 也只有一个&#xff0c;进程切换时&…

upload-labs实验过程中遇到的问题

第6题问题&#xff1a;500异常码 发现500异常码&#xff0c;这个应该是apache版本问题&#xff0c;可更换其他版本&#xff0c;或者更换为nginx 12题问题&#xff1a;上传出错 出现上传错误&#xff0c;大概率是php版本问题&#xff0c;需要下载php5.2.17版本的php或者更换其他…

华为云下Ubuntu20.04中Docker的部署

我想用Docker拉取splash&#xff0c;Docker目前已经无法使用&#xff08;镜像都在国外&#xff09;。这导致了 docker pull 命令的失败&#xff0c;原因是timeout。所以我们有必要将docker的源设置在国内&#xff0c;直接用国内的镜像。 1.在华为云下的Ubuntu20.04因为源的原因…

使用Spring Boot实现用户认证和授权

文章目录 引言第一章 Spring Boot概述1.1 什么是Spring Boot1.2 Spring Boot的主要特性 第二章 用户认证和授权基础知识2.1 用户认证2.2 用户授权2.3 Spring Security概述 第三章 项目初始化第四章 实现用户认证和授权4.1 定义用户实体类和角色实体类4.2 创建Repository接口4.3…

点击旋转箭头样式

实现效果&#xff1a; html界面&#xff0c;主要通过isdown来控制箭头是上还是下 <el-popoverplacement"bottom"trigger"click":visible-arrow"false"v-model"isdown"popper-class"user-popover"><divslot"re…

IF膨胀时代,“水刊”当赢?2023热门“水刊”影响因子详解!

【欧亚科睿学术】 1 “四大水刊”详情 图片来源&#xff1a;欧亚科睿学术整理 “四大水刊”的影响因子均有所下跌&#xff0c;其中&#xff0c;曾经被列入中科院预警名单的期刊MEDICINE&#xff0c;其影响因子已是连续三年持续下降。从JCR分区来看&#xff0c;四本期刊分区均…

【已解决】Qwen2:KeyError: ‘qwen2‘

问题背景&#xff1a; 在运行 Qwen2-7B-Instruct 时&#xff0c;报错&#xff1a;KeyError: qwen2 原因说明&#xff1a; Transformer版本过低&#xff0c;需要升级版本 解决方案&#xff1a; pip install -U transformers 参考&#xff1a; 【modelscope_Qwen2-7B-Instr…

windows设置开机启动项

将文件放到下面路径即可实现每次开机启动 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup

胖东来启示录:传统商超如何逆境求生?

近日&#xff0c;经过胖东来精心调改的永辉超市郑州信万广场店盛大开业&#xff0c;首日销售额高达188万元&#xff0c;客流量突破1.2万人&#xff0c;业绩飙升13.9倍&#xff0c;这一惊人数据无疑为当前低迷的传统商超行业带来了一线生机。胖东来&#xff0c;这位零售业的黑马…

[数据集][目标检测]棉花叶子害虫检测数据集VOC+YOLO格式595张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;595 标注数量(xml文件个数)&#xff1a;595 标注数量(txt文件个数)&#xff1a;595 标注类别…

小程序 UI 设计缔造独特魅力

小程序 UI 设计缔造独特魅力

Linux_内核缓冲区

目录 1、用户缓冲区概念 2、用户缓冲区刷新策略 3、用户缓冲区的好处 4、内核缓冲区 5、验证内核缓冲区 6、用户缓冲区存放的位置 7、全缓冲 结语 前言&#xff1a; Linux下的内核缓冲区存在于系统中&#xff0c;该缓冲区和用户层面的缓冲区不过同一个概念&#x…

基于大型语言模型的全双工语音对话方案

摘要解读 我们提出了一种能够以全双工方式运行的生成性对话系统&#xff0c;实现了无缝互动。该系统基于一个精心调整的大型语言模型&#xff08;LLM&#xff09;&#xff0c;使其能够感知模块、运动功能模块以及一个具有两种状态&#xff08;称为神经有限状态机&#xff0c;n…

数据库管理-第207期 HTAP核心:列存技术探索(20240619)

数据库管理207期 2024-06-19 数据库管理-第207期 HTAP核心&#xff1a;列存技术探索&#xff08;20240619&#xff09;1 Oracle In-memory1.1 基本概念1.2 基本测试1.3 Exadata增强 2 OceanBase3 TiDB4 PolarDB总结 数据库管理-第207期 HTAP核心&#xff1a;列存技术探索&#…

atcoder abc 358

A welcome to AtCoder Land 题目&#xff1a; 思路&#xff1a;字符串比较 代码&#xff1a; #include <bits/stdc.h>using namespace std;int main() {string a, b;cin >> a >> b;if(a "AtCoder" && b "Land") cout <&…