[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 数据的可靠性。

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

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

相关文章

如何在 Windows 上安装 Docker Desktop

如何在 Windows 上安装 Docker Desktop Docker 是一个开放平台,用于开发、部署和运行应用程序。Docker Desktop 是 Docker 在 Windows 和 macOS 上的官方客户端,它使得开发者能够轻松地在本地环境中构建、运行和共享容器化应用程序。本文将详细介绍如何…

RuoYi Swagger请求401

问题描述: 提示:这里简述项目相关背景: 使用ruoyi-vue分离版,访问swagger,发现接口都调用失败:401 解决方案: 最终解决问题如下步骤: 1、 调用swagger中的接口,报错&a…

如何在SpringSecurity中配置基于角色的访问控制?

在Spring Security中配置基于角色的访问控制是保护应用程序和资源不被未授权访问的基本策略之一。这里,我们将详细介绍如何在配置中和方法级别上实现基于角色的访问控制。 1. 配置基于角色的访问控制 在Spring Security的配置类中,你可以使用HttpSecur…

揭秘MMAdapt:如何利用AI跨领域战胜新兴健康谣言?

MMAdapt: A Knowledge-Guided Multi-Source Multi-Class Domain Adaptive Framework for Early Health Misinformation Detection 论文地址: MMAdapt: A Knowledge-guided Multi-source Multi-class Domain Adaptive Framework for Early Health Misinformation Detection …

【Mysql】DQL操作单表、创建数据库、排序、聚合函数、分组、limit关键字

DQL操作单表 1.1 创建数据库 •创建一个新的数据库 db2 CREATE DATABASE db2 CHARACTER SET utf8;•将db1数据库中的 emp表 复制到当前 db2数据库 ** 1.2 排序** 通过 ORDER BY 子句,可以将查询出的结果进行排序 (排序只是显示效果,不会影响真实数据) 语法结构:…

算法:渐进记号的含义及时间复杂度计算

渐进记号及时间复杂度计算 渐近符号渐近记号 Ω \Omega Ω渐进记号 Θ \Theta Θ渐进记号小 ο \omicron ο渐进记号小 ω \omega ω渐进记号大 O \Omicron O常见的时间复杂度关系 时间复杂度计算:递归方程代入法迭代法套用公式法 渐近符号 渐近记号 Ω \Omega Ω …

每天写java到期末考试--接口1--基础--6.22

规则: 练习: 抽象类的抽象方法 动物类Animal package 期末复习;public abstract class Animal {private String name;private int age;//1.空构造public Animal(){}public Animal(String name,int age){this.ageage;this.namename;}public String getNa…

【C++提高编程-11】----C++ STL常用集合算法

🎩 欢迎来到技术探索的奇幻世界👨‍💻 📜 个人主页:一伦明悦-CSDN博客 ✍🏻 作者简介: C软件开发、Python机器学习爱好者 🗣️ 互动与支持:💬评论 &…

Nginx 负载均衡实现上游服务健康检查

Nginx 负载均衡实现上游服务健康检查 Author:Arsen Date:2024/06/20 目录 Nginx 负载均衡实现上游服务健康检查 前言一、Nginx 部署并新增模块二、健康检查配置2.1 准备 nodeJS 应用程序2.2 Nginx 配置负载均衡健康检查 小结 前言 如果你使用云负载均衡…

深入理解适配器模式:Java实现与框架应用

适配器模式是一种结构型设计模式,它允许将一个类的接口转换成客户端希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的类可以协同工作。在本篇博客中,我们将详细介绍适配器模式,并演示如何在Java中实现它。最后&#xff0…

python从入门到精通9:字符串简介

Python中的字符串是一种非常常见且重要的数据类型,用于存储一系列字符(如文本、数字、标点符号等)。Python的字符串处理功能强大且灵活,为开发者提供了丰富的操作方法和工具。下面我们将对Python字符串进行深入的解析。 1. 字符串…

对于大型 Clojure 项目,如何进行有效的代码组织和模块划分以提高可维护性?

在大型 Clojure 项目中,以下是一些有效的代码组织和模块划分的方法,可提高可维护性: 使用命名空间(namespace):将相关函数和数据结构组织到逻辑上相关的命名空间中,以便更好地理解和管理代码。按…

【Linux】 yum学习

yum介绍 在Linux系统中,yum(Yellowdog Updater, Modified)是一个用于管理软件包的命令行工具,特别适用于基于RPM(Red Hat Package Manager)的系统,如CentOS、Fedora和Red Hat Enterprise Linux…

【Arduino】实验使用ESP32单片机根据光线变化控制LED小灯开关(图文)

今天小飞鱼继续来实验ESP32的开发,这里使用关敏电阻来配合ESP32做一个我们平常接触比较多的根据光线变化开关灯的实验。当白天时有太阳光,则把小灯关闭;当光线不好或者黑天时,自动打开小灯。 int value;void setup() {pinMode(34…

数据分析面试八股文--技能软件类

Excel 数据透视表 数据透视表(Pivot Table)是 Excel 中一个强大的功能,用于快速汇总、排序、重新组织和分析数据集,可以在面试中被要求展示如何创建和使用数据透视表来进行数据分析。 考察点可能包括: 创建数据透视表分类、汇总数据使用数据透视表进…

音视频开发29 FFmpeg 音频编码- 流程以及重要API,该章节使用AAC编码说明

此章节的一些参数,需要先掌握aac的一些基本知识:​​​​​​aac音视频开发13 FFmpeg 音频 --- 常用音频格式AAC,AAC编码器, AAC ADTS格式 。_ffmpeg aac data数据格式-CSDN博客 目的: 从本地⽂件读取PCM数据进⾏AAC格…

cgroups v1简介

cgroup 概念 Cgroup,全称Control Group(控制组),是Linux系统内核提供的一个特性(Linux 2.6.24内核开始将Cgroup加入主线)。 主要作用: 限制和隔离一组进程对系统资源的使用,也就是…

【CARD】多变化字幕的上下文感知差异提炼(ACL 2024)

摘要 Multi-change captioning旨在用自然语言描述图像对中的复杂变化。和图像字幕相比,这个任务要求模型具有更高层次的认知能力来推理任意数量的变化。本文提出一种新的上下文感知差异提取网络(CARD)。给定一个图像对,CARD首先解…

vm.max_map_count是什么?起到什么作用

vm.max_map_count 是 Linux 内核中的一个参数,它决定了一个进程可以拥有的最大内存映射区域数。内存映射区域是指内存映射文件、匿名内存映射等。这个参数对于一些应用程序(如 Elasticsearch)特别重要,因为它们在运行时会创建大量…

socket通讯可以直接传地址吗?【面试】

在网络编程中,socket 通信不直接传输内存地址。这是因为网络通信是在不同的内存空间和可能不同的计算机之间进行的,内存地址在不同的进程和机器上没有意义。相反,socket 通信使用套接字(socket): IP地址&a…