Redis 的持久化机制有哪些??

一、背景:

持久化,就是将数据存入到磁盘中去的过程。虽然redis是基于内存运行的服务,但是也需要做持久化操作的。

二、redis服务等持久化机制流程:

Redis是基于内存的非关系型K-V数据库,既然它是基于内存的,如果Redis服务器挂了,数据就会丢失。为了避免数据丢失了,Redis提供了持久化,即把数据保存到磁盘。

Redis提供了RDB和AOF两种持久化机制,它持久化文件加载流程如下:

三、RDB持久化:

RDB,就是把内存数据以快照的形式保存到磁盘上。
问:什么是快照?
答:可以这样理解,给当前时刻的数据,拍一张照片,然后保存下来。

RDB持久化,是指在指定的时间间隔内,执行指定次数的写操作,将内存中的数据集快照写入磁盘中,它是Redis默认的持久化方式。执行完操作后,在指定目录下会生成一个dump.rdb文件,Redis 重启的时候,通过加载dump.rdb文件来恢复数据。

(1)、RDB触发机制:

RDB触发机制主要有以下几种:

(2)、RDB 的优点:

• 适合大规模的数据恢复场景,如备份,全量复制等

(3)、RDB缺点:

• 没办法做到实时持久化/秒级持久化;
• 新老版本存在RDB格式兼容问题。

   (4)、RDB的参数配置解析:

save 900 1:900秒之内,对数据库至少修改了1次。
save 300 10:300秒之内,对数据库至少修改了10次。
save 60 10000:60秒之内,对数据库至少修改了10000次。

# 默认的设置为:
save 900 1
save 300 10
save 60 10000

# 导出rdb数据库文件压缩字符串和对象,默认是yes,但会浪费CPU但是节省空间

rdbcompression yes

# 导入时是否检查

rdbchecksum yes

# 持久化文件名称

dbfilename dump.rdb

# 持久化文件存储路径 

dir /var/lib/redis

# 如果持久化出错,主进程是否停止写入 

stop-writes-on-bgsave-error yes

(5)、bgsave工作流程:

fork系统调用会产生一个子进程,它与父进程可以共享内存地址,所以当产生fork调动那一时刻,父子进程就有着完全相同的内容。

1、刚调用fork函数时,父子进程都映射了同一块物理地址

2、此时如果在子进程bgsave过程中,数据A发生写操作。

看出变化了没,对数据A的写操作并不会影响子进程,而父进程也没有直接对数据A所在的物理地址进行写入,而是重新复制了一份,然后在新复制的数据操作,这就是copy-on-write。

四、AOF持久化:

AOF(append only file) 持久化,采用日志的形式来记录每个写操作,追加到文件中,重启时再重新执行AOF文件中的命令来恢复数据。它主要解决数据持久化的实时性问题。默认是不开启的。

AOF的工作流程如下:

(1)、如何开启AOF持久化:

#修改配置文件:
vim /etc/redis/redis.conf
appendonly yes # 把 no 改为 yes#确定存储文件名是否正确
appendfilename "appendonly.aof"#重启服务:
sudo /etc/init.d/redis-server restart

(2)、AOF的优点:

• 数据的一致性和完整性更高

(3)、AOF的缺点:

• AOF记录的内容越多,文件越大,数据恢复变慢。

(4)、AOF数据恢复:

AOF文件包含重建Redis数据所需的所有写入命令,因此只要重新读入并执行保存在AOF文件中的写入命令,Redis就可以恢复Redis关闭前的状态。伪客户端是指 Redis命令只能在客户端的上下文中执行,用于加载AOF文件的命令直接来自AOF文件,而不是网络连接。因此,服务器使用没有网络连接的伪客户端来执行保存在AOF文件中的命令。伪客户端执行命令的效果与具有网络连接的客户端的效果完全相同。

 (5)、AOF三种写回硬盘策略:

Redis 3 种写回硬盘的策略,说的是在 redis.conf 配置文件中的 appendfsync 配置项可以有以下 3 种参数可填。

Redis将在结束每个事件之前调用 flushAppendOnlyFile() 函数,以确定是否需要将AOF缓存中的内容写入并同步到AOF文件。flushAppendOnlyFile() 函数的行为由redis.conf 配置中appendfsync选项的值决定,有三个可选值:always、everysec和no。

Always(同步写回):

在执行每个写操作命令后,AOF日志数据将同步写回硬盘;

Everysec(每秒写回):

在执行每个写操作命令后,将命令写入AOF文件的内核缓冲区,然后每秒将缓冲区的内容写回硬盘;

No(操作系统控制的回写)

意味着回写硬盘的时间不受Redis控制,而是转移到由操作系统所控制的回写入时间。也就是说,在执行每个写操作命令之后,该命令首先被写入AOF文件的内核缓冲区,然后操作系统决定何时将缓冲区内容写回硬盘。

这三种方法都有缺点:

Always(同步写回),如果每次执行后命令都同步到瓷盘中,这会影响主线程的性能;

Everysec(每秒回写)使用每秒回写一次的频率,以避免同步回写的性能开销。虽然它减少了对系统性能的影响,但如果发生中断,在最后一秒没有中断的命令操作仍将丢失;

No(操作系统控制写回)。保存到磁盘的操作由操作系统控制。只要AOF中没有写回命令,一旦服务器停机,数据就会丢失;

五、Redis4.0的混合持久化模式

Redis 4.0的新特性是混合持久化模式,混合持久化模式同时使用RDB快照和AOF日志的混合持久模式,将RDB文件内容和增量AOF文件内容存储在同一个文件(相同的AOF格式文件)中,可以通过配置参数 aof-use-rdb-preamble 来启用混合持久性模式,config get aof-use-rdb-preamble命令进行查看。

由于RDB快照数据和AOF日志数据存储在同一个文件中,因此AOF格式文件不再只存储全部AOF日志,而是第一部分存储RDB快照,第二部分存储从RDB快照持久化开始到持久化结束的增量AOF日志。因此,RDB数据通常占大多数,AOF日志只是增量日志的一小部分

在混合持久策略下,当重新启动下一个Redis实例时,首先加载RDB快照的内容,然后重放增量AOF日志。这可以取代以前的RDB完全导入或AOF完全重放。

 

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

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

相关文章

某互联网公司c++笔试题1

1. 画多重继承虚函数表 注:虚函数表是一种编译时构建的数据结构,它用于在运行时解析对虚函数的调用,是一个存储类成员函数指针的数组。每个拥有虚函数的类都有一个对应的虚函数表。当类对象创建时,对象中会包含一个指向相应虚函数…

AI作画算法原理详解:从数据到艺术的自动化之旅

AI作画算法原理详解:从数据到艺术的自动化之旅 在数字化时代,人工智能(AI)技术正逐步渗透到各个领域,其中AI作画技术更是引发了广泛关注。本文将详细解析AI作画算法的原理,带领读者了解从数据收集与处理到…

c# winform 控件皮肤

控件皮肤下载: https://download.csdn.net/download/m0_46973223/89225992 步骤: 第一步 将IrisSkin4.dll文件放在debug文件下,选一个或者多个后缀名为.ssk文件(各个皮肤文件)放在debug文件下。 第二步 解决方案资…

ocr、人工智能、文字识别接口

人工智能这个词近几年热度颇高,工业上有人称之为“机器代工”,生活中有人称之为“物联网”,而所体现出来的就是智能化,减少人工参与。翔云公有云平台应运而生,提供的OCR API及实名认证API使产品智能化,自动…

华为OD机试真题-剩余银饰的重量-2024年OD统一考试(C卷D卷)

题目描述: 有N块二手市场收集的银饰,每块银饰的重量都是正整数,收集到的银饰会被熔化用于打造新的饰品。 每一回合,从中选出三块 最重的 银饰,然后一起熔掉。假设银饰的重量分别为 x 、y和z,且 x <= y <= z。那么熔掉的可能结果如下: 如果 x == y == z,那么三块银…

全额退款20000,what?

接单的时候有多兴奋&#xff0c;退单的时候就有多落寞。今天我对客户全额退款了&#xff0c;跟踪了10天的项目正式结束。 这是我接单以来项目单价最高的一个项目&#xff0c;本来不太想接的&#xff0c;因为业务领域不擅长&#xff0c;又想挑战一下。兜兜转转找了几个人因为各种…

使用 Python 将 GB2312 和 UTF8 编码的文件转换为带标记的 UTF8 编码

1. 版本、依赖要求 Python 版本要求&#xff1a;Python > 3.6即可 需要安装的包&#xff08;建议使用 conda、miniconda 等 python 环境管理器创建一个 python 环境后运行 chardettkinter 2. 实现功能 对某一文件夹及其子文件夹下的所有txt文件&#xff0c;将原编码为g…

git分支更新

git分支更新 场景&#xff1a; 在本地创建了一个新的分支 test_20240426 后&#xff0c;远端分支更新了内容&#xff0c;需要更新本地的 master 分支和新创建的 test_20240426 分支。 步骤&#xff1a; 更新 master 分支 首先&#xff0c;切换到 master 分支&#xff1a;git …

Neo-reGeorg明文流量

Neo-reGeorg 1 同IP对&#xff0c;同一个URI&#xff0c;第一个TCP流是“GET”请求&#xff0c;随后的TCP流请求为“POST”。&#xff08;jsp\jspx\php&#xff09; 2 第一个TCP流中&#xff0c;GET只有一个会话。&#xff08;jsp\jspx\php&#xff09;&#xff0c;响应body79…

机器学习——过拟合

一、过拟合得表现 模型在训练过程中&#xff0c;除了会出现过拟合现象&#xff0c;还有可能出现欠拟合的情况。相比而言&#xff0c;后者通常发生在建模前期&#xff0c;只要做好特征工程一般可以解决模型欠拟合问题。下图描述了模型在训练数据集上的三种情况&#xff1a; 其…

【LeetCode:2095. 删除链表的中间节点 + 链表】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

go 环境安装

彻底清楚old version sudo apt-get remove golang-go sudoapt-get remove --auto-remove golang-go rm -rvf /usr/local/go/ 安装方法&#xff1a; 1.下载 Download and install - The Go Programming Language 2. 解压安装 rm -rf /usr/local/go && tar -C /usr/…

BGP的路径属性

路径属性 l每条BGP路由都拥有多个的路径属性&#xff0c;有些是必须携带的&#xff0c;有些是可选添加的 lBGP的路径属性将影响最优路由的选择 lBGP路径属性是描述路由的一组参数&#xff0c;BGP根据路由的属性选择最佳路由&#xff0c;可以人为置值&#xff0c;以便执行路由…

[Android]引导页

使用Kotlin Jetpack Compose创建一个左右滑动的引导页, 效果如图. 1.添加依赖项 androidx.compose.ui最新版本查询:https://maven.google.com/web/index.html com.google.accompanist:accompanist-pager最新版本查询:https://central.sonatype.com/ 确保在 build.gradle (M…

算法-KMP算法

时间复杂度&#xff1a; public int strStr(String haystack, String needle) {int[] next new int[needle.length()];//next数组的生成next[0] 0;int prefixLen 0;//共同前后缀长度int i 1, j 1;//i,j复用while (i < needle.length()) {if (needle.charAt(prefixLen)…

数据库工程师的工作职责(合集)

数据库工程师的工作职责1 职责&#xff1a; 1. 日常数据库的基本安装&#xff0c;维护&#xff0c;升级&#xff0c;监控的; 2. 配合研发部门进行数据库设计支持&#xff0c;协助开发、设计和进行SQL语言优化; 3. 配合相关部门数据库相关的任务&#xff0c;比如数据导入导出&am…

「屡教不改」又被罚,谁还在相信山姆?

值得信赖的品质」「全球进口品牌」……「更好的生活尽在山姆」。 作为全球最大的会员制商店&#xff0c;山姆这几年可以说在中国线下零售市场集体遇劫的背景下&#xff0c;逆势崛起&#xff0c;甚至可以说做到了独树一帜。‍‍‍‍‍‍ 背后的原因是什么&#xff1f;会员制这一…

c++ 中判断字符是 ASCII 编码还是 GBK 编码

在C中&#xff0c;一个字符是ASCII编码还是GBK编码&#xff0c;取决于其在ASCII范围内还是在GBK范围内。 ASCII编码的范围是0到127&#xff0c;而GBK编码是双字节编码&#xff0c;包含了更广泛的字符范围。 #include <iostream> #include <string> #include <…

Python爬虫要点和难点实例代码解析

学习Python爬虫是一个很好的选择,因为Python有很多强大的库可以帮助你进行网络数据的获取和处理。以下是一个简单的Python爬虫入门指南: 1. 了解HTTP协议:在开始编写爬虫之前,了解HTTP协议是很重要的,因为大多数爬虫都是通过HTTP来获取网页数据的。你需要了解HTTP请求和响…

迅雷不限速破解方法

背景&#xff1a;现在迅雷和百度云的下载速度真的太恶心了&#xff0c;所以总有大佬可以采用厉害的方法进行破解&#xff0c;在网上看了一圈&#xff0c;很多都是骗人或者是无效的&#xff0c;找了一个靠谱的方法&#xff0c;亲测速度能达到10M以上&#xff0c;非常给力。 以下…