【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日志

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

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

相关文章

seldom 实战技巧

seldom 是我一直在维护的自动化测试框架。目前GitHub已经 500 star。 最近在项目中使用Seldom poium 编写自动化测试用例。接下来,我就分享一些使用技巧。 如何参数化测试用例 网站的首页,如上面的导航。于是,开始利用poium编写元素定位。…

基于 FFmpeg 和 SDL 的音视频同步播放器

基于 FFmpeg 和 SDL 的音视频同步播放器 基于 FFmpeg 和 SDL 的音视频同步播放器前置知识音视频同步简介复习DTS、PTS和时间基 程序框架主线程解复用线程音频解码播放线程视频解码播放线程 音视频同步逻辑源程序结果工程文件下载参考链接 基于 FFmpeg 和 SDL 的音视频同步播放器…

Linux: 进程优先级

Linux: 进程优先级 一、进程优先级概念二、如何查看进程优先级三、如何修改进程的优先级(PRL vs NI)四、为何优先级PRL必须限定范围五、进程其他特性 一、进程优先级概念 优先级的本质就是排队,而排队则是资源不足所引起的。在计算机中&#…

鸿蒙ARKTS--简易的购物网站

目录 一、media 二、string.json文件 三、pages 3.1 登录页面:gouwuPage.ets 3.2 PageResource.ets 3.3 商品页面:shangpinPage.ets 3.4 我的页面:wodePage.ets 3.5 注册页面:zhucePage.ets 3. 购物网站主页面&#xff…

STM32学习笔记(10_2)- I2C通信协议MPU6050简介

无人问津也好,技不如人也罢,都应静下心来,去做该做的事。 最近在学STM32,所以也开贴记录一下主要内容,省的过目即忘。视频教程为江科大(改名江协科技),网站jiangxiekeji.com 本期开…

[Linux_IMX6ULL驱动开发]-基础驱动

驱动的含义 如何理解嵌入式的驱动呢,我个人认为,驱动就是嵌入式上层应用操控底层硬件的桥梁。因为上层应用是在用户态,是无法直接操控底层的硬件的。我们需要利用系统调用(open、read、write等),进入内核态…

Java编程实战:疫情物资分配系统的设计与实现

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

Qt 富文本处理 (字体颜色大小加粗等)

Qt中支持HTML的控件有textEdit 、label 、textBrowser 。 接口:setHtml("Qt"); toHtml(). 文本样式设置 : 可分字设置 ,主要使用QTextCharFormat类进行文本样式设置。 示例: QTextCharFormat fmt; //粗体 fmt.setFontWeight…

查找算法及查找常用数据结构总结

1.顺序表查找 基本方法: 设查找表以一维数组来存储,要求在此表中查找出关键字的值为x的元素的位置,若查找成功,则返回其位置(即下标),否则,返回一个表示元素不存在的下标&#xff0…

VMware虚拟机共享主机v2rayN

目录 🌼前言 🌼解释 🚩操作 1)VMware -- 虚拟网络编辑器 2)VMware -- 网络适配器 3)主机 IP 地址 4)v2rayN 代理端口 5)VMware -- 网络代理(Network proxy) 🎂结…

红黑树介绍及插入操作的实现

🎉个人名片: 🐼作者简介:一名乐于分享在学习道路上收获的大二在校生 🙈个人主页🎉:GOTXX 🐼个人WeChat:ILXOXVJE 🐼本文由GOTXX原创,首发CSDN&…

windows平台虚拟机安装

windows平台虚拟机安装 1. 安装VMwareWorkstationPro 1.1 软件下载 官网下载 官网 百度网盘下载 版本 VMwareWorkstationPro16 链接:https://pan.baidu.com/s/1LidMxoM9e4a4CANixyRoyg?pwd1157 提取码:1157 1.2 软件安装 软件安装注意事项 软件…

代码学习第32天---动态规划

随想录日记part32 t i m e : time: time: 2024.03.30 主要内容:今天开始要学习动态规划的相关知识了,今天的内容主要涉及两个方面: 不同路径 ; 不同路径 II。 62.不同路径 63. 不同路径 II 动态…

Canvas实现圆点动画

示例效果图&#xff1a; 话不多说直接上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><t…

Unity类银河恶魔城学习记录11-10 p112 Items drop源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili ItemObject_Trigger.cs using System.Collections; using System.Collecti…

P28—P31:变量

P28-变量的定义 什么是变量&#xff1f; 从本质上来说&#xff0c;变量就是一块内存空间&#xff0c;而这块内存空间有数据类型、名字、字面值。变量包含三部分&#xff1a;数据类型、名字、字面值&#xff08;数据&#xff09;变量是内存中存储的基本单元。 数据类型的作用&a…

Linux 查看磁盘信息:df与du命令详解

一、df 1.简介 df 是 disk free的缩写&#xff0c;从UNIX和类UNIX操作系统的早期开始&#xff0c;它就是UNIX和类UNIX操作系统的一部分。它被设计为一种工具&#xff0c;用于监视系统上已使用和可用的磁盘空间数量。 df 命令主要用于需要检查文件系统上已使用和可用的磁盘空…

第十三届蓝桥杯JavaA组省赛真题 - GCD

解题思路&#xff1a; 找规律 最大的最小公因数就是两数的差值 5 7 gcd2 1 3 gcd2 1 4 gcd3 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scan new Scanner(System.in);long a scan.nextLong();long b scan.ne…

查找--二分查找(Binary Search)

二分查找属于静态查找表&#xff0c;当以有序表表示静态查找表时&#xff0c;查找函数可用折半查找来实现。 查找过程&#xff1a;先确定待查记录所在的范围&#xff08;区间&#xff09;&#xff0c;然后逐步缩小范围直到找到或找不到该记录为止。 以处于区间中间位置记录的…

Linux appimage如何正确打开

在之前的文章中&#xff0c;提到使用appimage软件非常方便。 但是首次使用会遇到这样的问题&#xff1a; 1. 双击打不开 2. 在终端打开提示&#xff1a; /home/roy/software/appimage/Obsidian-1.5.11.AppImage dlopen(): error loading libfuse.so.2 AppImages require …