Redis篇之Redis持久化的实现

持久化即把数据保存到可以永久保存的存储设备当中(磁盘)。因为Redis是基于内存存储数据的,一旦redis实例当即数据将会全部丢失,所以需要有某些机制将内存中的数据持久化到磁盘以备发生宕机时能够进行恢复,这一过程就称之为持久化。

Redis中有有以下两种持久化方式

  1. AOF持久化
  2. RDB持久化

AOF持久化及其相关实现

1、什么是AOF持久化?

AOF持久化是通过保存redis所执行的命令来记录数据状态的。以日志的形式来记录每个写操作,将redis执行过的所有写指令记录下来,只允许追加文件不允许改写文件。在redis重启后,会读取该文件用于数据的重新构建。

2、AOF持久化流程

  1. 客户端写入命令执行成功后,会被append追加到AOF缓冲区内
  2. AOF缓冲区根据AOF持久化策略【always|everysec|no】将操作异步追加至磁盘的AOF文件中
  3. AOF文件超过重写策略或手动重写时,会对AOF文件进行rewrite重写,压缩AOF文件容量
  4. 当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文件的重写过程

  1. 主线程在执行写命令时,如果当前的AOF文件大小触发了重写基准值(AOF当前大小>=)base_size +base_size*100% (默认)且当前大小>=64mb(默认)的情况下)或者手动执行了bgrewriteaof命令
  2. 主进程fork出子进程执行重写操作,主进程继续处理新的写入命令
  3. 子进程copy当前redis内存中的数据到临时文件,客户端的写请求同时写入aof_buf缓冲区和aof_rewrite_buf重写缓冲区保证原AOF文件完整以及新AOF文件生成期间新的数据修改不会丢失
  4. 子进程写完新的AOF文件后,向主进程发信号,主进程更新统计信息
  5. 主进程把aof_rewrite_buf中的数据写入新的AOF文件
  6. 使用新的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来恢复数据,降低数据的丢失程度。

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

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

相关文章

Unity之PUN2插件实现多人联机射击游戏

目录 📖一、准备工作 📺二、UI界面处理 📱2.1 登录UI并连接PUN2服务器 📱2.2 游戏大厅界面UI 📱2.3 创建房间UI 📱2.4 进入房间UI 📱2.5 玩家准备状态 📱2.6 加载战斗场景…

【深度学习】微调通义千问模型:LoRA 方法,微调Qwen1.8B教程,实践

官网资料: https://github.com/QwenLM/Qwen/blob/main/README_CN.md 文章目录 准备数据运行微调设置网络代理启动容器执行 LoRA 微调修改 finetune/finetune_lora_single_gpu.sh运行微调 执行推理 在本篇博客中,我们将介绍如何使用 LoRA 方法微调通义千问模型&#…

Docker Container(容器)

"在哪里走散,你都会找到我~" Docker 容器 什么是容器? 通俗来讲,容器是镜像运行的实体。我们对于镜像的认知是,“存储在磁盘上的只读文件”。当我们启动一个容器的本质,就是启动一个进程,即容器…

SpringBoot实现缓存预热的几种常用方案

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:Java全栈-专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默&…

【自然语言处理-二-attention注意力 是什么】

自然语言处理二-attention 注意力机制 自然语言处理二-attention 注意力记忆能力回顾下RNN(也包括LSTM GRU)解决memory问题改进后基于attention注意力的modelmatch操作softmax操作softmax值与hidder layer的值做weight sum 计算和将计算出来的和作为memo…

从零开始 TensorRT(5)C++ 篇:g++、CMake、VS Code 环境入门

前言 学习资料: B站视频:基于 VSCode 和 CMake 实现 C/C 开发 B站视频:Cherno C 教程 从本文开始,正式进入 C 部分。由于个人 C 零基础,仅了解一些 Python,所以学习时的痛点更偏向于 C 的基础,…

nios ii开发随笔

错误一: d:/intelfpga/17.1/nios2eds/bin/gnu/h-x86_64-mingw32/bin/../lib/gcc/nios2-elf/5.3.0/../../../../../H-x86_64-mingw32/nios2-elf/bin/ld.exe: test.elf section .text will not fit in region ram_oc_xzs d:/intelfpga/17.1/nios2eds/bin/gnu/h-x86_6…

01_第一章 WEB开发概述(技术栈,交互模式,CS和BS模式,前后端分离)

文章目录 第一章 WEB概述1.1 JAVAWEB简介1.2 JAVAWEB技术栈1.3 JAVAWEB交互模式1.4 JAVAWEB的CS和BS模式1.5 JAVAWEB实现前后端分离 第一章 WEB概述 1.1 JAVAWEB简介 用Java技术来解决相关web互联网领域的技术栈.使用JAVAEE技术体系开发企业级互联网项目. 项目规模和架构模式与…

Linux:ACL权限,特殊位和隐藏属性

目录 一.什么是ACL 二.操作步骤 ① 添加测试目录、用户、组,并将用户添加到组 ② 修改目录的所有者和所属组 ③ 设定权限 ④ 为临时用户分配权限 ⑤ 验证acl权限 ⑥ 控制组的acl权限 三. 删除ACL权限 一.什么是ACL 访问控制列表 (Access Control List):ACL 通…

如何在 Tomcat 中为 Web 应用程序启用和配置缓存?

在Tomcat中为Web应用程序启用和配置缓存通常涉及到对Tomcat的连接器(Connector)进行配置,以及可能的话,配置Web应用程序本身以支持缓存。 1. 配置Tomcat连接器以启用缓存 Tomcat的连接器可以通过其配置来启用各种…

FFmpeg解析之avformat_find_stream_info函数

avformat_find_stream_info 的主要作用就是:解析媒体文件并获取相关的流信息 整体的逻辑如下图所示: /*** Read packets of a media file to get stream information. This* is useful for file formats with no headers such as MPEG. This* function…

LeetCode206: 反转链表.

题目描述 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 解题方法 假设链表为 1→2→3→∅,我们想要把它改成∅←1←2←3。在遍历链表时,将当前节点的 next指针改为指向前一个节点。由于节点没有引用其前一…

挑战杯 基于大数据的时间序列股价预测分析与可视化 - lstm

文章目录 1 前言2 时间序列的由来2.1 四种模型的名称: 3 数据预览4 理论公式4.1 协方差4.2 相关系数4.3 scikit-learn计算相关性 5 金融数据的时序分析5.1 数据概况5.2 序列变化情况计算 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 &…

电表(2)stm32学习笔记-STLINK使用

stm32学习笔记-STLINK使用 使用ST-LINK调试程序进度表格 使用ST-LINK调试程序 说明 组成 总结 记录使用STLINK进行项目的烧写和调试,旨在高效的进行代码调试学习工具包括笔记本、keil5MDK、stm32f030c8t6电表主机、STLINK V2、导线、电表代码总的来说&#xff0…

yolov8-seg dnn调用

接上篇一直更换torch、opencv版本都无法解决这个问题(seg调用dnn报错)。那问题会不会出在yolov8源码本身呢。yolov8的讨论区基本都看过了,我决定尝试在其前身yolov5的讨论区上找找我不信没人遇到这个问题。很快找到下面的讨论第一个帖子&…

Project_Euler-03 题解

Project_Euler-03 题解 题目 思路 首先排除掉暴力求解,虽然也可以得出答案,但是我在我仅仅只有二颗核心的服务器上跑了很久很久… 尝试另一种方法: 首先要知道一个知识,所有的数都可以拆解成为素数因子平方连乘的形式&#xff…

Spring Boot与HikariCP:性能卓越的数据库连接池

点击下载《Spring Boot与HikariCP:性能卓越的数据库连接池》 1. 前言 本文将详细介绍Spring Boot中如何使用HikariCP作为数据库连接池,包括其工作原理、优势分析、配置步骤以及代码示例。通过本文,读者将能够轻松集成HikariCP到Spring Boot…

PCIe P2P DMA全景解读

温馨提醒:本文主要分为5个部分,总计4842字,需要时间较长,建议先收藏! P2P DMA简介 P2P DMA软硬件支持 CXL P2P DMA原理差异 P2P DMA应用场景 P2P DMA技术挑战 一、P2P DMA简介 P2P DMA(Peer-to-Peer…

解决ubuntu系统cannot find -lc++abi: No such file or directory

随着CentOS的没落,使用ubuntu的越来越多,而且国外貌似也比较流行使用ubuntu,像LLVM/Clang就有专门针对ubuntu编译二进制发布文件: ubuntu本身也可以直接通过apt install命令来安装编译好的clang编译器。不过目前22.04版本下最高…

SpringMVC 学习(二)之第一个 SpringMVC 案例

目录 1 通过 Maven 创建一个 JavaWeb 工程 2 配置 web.xml 文件 3 创建 SpringMVC 配置文件 spring-mvc.xml 4 创建控制器 HelloController 5 创建视图 index.jsp 和 success.jsp 6 运行过程 7 参考文档 1 通过 Maven 创建一个 JavaWeb 工程 可以参考以下博文&#x…