【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,一经查实,立即删除!

相关文章

Vue源码---虚拟Dom

Vue源码—虚拟Dom 真实dom 浏览器引擎渲染工作流程大致分为5步,创建dom树 -> 创建style Rules -> 创建render树 -> 布局layout -> 绘制painting 虚拟dom 虚拟dom节点,通过js的object 对象模拟dom中的节点,然后通过特定的rend…

seldom 实战技巧

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

Leetcode 3098. Find the Sum of Subsequence Powers

Leetcode 3098. Find the Sum of Subsequence Powers 1. 解题思路2. 代码实现 题目链接:3098. Find the Sum of Subsequence Powers 1. 解题思路 这一题思路上的话还是比较直接的,由于我们只需要求出每一个可能的power值,然后求出对应的po…

GitHub常用命令

GitHub常用命令 远程仓库相关命令拉取项目到本地拉取远程仓库推送远程仓库 分支操作相关命令查看所有本地分支查看所有远程分支查看所有本地分支和远程分支切换分支创建本地分支创建远程分支(本地分支push到远程)创建新分支并切换到新分支合并指定分支到当前分支删除分支 代码提…

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

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

蓝桥杯备考随手记: Math 类中常用方法

Java的Math类是一个包含数学操作方法的实用工具类。它提供了许多用于执行各种数学计算的静态方法。 下面是Math类中一些常用的方法: abs():返回参数的绝对值。 int absoluteValue Math.abs(-10); System.out.println(absoluteValue); // Output: 10 c…

EtherCAT主站SOEM -- 25 -- STM32F767-SOEM通过 PV模式(速度模式)控制一个电机转圈圈

EtherCAT主站SOEM -- 25 -- STM32F767-SOEM通过 PV模式(速度模式)控制一个电机转圈圈 0 QT-SOEM视频预览及源代码下载:0.1 QT-SOEM视频预览0.2 QT-SOEM源代码下载0.3 STM32F7-SOEM视频预览0.4 STM32F7-SOEM源代码下载1 程序文件修改替换1.1 allvalue.h1.2 allvalue.c1.3 mot…

BaseDao入门使用

目录 一、什么是BaseDao?BaseDao的优点:BaseDao用来做什么操作? 二、BaseDao封装增删改查 案例演示:1、java与数据库进行连接2、连接后可对其进行操作(增、删、改)返回影响行数3、查询 查询一个字段(返回一…

python基础练习题6

1、找出10000以内能被5或6整除,但不能被两者同时整除的数(函数) def find_numbers(m,n):result []for num in range(m,n):if (num % 5 0 or num % 6 0) and not (num % 5 0 and num % 6 0):result.append(num)return resultprint(find_…

Linux: 进程优先级

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

static修饰的方法为什么不能被覆盖?

在Java中,static方法不能被覆盖(overridden)的根本原理可以从以下几个角度进行解释: 静态绑定与动态绑定: 非静态方法(非static方法)的调用遵循动态绑定原则,即在运行时根据对象的实…

分布式系统概述(重要关键词加粗)

学习目标: 了解分布式 学习内容: 分布式系统是由多个计算机节点组成的系统,这些节点通过网络相互连接并协同工作,以完成共同的任务或服务。在分布式系统中,每个节点都运行着一部分应用程序,并且通常拥有自…

Leetcode 3100. Water Bottles II

Leetcode 3100. Water Bottles II 1. 解题思路2. 代码实现 题目链接:3100. Water Bottles II 1. 解题思路 这一题就是按照题目翻译一下,按照题中给出的规则不断进行bottle的兑换,直至无法兑换为止,即可得到最终的答案。 2. 代…

【3.31】

智乃想考一道完全背包(Easy version) 思路:虚拟物品的思路。可以把 l ∈ [ 1 , k ] , r ∈ [ k , n ] l\in[1, k], r\in[k, n] l∈[1,k],r∈[k,n] 的区间 ( l , r ) (l, r) (l,r) 看作一个虚拟物品,体积和价值为区间的体积和与价值和。这样做完全背包…

【项目技术介绍篇】若依开源项目RuoYi-Cloud前端技术介绍

作者介绍:本人笔名姑苏老陈,从事JAVA开发工作十多年了,带过大学刚毕业的实习生,也带过技术团队。最近有个朋友的表弟,马上要大学毕业了,想从事JAVA开发工作,但不知道从何处入手。于是&#xff0…

鸿蒙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等),进入内核态…

synchronized的使用方式

1、修饰实例方法 public synchronized void A(){} 这个时候锁的是当前的实例对象。多线程操作同一个实例的实例方法时,才会阻塞。 2、修饰静态方法 public synchronized static void A(){}这个时候锁的是整个类下所有的实例对象,静态方法是存在于方法…

自然语言处理:大模型LLM论文整理

LLMs 九层妖塔 地址:https://github.com/km1994/LLMsNineStoryDemonTower LLMs 千面郎君 地址:https://github.com/km1994/LLMs_interview_notes LLMs 论文学习笔记:https://gitee.com/km601/llms_paper NLP 百面百搭 地址:htt…