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。 根据网上资料…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
解析两阶段提交与三阶段提交的核心差异及MySQL实现方案
引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC…...
归并排序:分治思想的高效排序
目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法,由约翰冯诺伊曼在1945年提出。其核心思想包括: 分割(Divide):将待排序数组递归地分成两个子…...
