[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.rhkb.cn/news/357189.html

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

相关文章

Linux驱动开发笔记(十三)Sysfs文件系统

文章目录 前言一、Sysfs1.1 Sysfs的引入1.2 Sysfs的目录结构1.2 Sysfs的目录详解1.2.1 devices1.2.2 bus1.2.3 class1.2.4 devices、bus、class目录之间的关系1.2.5 其他子目录 二、Sysfs使用2.1 核心数据结构2.2 相关函数2.2.1 kobject_create_and_add2.2.2 kobject_put()2.2.…

AIGC时代的英语教育:人工智能会取代英语老师吗?

在当前AIGC(Artificial Intelligence Generated Content)时代,人工智能技术正在迅速发展并渗透到各个领域,其中包括英语教育。面对这一趋势,许多人担心人工智能会取代传统的英语教师。然而,本文将探讨人工智…

RocketMQ源码学习笔记:Broker启动流程

这是本人学习的总结,主要学习资料如下 马士兵教育rocketMq官方文档 目录 1、Broker启动流程2、一些重要的类2.1、MappedFile2.2、MessgeStore2.3、MessageStore的加载启动流程 3、技术亮点3.1、 内存映射3.1.1、简介3.1.2、源码 1、Broker启动流程 Broker启动流程…

Python数据容器

容器定义列表 list定义下标索引列表的方法查询指定元素的下标 index(元素)修改指定下标的元素值插入元素 insert(index,元素)追加一个元素 append(元素)追加一批元素 extend(容器)删除指定下标的元素删除指定元素的第一次出现 remove(元素)清空列表 clear()统计列表中指定元素的…

SD-WAN组网如何帮助企业降低网络成本?

企业在构建IT网络时,常常面临节省费用和提升效益的挑战。IT开销主要包括设备、网络和维护成本。利用OgCloud的SD-WAN组网方案,企业可以有效地应对这些问题。 企业专线网络的高成本问题 企业专线的费用较高,而且数据不能同时在多条专线上传输。…

[FreeRTOS 功能应用] 互斥访问与回环队列 功能应用

文章目录 一、基础知识点二、代码讲解三、结果演示四、代码下载 一、基础知识点 [FreeRTOS 基础知识] 互斥访问与回环队列 概念 [FreeRTOS 内部实现] 互斥访问与回环队列 [FreeRTOS 内部实现] 创建任务 xTaskCreate函数解析 本实验是基于STM32F103开发移植FreeRTOS实时操作系…

“论微服务架构及其应用”写作框架,软考高级,系统架构设计师

论文真题 论微服务架构及其应用近年来,随着互联网行业的迅猛发展,公司或组织业务的不断扩张,需求的快速变化以及用户量的不断增加,传统的单块(Monolithic)软件架构面临着越来越多的挑战,已逐渐…

关于DrawTools的分析- 一个优秀的C#开源绘图软件

国外大佬,曾经写过两个关于DrawTools相关的开源绘图软件。 我更新了一个优化的版本如下图,稍后会发布更新给大家。 需要的用户可发邮件给我 448283544qq.com 应用于AGV地图编辑器如下: 那么这个优于很多普通的画布软件,包含点、…

STM32项目分享:家庭环境监测系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 2.PCB板打样焊接图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片: 哔哩哔哩视频链接: https://www.bilibili.…

系统架构师概述

引言 系统架构设计师是项目开发活动中的众多角色之一,它可以是一个小组或者一个人或者是一个团队,架构师包含建筑师,设计师,创造者,缔造者,可以说架构师就是我们社会各个领域的创造者和缔造者。从组织上划分…

【OS基础】符合AUTOSAR标准的RTAOS-Alarms详解

目录 前言 正文 7.报警Alarms 7.1配置Alarms 7.1.1激活一个任务 7.1.2 设置一个事件 7.1.3报警回调Alarm Callback 7.1.4 增加计数器值 7.2设置Alarms 7.2.1 绝对Alarms 7.2.2 相对Alarm 7.3自启动Alarms 7.4 删除Alarms 7.5确认何时会发生Alarm 7.6非周期Alarm…

Golang | Leetcode Golang题解之第179题最大数

题目&#xff1a; 题解&#xff1a; func largestNumber(nums []int) string {sort.Slice(nums, func(i, j int) bool {x, y : nums[i], nums[j]sx, sy : 10, 10for sx < x {sx * 10}for sy < y {sy * 10}return sy*xy > sx*yx})if nums[0] 0 {return "0"…

网络安全-如何设计一个安全的API(安全角度)

目录 API安全概述设计一个安全的API一个基本的API主要代码调用API的一些问题 BasicAuth认证流程主要代码问题 API Key流程主要代码问题 Bearer auth/Token auth流程 Digest Auth流程主要代码问题 JWT Token流程代码问题 Hmac流程主要代码问题 OAuth比较自定义请求签名身份认证&…

Golang | Leetcode Golang题解之第167题两数之和II-输入有序数组

题目&#xff1a; 题解&#xff1a; func twoSum(numbers []int, target int) []int {low, high : 0, len(numbers) - 1for low < high {sum : numbers[low] numbers[high]if sum target {return []int{low 1, high 1}} else if sum < target {low} else {high--}}r…

示例:WPF中应用Grid的SharedSizeGroup设置整齐的布局

一、目的&#xff1a;应用Grid的SharedSizeGroup设置整齐的布局 二、实现 <ItemsControl ItemsSource"{local:GetStudents Count5}"><ItemsControl.ItemTemplate><DataTemplate><Grid ShowGridLines"True"><Grid.ColumnDefinit…

51单片机STC89C52RC——3.1 数码管静态展示

目的 让数码管在指定位置显示指定数字 一&#xff0c;STC单片机模块 二&#xff0c;数码管 2.1 数码管位置 2.2 生活中用到的数目管 红绿灯 LED数码管在生活中随处可见&#xff0c;洗衣机、电饭煲、热水器、微波炉、冰箱、这些最基本的家用电器上基本都用到了这种7段LED数…

[手机Linux PostmarketOS]一,1加6T真正的手机Linux系统

前面用Linux deploy软件安装了Linux系统在手机&#xff0c;实则不是真正的手机刷成了linux系统&#xff0c;而是通过Linux deploy软件在容器里安装了Linux系统&#xff0c;在使用方面会有诸多限制&#xff0c;并不能发挥Linux的真实强大之处&#xff0c;于是我又百度又谷歌(真不…

51单片机STC89C52RC——5.1 LCD1602液晶显示屏

目录 目的 一&#xff0c;STC单片机模块 二&#xff0c;LCD1602 2.1 模块简介 2.2 针脚 2.3 DDRAM地址与显示器对应关系 2.4 标准字库表 2.5 常用指令 2.6 读写操作 三&#xff0c;创建Keil项目 四&#xff0c;代码 五&#xff0c;代码编译、下载到51单片机 六&a…

掌握Three.js:学习路线,成为3D可视化开发的高手!

学习Three.js可以按照以下路线进行&#xff1a; 基础知识&#xff1a; 首先要了解基本的Web开发知识&#xff0c;包括HTML、CSS和JavaScript。如果对这些知识已经比较熟悉&#xff0c;可以直接进入下一步。 Three.js文档&#xff1a; 阅读Three.js官方文档是学习的第一步。官…

【Flutter 专题】120 Flutter 腾讯移动通讯 TPNS~

1.2 方法使用 小菜按照官网的介绍尝试了一些常用的 API 方式&#xff0c;主要分为应用类&#xff0c;账号类和标签类三种 API&#xff0c;小菜业务中没有应用账号和标签模块&#xff0c;暂未深入研究&#xff1b; 应用接口 API a. 注册推送服务 对于服务的注册初始化&#x…