Redis篇之Redis持久化的实现
持久化即把数据保存到可以永久保存的存储设备当中(磁盘)。因为Redis是基于内存存储数据的,一旦redis实例当即数据将会全部丢失,所以需要有某些机制将内存中的数据持久化到磁盘以备发生宕机时能够进行恢复,这一过程就称之为持久化。
Redis中有有以下两种持久化方式
- AOF持久化
- RDB持久化
AOF持久化及其相关实现
1、什么是AOF持久化?
AOF持久化是通过保存redis所执行的命令来记录数据状态的。以日志的形式来记录每个写操作,将redis执行过的所有写指令记录下来,只允许追加文件不允许改写文件。在redis重启后,会读取该文件用于数据的重新构建。
2、AOF持久化流程
- 客户端写入命令执行成功后,会被append追加到AOF缓冲区内
- AOF缓冲区根据AOF持久化策略【always|everysec|no】将操作异步追加至磁盘的AOF文件中
- AOF文件超过重写策略或手动重写时,会对AOF文件进行rewrite重写,压缩AOF文件容量
- 当redis服务重启时,会加载AOF文件中的写操作达到恢复数据的目的
3、AOF持久化策略
Redis提供了三种写磁盘的策略:Always、EverySecend、No,分别对应每条指令保存一次、每秒保存一次、不保存
- Always:每次执行一个命令保存一次
- 在此策略下,成功执行任务之后会同步写入磁盘,写入成功后才会将结果返回给客户端,此时redis主线程是阻塞状态的。
- 如果在写入过程中redis服务宕机且此时内存数据写入成功,那么在redis重启后,该数据会丢失
- EverySecend:每秒保存一次
- 在此策略下,成功执行任务之后会写入AOF缓冲区然后立即返回结果,不需要等待AOF文件写入成功。且由于AOF缓冲区是在内存中开辟的空间,所以写入速度很快。
- 如果写入过程中redis服务宕机且内存中的数据写入成功,那么在redis重启后,宕机前一秒钟(时间取决于同步之后到宕机的时间差,可能不足一秒钟)的数据会丢失。(一般情况下推荐使用此策略,取性能和安全性的平衡点)
- No:不保存
- 在此策略下,成功执行任务之后会写入AOF缓冲区然后立即返回结果,但是AOF缓冲区的数据何时写入磁盘完全由操作系统决定。
- 如果发生宕机的情况,数据的丢失将取决于操作系统。
三种策略对比

4、AOF文件重写
AOF文件为什么需要重写?
因为在服务运行过程中,会不停的有数据追加写入AOF文件,那么AOF文件就会不停的变大。如果不进行重写,不仅占用多余的内存,且在redis服务重启后恢复数据的时间也会加长。
AOF文件重写不是针对于原有的AOF文件进行任何的写入和读取,而是针对当前redis数据库中键的当前值。比如之前有一个键list,对其执行了5条命令,那么在重写时,会直接取当前数据库中该list对应的值进行设置,只需要写入一条命令即可。
AOF文件的重写过程
- 主线程在执行写命令时,如果当前的AOF文件大小触发了重写基准值(AOF当前大小>=)base_size +base_size*100% (默认)且当前大小>=64mb(默认)的情况下)或者手动执行了bgrewriteaof命令
- 主进程fork出子进程执行重写操作,主进程继续处理新的写入命令
- 子进程copy当前redis内存中的数据到临时文件,客户端的写请求同时写入aof_buf缓冲区和aof_rewrite_buf重写缓冲区保证原AOF文件完整以及新AOF文件生成期间新的数据修改不会丢失
- 子进程写完新的AOF文件后,向主进程发信号,主进程更新统计信息
- 主进程把aof_rewrite_buf中的数据写入新的AOF文件
- 使用新的AOF文件覆盖旧的AOF文件,完成AOF重写

为什么redis将AOF文件的重写程序放入子进程?
- 子进程重写期间,主进程可以继续处理其他的写请求,避免阻塞
- 主进程带有数据进程的数据副本,使用子进程而不是线程,可以避免使用锁的情况下保证数据的安全性。
RDB快照及其实现
1、什么是RDB?
RBD(Redis DataBase)是Redis的一种数据持久化策略,是一种以内存快照形式保存Redis数据的方式。所谓快照就是指把某一刻的状态以文件的形式进行全量备份到磁盘,这个快照文件就称为RDB文件。
2、快照怎么用?
Redis提供了两个命令来生成RDB文件,分别是save、bgsave。
- save:执行此命令会在主线程生成RDB文件,因此会阻塞主线程处理其他新的请求
- bgsave:会创建一个子进程来生成RDB文件,可以避免主线程阻塞
此外,还可以通过redis配置文件来调整RDB文件的生成策略。比如可以设置save 900 1意为在900秒之内至少发生了一次修改,就会进行生成RDB文件
需要注意,因为RDB文件生成是全量备份,所以设置的生成时间不能过于频繁,否则会对Redis性能产生影响。但是也不能将频率设置的太低,否则在redis宕机时丢失的数据会更多。通常来说,设置至少五分钟保存一次快照。
3、在生成RDB快照时,是否还能修改数据库中的数据?
可以。
在执行bgsave过程中,redis依然可以继续处理操作命令,依靠的就是COW(copy on write)写时复制技术。
执行bgsave命令时,会通过fork()创建子进程,此时的子进程和父进程是共享同一片内存数据的,子进程的页表是复制的父进程的页表,但是二者的页表指向的物理地址还是同一个。这样可以加快父进程创建子进程的速度,因为在创建子进程时父进程会阻塞。
4、什么是COW?
COW(copy on write)写时复制技术,是一种内存管理技术,它允许多个进程共享同一块内存,只有在某个进程尝试修改内存时,才会将内存复制一份,以确保数据一致性。
在redis生成RDB快照时,由于父子进程共享同一块内存数据,当父进程接收到新的写操作命令时,就会另外复制一份,然后父进程在这个数据副本上进行数据的修改操作。与此同时,子进程则继续把原来的数据写入RDB快照文件。
需要注意,由于在生成RDB文件时,发生的写操作由父进程在生成的数据副本中进行处理,所以子进程在生成RDB文件时无法记录操作过程中的修改信息,只能保存原有的数据文件。而在操作过程中的修改信息则需要在下一次的RDB文件生成时才会得以备份。
AOF和RDB总结
1、二者的简单描述
AOF:把所有对Redis的服务器进行修改的命令都追加写入一个文件中,该文件是一个命令的集合
RDB:快照形式直接把内存中的数据以二进制的形式保存到一个dump.rdb文件中,定时保存。
2、redis的默认持久化方式
Redis默认情况下,是快照 RDB 的持久化方式,将内存中的数据以快照的方式写入二进制文件中,默认的文件名是 dump.rdb 。当然我们也可以手动执行 save 或者 bgsave(异步)做快照。
3、二者的优缺点:
- 优点
- RDB:适用于大规模的数据备份,并且在设置好快照生成规则后可以精准的将数据恢复到某一个时间点。且由于生成的是全量数据的快照文件,恢复速度也会比AOF更快。
- AOF:备份机制更加文件,数据丢失少,备份日志文件可读。
- 缺点
- RDB:不适用于用于实时数据备份的解决方案,一旦发生意外宕机,丢失数据会比较多。
- AOF:备份频率高,占用内存大,恢复速度相对慢,性能压力大。
4、在实际生产中应该如何选择?
- 对数据完整性要求高,不需要考虑redis性能瓶颈:AOF
- 对数据完整性要求不高:RDB
数据库备份和灾难恢复:定时生成RDB快照更加便于数据库备份,并且RDB恢复数据的速度也要比AOF恢复的速度更快。
在redis4.0之后,支持同时开启RDB和AOF,系统重启后,redis会优先使用AOF来恢复数据,降低数据的丢失程度。
相关文章:
Redis篇之Redis持久化的实现
持久化即把数据保存到可以永久保存的存储设备当中(磁盘)。因为Redis是基于内存存储数据的,一旦redis实例当即数据将会全部丢失,所以需要有某些机制将内存中的数据持久化到磁盘以备发生宕机时能够进行恢复,这一过程就称…...
dpdk环境搭建和工作原理
文章目录 1、DPDK环境搭建1.1、环境搭建1.2、编译DPDK 2、DPDK工作原理 1、DPDK环境搭建 1.1、环境搭建 工具准备:VMware、ubuntu16.04。 (1)VMware添加两个网卡。桥接网卡作为 DPDK 运行的网卡,NAT 网卡作为 ssh 连接的网卡。 …...
接口测试实战--自动化测试流程
一、项目前期准备 常见项目软件架构: springMvc:tomcat里运行war包(在webapps目录下) springboot:java -jar xx.jar -xms(**) 运行参数 springCloud:k8s部署,使用kubectl create -f xx.yaml 接口自动化测试介入需越早越好,只要api定义好就可以编写自动化脚本; 某个…...
babylonjs中文文档
经过咨询官方,文档已经添加了开源协议。 基于目前babylonjs没有中文文档,为了打造更好的babylonjs生态圈 ,特和小伙伴们翻译了官方文档。 相关链接: 欢迎加群:464146715 官方文档 中文文档 Babylonjs案例分享...
WordPress使用
WordPress功能菜单 仪表盘 可以查看网站基本信息和内容。 文章 用来管理文章内容,分类以及标签。编辑文章以及设置分类标签,分类和标签可以被添加到 外观-菜单 中。 分类名称自定义;别名为网页url链接中的一部分,最好别设置为中文…...
IDEA 2021.3激活
1、打开idea,在设置中查找Settings/Preferences… -> Plugins 内手动添加第三方插件仓库地址:https://plugins.zhile.io搜索:IDE Eval Reset 插件进行安装。应用和使用,如图...
进度条小程序
文章目录 铺垫回车换行缓冲区概述强制冲刷缓冲区 简单实现倒计时功能进度条小程序版本一实例代码效果展示分析 版本二 铺垫 回车换行 回车和换行是两个独立的动作 回车是将光标移动到当前行的最开始(最左侧) 换行是竖直向下平移一行 在C语言中&…...
K8S安装部署
常见的K8S安装部署方式 Minikube Minikube是一个工具,可以在本地快速运行一个单节点微型K8S,仅用于学习、预览K8S的一些特性使用。 部署地址:Install Tools | Kubernetes Kubeadm Kubeadm也是一个工具,提供kubeadm init和kube…...
AI大模型与小模型之间的“脱胎”与“反哺”(第一篇)
一、AI小模型脱胎于AI大模型,而AI小模型群又可以反哺AI大模型 AI大模型(如GPT、BERT等)通常拥有大量的参数和训练数据,能够生成或理解复杂的文本内容。这些大模型在训练完成后,可以通过剪枝、微调等方式转化为小模型&…...
C#学习总结
1、访问权限 方法默认访问修饰符:private 类默认访问修饰符:internal 类的成员默认访问修饰符:private 2、UserControl的使用 首先添加用户控件 使用时一种是通过代码添加,一种是通过拖动组件到xaml中...
计算机网络-网络互联
文章目录 网络互联网络互联方法LAN-LAN:网桥及其互连原理使用网桥实现LAN-LAN使用交换机扩展局域网使用路由器连接局域网 LAN-WANWAN-WAN路由选择算法非自适应路由选择算法自适应路由选择算法广播路由选择算法:分层路由选择算法 网络互联 网络互联是指利…...
免费的ChatGPT网站( 7个 )
ChatGPT 是由 OpenAI 公司研发的一款大型语言模型,它可以实现智能聊天、文本生成、语言翻译等多种功能。以下是 ChatGPT 的详细介绍: 智能聊天:ChatGPT 可以与用户进行自然语言对话,回答用户的问题,提供相关的信息和建…...
Opencv3.2 ubuntu20.04安装过程
##1、更新源 sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main" sudo apt update##2、安装依赖库 sudo apt-get install build-essential sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavfor…...
OpenGL ES (OpenGL) Compute Shader 计算着色器是怎么用的?
OpenGL ES (OpenGL) Compute Shader 是怎么用的? Compute Shader 是 OpenGL ES(以及 OpenGL )中的一种 Shader 程序类型,用于在GPU上执行通用计算任务。与传统的顶点着色器和片段着色器不同,Compute Shader 被设计用于在 GPU 上执行各种通用计算任务,而不是仅仅处理图形…...
Python爬虫进阶:爬取在线电视剧信息与高级检索
简介: 本文将向你展示如何使用Python创建一个能够爬取在线电视剧信息的爬虫,并介绍如何实现更高级的检索功能。我们将使用requests和BeautifulSoup库来爬取数据,并使用pandas库来处理和存储检索结果。 目录 一、爬取在线电视剧信息 …...
Floor报错原理详解+sql唯一约束性
目录 floor报错原理 唯一性约束 主键约束: 创建约束的形式 删除约束 删除唯一性约束(UNIQUE Constraint) 在SQL Server中: 在MySQL中: 在PostgreSQL中: 删除主键约束: floor报错原理 …...
Arduino中安装ESP32网络抽风无法下载 暴力解决办法 python
不知道什么仙人设计的arduino连接网络部分,死活下不下来。(真的沙口,第一次看到这么抽风的下载口) 操作 给爷惹火了我踏马解析json选zip直接全部下下来 把这个大家的开发板管理地址下下来跟后面python放在同一目录下,…...
Linux基础命令—系统服务
基础知识 centos系统的开机流程 1)通电 2)BIOS硬件检查 3)MBR引导记录 mbr的引导程序 加载引导程序 让硬件加载操作系统内核 MBR在第一个磁盘第一个扇区 总大小512字节 mbr: 1.引导程序: 占用446字节用于引导硬件,加载引导程序 2.分区表: 总共占…...
qt-动画圆圈等待-LED数字
qt-动画圆圈等待-LED数字 一、演示效果二、关键程序三、下载链接 一、演示效果 二、关键程序 #include "LedNumber.h" #include <QLabel>LEDNumber::LEDNumber(QWidget *parent) : QWidget(parent) {//设置默认宽高比setScale((float)0.6);//设置默认背景色se…...
SpringBoot3整合Swagger3,访问出现404错误问题(未解决)
秉承着能用就用新的的理念,在JDK、SpringBoot、SpringCloud版本的兼容性下,选择了Java17、SpringBoot3.0.2整合Swagger3。 代码编译一切正常,Swagger的Bean也能加载,到了最后访问前端页面swagger-ui的时候出现404。 根据网上资料…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...
