【Redis学习1】Redis持久化机制详解

news2024/9/24 19:17:05

Redis持久化机制详解

一、Redis为什么需要持久化机制

Redis一般用作缓存,其数据存储在内存中,当Redis宕机后,内存中的数据将会丢失。因此使用缓存的时候,我们经常需要对内存中的数据进行持久化也就是将内存中的数据写入到硬盘中

Redis 不同于 Memcached 的很重要一点就是,Redis 支持持久化,而且支持 3 种持久化方式::

  • 快照(RDB)
  • 只追加文件(AOF)
  • RDB 和 AOF的混合持久化(Redis4.0新增)

二、RDB持久化

(一)什么是RDB持久化

1、快照持久化:在指定的时间间隔内将内存中的数据以快照的形式写入磁盘(内存中的数据以二进制序列化的形式写入磁盘)

2、在满足默认配置的RDB生成时,Redis会fork出子进程来进行持久化,不阻塞主进程的执行。子进程将数据写入临时文件,然后替换旧的RDB文件进而完成磁盘的写入,主进程可以处理读写请求。

RDB快照持久化是Redis默认采用的持久化方式,RDB默认配置的生成策略如下:

save 900 1           #在900(15分钟)之后,如果至少有1个key发生变化,Redis就会自动触发bgsave命令创建快照。

save 300 10          #在300(5分钟)之后,如果至少有10个key发生变化,Redis就会自动触发bgsave命令创建快照。

save 60 10000        #在60(1分钟)之后,如果至少有10000个key发生变化,Redis就会自动触发bgsave命令创建快照。

(二)RDB持久化的优、缺点

优点:

  • 1、直接存储内存数据的二进制序列化形式,占用磁盘更小
  • 2、宕机后重启恢复的速度比AOF快

缺点:

  • RDB持久化是需要Redis fork出子进程来执行持久化,频繁的执行成本较高

三、AOF持久化

(一)什么是AOF持久化

AOF(append only file)只追加文件:与快照持久化(RDB)相比,AOF持久化的实时性更好。AOF持久化默认是不开启的(Redis6.0 版本之后默认是开启的)

开启AOF持久化后每执行一条能改变Redis中数据的命令,1、Redis服务器就会将该指令追加到AOF缓冲区 2、然后调用write函数将数据将数据写到系统内核缓冲区(注意!!此时并没有同步到磁盘) 3、最后根据持久化方式(fsync策略)将缓存区的数据同步到磁盘中。

在这里插入图片描述
根据如上所述我们可以概述出,AOF工作基本流程。

(二)AOF持久化的基本流程

AOF持久化功能的实现可以简单分为5步:

  • 1、命令追加(append):Redis所执行的所有的写命令会追加到AOF缓冲区。
  • 2、文件写入(write):这一步需要调用write函数(系统调用)将数据写入到系统缓冲区,注意!!! 此时并没有写到磁盘
  • 3、文件同步(fsync):根据对应的持久化方式(fsync策略),调用fsync函数,进行磁盘的同步操作
  • 4、文件重写(rewrite):随着AOF文件越来越大,需要定期进行AOF的重写,来达到压缩的目的(注意:AOF重写并非是对旧的AOF文件进行重写来达到压缩的目的,而是通过重新去获取最新执行的Redis指令并生成一个新的AOF文件进而替换旧的AOF文件来完成重写:fork + 双写)
  • 5、重启加载(load):当Redis重启时,可以加载AOF文件进行数据恢复

(三)AOF持久化的三种回写策略(fsync策略)

Redis提供了三种不同的AOF持久化方式(fsync回写策略),分别是:Always、Everysec、No三种回写策略。

  • 1、Always:主线程调用write将数据写入到系统缓冲区后,立即调用fsync函数将数据同步到AOF文件,完成后线程返回。这样严重降低Redis的性能(write + fsync)
  • 2、Everysec:主线程调用write将数据写入系统缓冲区后立即返回,由后台线程每隔1s调用fsync函数将数据同步到AOF文件(write + fsync ,fsync时间间隔为1s)
  • 3、No:主线程调用write将数据写入系统缓冲区后立即返回,由操作系统决定何时进行同步。Linux下一般为30S一次(write 但不fsync,fsync的时机由操作系统决定)

(四)AOF重写

随着AOF文件变得越来越大,系统的性能将会受到影响,所以我们需要进行AOF的重写来达到压缩的目的。

我们这里需要注意AOF重写并非是对旧的AOF文件进行重写,而是根据缓存中最新的Redis指令生成一个新的AOF文件进而替换旧的AOF文件来完成重写。重写期间Redis还会维护一个AOF重写缓冲区

AOF重写逻辑主要分为两步:fork + 双写

  • 1、主线程先fork出子进程,子进程复制父进程的虚拟页表(此处为什么不是直接拷贝数据而是复制虚拟机页表呢,是为了防止一次性拷贝大量数据导致主线程阻塞过长和内存浪费的问题)
  • 2、子进程读取内存中的数据并写到AOF重写缓冲区进而同步到新的AOF文件中
  • 3、重写期间,主进程还是会正常接收写命令,新的命令不仅会写入AOF旧的文件,还会写入AOF新的文件,保证重写的过程中发生宕机旧的AOF文件还是全的
  • 4、重写完成后将新的AOF文件替换旧的AOF文件。

三、混合持久化

(一)AOF持久化

优点:
AOF持久化实时性更强,数据安全性更高
缺点:
AOF文件需要定期进行瘦身,宕机后恢复速度相比与RDB持久化要慢

(二)RDB持久化

优点:
DRB持久化存储的是二进制序列化的数据,宕机后恢复速度要比AOF持久化要快
缺点:
数据的实时性及安全性要差一些。

Redis4.0 提出了混合使用AOF和RDB的方式。
RDB快照按照一定的频率生成,两次快照间增量命令记录到AOF文件中。这种混合持久化即具备RDB的快速恢复能力,同时也具备跟高的数据安全性。

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

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

相关文章

vscode ssh linux C++ 程序调试

vscode调试c++程序相比vs2022要复杂很多,vs2022可以"一键运行调试",vscode则需要自己配置。 ​vscode调试程序时,会在当前工作目录产生.vscode 目录, 该目录有两个重要文件launch.json和tasks.json, 下面介绍两种调试方法: 手动调试和自动调试。 手动调试 不管…

k8s安全机制

安全机制 一、机制说明二、认证(Authentication)HTTP Token 认证HTTP Base 认证HTTPS 证书认证(最严格) 三、鉴权(Authorization)角色角色绑定主体(subject)Role and ClusterRoleRol…

实现一个简单的线性回归和多项式回归(2)

对于多项式回归,可以同样使用前面线性回归中定义的LinearRegression算子、训练函数train、均方误差函数mean_squared_error,生成数据集create_toy_data,这里就不多做赘述咯~ 拟合的函数为 def sin(x):y torch.sin(2 * math.pi * x)return y1.数据集的建…

3、在 CentOS 8 系统上安装 PostgreSQL 15.4

PostgreSQL,作为一款备受欢迎的开源关系数据库管理系统(RDBMS),已经存在了三十多年的历史。它提供了SQL语言支持,用于管理数据库和执行CRUD操作(创建、读取、更新、删除)。 由于其卓越的健壮性…

Linux网络监控工具 - nethogs

nethogs 是一个基于命令行的网络监控工具,用于实时监视每个进程的网络流量。它可以显示每个进程使用的带宽、连接数和数据包数量等信息。 安装 在大多数Linux发行版中,您可以使用包管理器来安装 nethogs。例如,在Ubuntu/Debian上&#xff0c…

【Java 进阶篇】CSS语法格式详解

在前端开发中,CSS(层叠样式表)用于控制网页的样式和布局。了解CSS的语法格式是学习如何设计和美化网页的关键。本文将深入解释CSS的语法格式,包括选择器、属性和值等基本概念,同时提供示例代码以帮助初学者更好地理解。…

【单片机】18-红外线遥控

一、红外遥控背景知识 1.人机界面 (1)当面操作:按键,旋转/触摸按键,触摸屏 (2)遥控操作:红外遥控,433M/2.4G无线通信【穿墙能力强】,蓝牙-WIFI-Zigbee-LoRa等…

WPFdatagrid结合comboBox

在WPF的DataGrid中希望结合使用ComboBox下拉框,达到下拉选择绑定的效果,在实现的过程中,遇到了一些奇怪的问题,因此记录下来。 网上能够查询到的解决方案: 总共有三种ItemSource常见绑定实现方式: 1.ItemS…

【bug日记】spring项目使用配置类和测试类操作数据库

最近学校课程要求使用spring操作数据库&#xff0c;时间有点久了&#xff0c;操作都不太熟悉了&#xff0c;遇到了很多坑&#xff0c;特此记录一下。 导入依赖 <!-- Spring Framework --> <dependency><groupId>org.springframework</groupId><ar…

用Nginx搭建一个可用的静态资源Web服务器

sudo wget http://dlib.net/files/dlib-19.24.tar.bz2下载需要的文件。 sudo tar jxf dlib-19.24.tar.bz2进行解压。 sudo mkdir /nginx/dlib在nginx安装目录/nginx创建一个新的目录dlib。 配置文件里边的内容如下&#xff1a; worker_processes 1; events {worker_con…

如何批量获取1688商品详情数据接口,1688商品详情数据接口

批量获取1688商品详情数据接口的步骤如下&#xff1a; 获取API接口权限。编写API请求代码。应用爬取下来的数据。 1688商品详情数据接口步骤如下&#xff1a; 注册成为1688开放平台的开发者&#xff0c;并创建一个应用&#xff0c;获取到所需的App Key和App Secret等信息。使…

SpringBoot 如何使用 Prometheus 进行监控

在当今的软件开发世界中&#xff0c;监控是至关重要的一部分。它允许开发人员和运维团队实时跟踪应用程序的性能、可用性和健康状况。Spring Boot是一个流行的Java框架&#xff0c;用于构建微服务和Web应用程序&#xff0c;而Prometheus是一个开源的监控和警报工具。本文将介绍…

数据结构和算法——线性结构

文章目录 前言线性表顺序表链表合并有序链表反转链表 队列循环队列双端队列资源分配问题 栈共享栈表达式求值递归处理迷宫问题 串串的模式匹配BF算法KMP算法next数组的求解next数组的优化 前言 本文所有代码均在仓库中&#xff0c;这是一个完整的由纯C语言实现的可以存储任意类…

spark-08

学习视频&#xff1a; 黑马程序员Spark全套视频教程&#xff0c;4天spark3.2快速入门到精通&#xff0c;基于Python语言的spark教程_哔哩哔哩_bilibili

增强LLM:使用搜索引擎缓解大模型幻觉问题

论文题目&#xff1a;FRESHLLMS:REFRESHING LARGE LANGUAGE MODELS WITH SEARCH ENGINE AUGMENTATION 论文地址&#xff1a;https://arxiv.org/pdf/2310.03214.pdf 论文由Google、University of Massachusetts Amherst、OpenAI联合发布。 大部分大语言模型只会训练一次&#…

Spring Data Redis使用方式

1.导入Spring Data Redis的maven坐标 pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 2. 配置Redis数据源 2.1application.yml文件…

idea compile项目正常,启动项目的时候build失败,报“找不到符号”等问题

1、首先往上找&#xff0c;看能不能找到如下报错信息 You aren’t using a compiler supported by lombok, so lombok will not work and has been disabled. 2、这种问题属于lombok编译失败导致&#xff0c;可能原因是依赖jar包没有更新到最新版本 3、解决方案 1&#xff09…

C语言编程实现只有一个未知数的两个多项式合并的程序

背景&#xff1a; 直接看题目把&#xff01;就是C语言写两个多项式多项式合并 题目要求&#xff1a; 1. 题目&#xff1a; 编程实现只有一个未知数的两个多项式合并的程序。如&#xff1a; 3x^26x7 和 5x^2-2x9合并结果为8x^24x16。 2. 设计要求 &#xff08;1&#xff09…

有哪些值得推荐的Java 练手项目?

大家好&#xff0c;我是 jonssonyan 我是一名 Java 后端程序员&#xff0c;偶尔也会写一写前端&#xff0c;主要的技术栈是 JavaSpringBootMySQLRedisVue.js&#xff0c;基于我学过的技术认真的对每个分享的项目进行鉴别&#xff0c;今天就和大家分享我曾经用来学习的开源项目…

微调codebert、unixcoder、grapghcodebert完成漏洞检测代码

文件结构如下所示&#xff1a; mode.py # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. import torch import torch.nn as nn import torch from torch.autograd import Variable import copy from torch.nn import CrossEntropyLoss, MSELosscl…