【Java八股学习】Redis持久化 思维导图

在这里插入图片描述

说明

文章内容通过学习小林Coding内的优质文章后整理而来,整理成思维导图的方式是为了帮助自己理解、记忆和复习。如若侵权请联系删除,再次对小林Coding内的优质文章表示感谢。参考文章如下:

  • AOF 持久化是怎么实现的?
  • RDB 快照是怎么实现的?
  • Redis 大 Key 对持久化有什么影响?

思维导图会不断修改完善,下方的文字内容不一定会跟着修改,请大家以思维导图的内容为准。

文章目录

  • 说明
  • Redis持久化
    • AOF日志
      • 是什么
      • 怎么开启
      • 执行流程
        • 优点
        • 风险
      • 三种写回策略
        • Always
        • Everysec
        • No
      • 重写机制
        • 重写是什么
        • 为什么要重写
        • 重写过程
          • 为什么用新AOF文件
          • 为什么用子进程
          • 父子进程怎么共享内存数据
          • 写时复制是啥
          • 什么时候会阻塞主进程
          • 主进程修改数据,父子进程数据不一致怎么解决
      • 优缺点
    • RDB快照
      • 是什么
      • 相较于AOF的优缺点
      • 怎么用
      • 快照执行过程
    • 混合持久化
      • 是什么
      • 怎么开启
      • 执行过程
      • 优点

Redis持久化

AOF日志

是什么

  • Redis 每执行一条写操作命令(读操作没必要记录),就把该命令以追加的方式写入到一个AOF文件里
  • 重启 Redis 的时候,先去读取这个文件里的命令并执行,数据就恢复了

怎么开启

  • 修改redis.conf
# 是否需要持久化存储
appendonly yes
# 产生的AOF文件名称
appendfilename "appendonly.aof"
# 使用什么策略
appendfsync everysec

执行流程

Redis先执行写操作命令,再记录到AOF日志(在主进程完成)

优点
  • 避免额外检查开销:如果先写到AOF,需要检查命令是否正确

  • 不阻塞当前写操作命令执行

风险
  • 日志没有写到磁盘,服务器宕机,数据会丢失
  • 可能阻塞下一个命令

三种写回策略

Always

每次写操作都将日志写回硬盘

  • 优点:最大程度保证数据不丢失
  • 缺点:影响主进程性能
Everysec

每次写操作先将命令写入AOF文件内核缓冲区,每隔一秒将缓冲区内存写回硬盘

  • Always和No的折中方案,平衡性能和数据丢失量
No

Redis不控制,交由操作系统控制写回时机。先将命令写入AOF文件内核缓冲区,操作系统决定何时将日志写回硬盘

  • 优点:性能较好
  • 缺点:操作系统将日志写回硬盘时机不可预知,服务器宕机丢失的数据可能比较多

重写机制

重写是什么
  • 对于一个键,只保留最新的命令,减少AOF文件的数据量
  • 如先执行set num 1,再执行set num 2,最后只需要保留set num 2,历史命令没用
为什么要重写

随着项目运行,AOF文件越来越大,重启Redis后的恢复速度会下降

重写过程

创建一个子进程来将最新命令先存储到一个新AOF文件,再覆盖旧AOF文件

为什么用新AOF文件
  • 避免AOF重写失败造成原AOF文件数据被污染
  • 使用新AOF文件,重写失败,直接删除新文件即可
为什么用子进程
  • 重写较慢,避免阻塞主进程

  • 为什么不用线程

    • 多线程会共享内存,修改共享内存数据时,需要加锁保证数据安全,性能较差
    • 父子进程以只读方式共享内存数据,如果父子一方要修改共享内存数据,会发生写时复制产生独立数据副本,无需加锁,性能较好
父子进程怎么共享内存数据

创建子进程时,操作系统会将主进程的页表复制给子进程,页表的虚拟地址会指向真实物理地址。父子进程都可以通过页表找到物理内存

写时复制是啥
  • 当父进程发生写操作时,操作系统会将相应键的物理内存复制一份出来(会阻塞主进程),这样修改的时候不会影响原有物理内存

  • 为什么不在创建子进程的时候将所有物理内存复制一份给子进程,而是复制页表

    • 复制物理内存的话,时间长,主进程会长时间堵塞
    • 页表内存较小,复制快
什么时候会阻塞主进程
  • 复制页表
  • 写时复制,bigkey影响较大
主进程修改数据,父子进程数据不一致怎么解决
  • 除了AOF缓冲区,Redis还设置了AOF重写缓冲区,重写期间,会将命令追加到AOF重写缓冲区
  • 重写完成后,将AOF重写缓冲区的命令追加到AOF文件

优缺点

  • 优点:丢失数据可控

  • 缺点:AOF日志文件大时,数据恢复慢

RDB快照

是什么

  • RDB 快照就是记录某一瞬间的内存二进制数据,AOF 文件记录的是命令
  • 每次执行快照,将所有内存数据记录到硬盘,效率较低,因此使用子进程来执行

相较于AOF的优缺点

  • 优:直接将RDB文件读入内存即可,数据恢复效率高,无需执行命令

  • 缺:快照频率不好把控。频率高,频繁创建子进程和磁盘IO,性能差;频率低,服务器宕机,丢失数据比AOF多

怎么用

修改redis.conf

save 900 1
save 300 10
save 60 10000
  • 满足三个条件的任意一个就会执行快照
  • save 900 1表示900秒内,执行至少1次数据修改

快照执行过程

  • 执行bgsave时,创建一个子进程来生成RDB文件,父子共享内存数据时,原理同AOF
  • 主进程修改共享内存数据的话,触发写时复制,生成RDB还是用旧的数据,因此此次更新的数据需要下次bgsave来生成快照

混合持久化

是什么

AOF、RDB合体。使用混合持久化,AOF 文件的前半部分是 RDB 格式的全量数据,后半部分是 AOF 格式的增量数据

怎么开启

修改redis.conf

aof-use-rdb-preamble yes

执行过程

在 AOF 重写日志时,fork 出来的重写子进程会先将与主线程共享的内存数据以 RDB 方式写入到 AOF 文件,然后主线程处理的操作命令会被记录在重写缓冲区里,重写缓冲区里的增量命令会以 AOF 方式写入到 AOF 文件,写入完成后通知主进程将新的含有 RDB 格式和 AOF 格式的 AOF 文件替换旧的的 AOF 文件

优点

  • 效率高:因为前半部分是RDB内容

  • 丢失数据少:操作命令会被记录到AOF日志

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Leaflet使用多面(MultiPolygon)进行遥感影像掩膜报错解决之道

目录 前言 一、问题初诊断 1、山重水复 2、柳暗花明 3、庖丁解牛 4、问题定位 二、解决多面掩膜问题 1、尝试数据修复 2、实际修复 3、最终效果 三、总结 前言 之前一篇讲解遥感影像掩膜实现:基于SpringBoot和Leaflet的行政区划地图掩膜效果实战&#xff0…

CleanMyMac X中文---让Mac焕发新生,Mac优化与清理的终极利器

CleanMyMac X是一款专为Mac用户设计的综合性系统优化工具。通过智能扫描,它能够快速识别并清理Mac磁盘上的垃圾文件、重复文件、无用语言安装包、iTunes缓存、邮件附件等,有效释放磁盘空间,提升Mac电脑的运行速度。此外,CleanMyMa…

【初阶数据结构】——160. 相交链表

文章目录 1. 题目介绍2. 思路1:暴力求解算法思想代码实现 3. 思路2:快慢指针算法思想代码实现 1. 题目介绍 链接: link 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&…

Flutter 全局控制底部导航栏和自定义导航栏的方法

1. 介绍 导航栏在移动应用中扮演着至关重要的角色,它是用户与应用之间进行导航和交互的核心组件之一。无论是简单的页面切换,还是复杂的应用导航,导航栏都能够帮助用户快速找到所需内容,提升用户体验和应用的易用性。 在移动应用…

chatgpt用pygame根据重心坐标 填充三角形

pygame.Surface.set_at(screen, (int(w), int(h)), (int(255zhongxina),int(255zhongxinb),int(255zhongxinc))) 颜色是由三个重心坐标权重abc255求出的 import pygame from pygame.locals import * import sys import mathpygame.init()width, height 800, 600 screen pyga…

关于 C/C++ 1Z(17)开源项目 openppp2 协同程式切换工作流

下述为开源项目 openppp2(github)构建工作在 C/C 17 的 stackful 有栈协同程式的工作流切换示意图: 在 openppp2 之中采用人工手动方式管理协同程式之间的切换,每个中断过程只是保存线程栈信息(如寄存器、当前#PC EIP&…

魔改一个过游戏保护的CE

csdn审核不通过 网易云课堂有配套的免费视频 int0x3 - 主页 文章都传到github了 Notes/外挂/魔改CE at master MrXiao7/Notes GitHub 为什么要编译自己的CE 在游戏逆向的过程中,很多游戏有保护,我们运行原版CE的时候会被检测到 比如我们开着CE运…

C语言——内存函数

前言&#xff1a; C语言中除了字符串函数和字符函数外&#xff0c;还有一些函数可以直接对内存进行操作&#xff0c;这些函数被称为内存函数&#xff0c;这些函数与字符串函数都属于<string.h>这个头文件中。 一.memcpy&#xff08;&#xff09;函数 memcpy是C语言中的…

【OpenGL】(1) 环境搭建:运行简单的 OpenGL 教学示例程序

&#x1f4ad; 写在前面&#xff1a;我们尽可能地让大家以 最简单粗暴且无脑的方式&#xff0c;带大家配置好 OpenGL 环境&#xff0c;并跑出我们第一个示例程序。再次声明&#xff0c;本专栏所有教学都是基于 Windows上使用 VS2022 (X64) 的。本专栏主要内容是关于 3D 计算机图…

用数组模拟单链表、双链表、栈、单调栈、队列、循环队列、单调队列

本文用于记录个人算法竞赛学习&#xff0c;仅供参考 目录 一.模拟单链表 二.双链表 三.栈 四.单调栈 五.队列 六.循环队列 七.单调队列 为什么要用数组模拟而不用现成的STL&#xff0c;因为用数组模拟效率会快一点&#xff0c;比如用结构体指针的方式创建链表&#xff0…

C++ 二叉树OJ题

&#x1f493;博主CSDN主页:麻辣韭菜-CSDN博客&#x1f493;   ⏩专栏分类&#xff1a;C知识分享⏪   &#x1f69a;代码仓库:C高阶&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多C知识   &#x1f51d;&#x1f51d; 前言 C二叉搜索树 这篇讲解了搜索二叉…

动态规划1

动态规划问题的五步操作&#xff1a; 动态规划就是把dp表填满&#xff0c;则最终一定有一个数据是我们所需要的数据 下面以一道简单的题目进行讲解 本题其实就是斐波那契数列的一个plus版 &#xff0c;就是利用递推关系求值的过程 1.前期准备&#xff1a;创建dp表(使用一维…

GRE和MGRE

思维导图 综合实验 配置IP地址 R1&#xff1a; [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]ip add 192.168.1.1 24 [R1-GigabitEthernet0/0/0]int s3/0/0 [R1-Serial3/0/0]ip add 15.1.1.1 24 R2: [R2]int g 0/0/0 [R2-GigabitEthernet0/0/0]ip ad 192.168.2.2 24 [R2-G…

基于四足机器人和机械臂的运动控制系统(二)

文章目录 前言一、四足步态二、视觉抓取三、远程遥控 谢绝转载&#xff0c;无作者许可不可用做其他用途&#xff08;如教育展示产品、课程设计或毕业设计等&#xff09; 前言 衔接上一篇文章&#xff0c;这篇文章主要来介绍项目的初步实现 一、四足步态 可以知道&#xff0…

常用的几种排序算法小结

目录 1.冒泡排序 2.堆排序 2.1堆的基础知识和特性 2.2向上调整算法和向下调整算法 2.3堆排序实现 3.插入排序 4.希尔排序 5.选择排序 5.1选择排序递归版 5.2选择排序非递归版 6.快速排序 6.1 Hoare版本之递归 6.1.1普通版 6.1.2随机数版 6.1.3三数取中版 6.1.4小区间优化…

前端虚拟滚动列表 vue虚拟列表

前端虚拟滚动列表 在大型的企业级项目中经常要渲染大量的数据&#xff0c;这种长列表是一个很普遍的场景&#xff0c;当列表内容越来越多就会导致页面滑动卡顿、白屏、数据渲染较慢的问题&#xff1b;大数据量列表性能优化&#xff0c;减少真实dom的渲染 看图&#xff1a;绿色…

安装最新的wxPython和Python3并保证二者兼容

要安装最新的wxPython和Python3并保证二者兼容&#xff0c;你可以按照以下步骤进行操作&#xff1a; 安装Python3&#xff1a; 访问Python官方网站下载适合你操作系统的最新版Python3安装包。运行安装程序&#xff0c;确保在安装过程中将Python添加到系统环境变量中。安装完成…

【Java】:static成员和代码块

目录 1.static成员 1.1再谈学生类 1.2static修饰成员变量 1.3static修饰成员方法 1.4static成员变量初始化 1.4.1就地初始化 1.4.2静态代码块初始化 2.代码块 2.1代码块概念以及分类 2.2普通代码块 2.3构造代码块 2.4静态代码块 1.static成员 1.1再谈学生类 使用类…

MATLAB 点云随机渲染赋色(51)

MATLAB 点云随机渲染赋色(51) 一、算法介绍二、算法实现1.代码2.效果总结一、算法介绍 为点云中的每个点随机赋予一种颜色,步骤和效果如图: 1、读取点云 (ply格式) 2、随机为每个点的RGB颜色字段赋值 3、保存结果 (ply格式) 二、算法实现 1.代码 代码如下(示例):…

gin基础学习笔记--参数验证

用gin框架的数据验证&#xff0c;可以不用解析数据&#xff0c;减少if else&#xff0c;会简洁许多。 package mainimport ("fmt""time""github.com/gin-gonic/gin""github.com/gorilla/sessions" )// 初始化一个cookie存储对象 // s…