【Redis】持久化机制

目录

前言:

RDB

触发RDB持久化方法有俩种:

1.手动触发

2.自动触发

RDB文件的优缺点:

AOF: 

 AOF工作机制:​编辑

​编辑重写机制:


前言:

Redis是一个内存数据库,将数据存储在内存中,追求速度快,但内存中的数据是不持久的,遇到突发情况,一旦重启内存中数据就没了~

为了保证速度快,数据一定要存储在内存中,但为了持久,数据也得存储在硬盘中;

插入一个新的数据,内存和硬盘都要写入,当查询数据的时候,从内存中读取即可;

硬盘上的数据为了Redis重启的时候,用来恢复内存中的数据;虽然同一份数据存储了俩遍,但硬盘比较便宜,无所谓~

Redis实现持久化方式:
1.RDB(Redis DataBase)定期备份
2.AOF (Append Only File)  实时备份


RDB

RDB持久化将内存中的所有数据,写入到硬盘中,生成一个“快照”,一旦重启之后,后面可以根据这个“快照”将数据恢复到内存中

快照路径: cd /var/lib/redis

 文件是一个二进制文件,里面的内容不可乱修改,如果后续再启动Redis的时候,发现格式有错误,有可能数据加载失败,导致启动不了Redis

    rdb文件中的数据,不是插入了数据,就会立即更新的!!!

    此次的数值可以修改的 但是生成一个rdb快照本身就是一个比较高的成本,不能让这个操作执行太频繁~

    假设此时在 10:00:00 生成了一次rdb

    10:00:01 这时redis插入了10000条数据

    10:01:00 生成下一个“快照”


    此时如果在10:00:01时间点服务器挂了 那么后面的数据将全部丢失

    所以在RDB机制下可能会丢失数据

    触发RDB持久化方法有俩种:

    1.手动触发

    • save命令:执行sava命令时候,redis将全力以赴的执行快照生成操作,将会阻塞redis其他客户端的命令,直到RDB过程完成,将会造成长时间的阻塞(不推荐使用)



    • bgsave命令:background(后面)不会影响redis服务器处理其他客户端的命令和请求,会执行“fork”操作,生成一个子进程;父进程继续处理客户端请求,让这个子进程负责持久化操作;子进程会生成一个新的RDB文件,将数据写入这个新的文件;子进程完成数据写入并关闭文件时,父进程会接受到信号,通知RDB文件更新完成;最后父进程会使用新的RDB文件,确保持久化的内容是新的,如果持久化发生错误,那么Redis会保持原来的RDB文件,确保数据一致性;

    由于持久化速度太快,很难凭肉眼观看是否文件已经持久化,可以通过linux中的stat命令,查看文件的inode编号~~

    2.自动触发

    1. 使用 save 配置。如 "save m n" 表示 m 秒内数据集发生了 n 次修改,自动 RDB 持久化。


    2. 从节点进行全量复制操作时,主节点自动进行 RDB 持久化,随后将 RDB 文件内容发送给从结点。 
    3. 执行 shutdown 命令(类似service redis-server restart)关闭 Redis 时,执行 RDB 持久化。

    RDB文件的优缺点:

    •  RDB 是一个紧凑压缩的二进制文件,代表 Redis 在某个时间点上的数据快照。非常适用于备份,全量复制等场景。比如每 6小时执行 bgsave 备份,并把 RDB 文件复制到远程机器或者文件系统中(如 hdfs)用于灾备。 
    • Redis 加载 RDB 恢复数据远远快于 AOF 的方式。

     RDB使用二进制的方式组织数据,AOF利用文本的方式组织数据

    • RDB 方式数据没办法做到实时持久化 / 秒级持久化。因为 bgsave 每次运行都要执行 fork 创建子进程,属于重量级操作,频繁执行成本过高。
    • RDB 文件使用特定二进制格式保存,Redis 版本演进过程中有多个 RDB 版本,兼容性可能有风险

    RDB最大的问题在于不能实时化保存数据,在俩次快照之间,实时的数据可能会丢失的情况; 


    AOF: 

    AOF (Append Only File)持久化主要作用是解决了数据持久化的实时性

    类似MySQL中的binlog,将用户的每次操作,记录到文件中,实时的记录了每一条数据,当Redis重新启动,会读取AOF文件中的数据,用来恢复数据;

    当开启AOF的时候,RDB不再生效;

     所在的位置跟RDB文件地址一样 /var/lib/redis

     

     AOF工作机制:

    为什么AOF又写内存还写硬盘,会影响Redis运行速度吗?

    实际上是没有影响的

    1.AOF机制并非直接把数据写入硬盘,而是写入内存缓冲区,累积一波,再统一写入硬盘,大大减低了写硬盘的次数;

    2.AOF是顺序写入数据,读取数据的时候是比随机写入快很多的

    如果在AOF写入内存缓冲区的时候,Redis掉电,那么数据也会丢失,但Redis提供了一些选项,供你选择缓冲区的刷新策略:


    重写机制:

    当AOF文件持续增大时,就会影响到Redis下次启动时间~

    AOF文件中有一些内容是冗余的

    例如

    set key 111 set key 222 set key 333 ->  set key 333

    set key 111 del key  set key2 222 del key2 -> 啥都不做即可

    因此Redis存在一个机制,可以将AOF文件进行整理操作,能够剔除其中的冗余操作,达到合并的效果,给AOF文件达到瘦身的效果

     

    父进程fork创建子进程,父进程仍然接收客户端的请求,子进程针对AOF文件重写,与RDB类似

    此时子节点继承了父进程的内存状态,但fork之后新来的请求,子节点并不知道;所以父节点准备了一个aof_rewrite_buf缓冲区专门放fork之后收到的数据,最后,当子节点把AOF数据写入完通知信号给父进程时,父进程再把 aof_rewrite_buf缓冲区内容一起写入新的AOF文件中~
    所以AOF是实时备份;


    选择: 

    因为AOF按文本的方式写入文件,但文本格式后续加载成本太高
    最后Redis采用了“混合持久化”的方法,结合AOF和RDB的优点,有文本也有二进制数据

    在Redis重启根据持久化恢复数据,会以AOF为主,因为数据更全

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

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

    相关文章

    Vue基础(2)

    19、组件之间传递数据 组件与组件之间不是完全独立的&#xff0c;而是有交集的&#xff0c;那就是组件与组 件之间是可以传递数据的 传递数据的解决方案就是 props ComponentA.vue <template><!-- 使用ComponentB组件&#xff0c;并传递title属性 --><h3>…

    Java操作Excel导入导出——POI、Hutool、EasyExcel

    目录 一、POI导入导出 1.数据库导出为Excel文件 2.将Excel文件导入到数据库中 二、Hutool导入导出 1.数据库导出为Excel文件——属性名是列名 2.数据库导出为Excel文件——列名起别名 3.从Excel文件导入数据到数据库——属性名是列名 4.从Excel文件导入数据到数据库…

    08-ArcGIS For JavaScript-通过Mesh绘制几何体(Cylinder,Circle,Box,Pyramid)

    目录 概述代码实现1、Mesh.createBox2、createPyramid3、Mesh.createSphere4、Mesh.createCylinder 完整代码 概述 对于三维场景而言&#xff0c;二位的点、线、面&#xff0c;三维的圆、立方体、圆柱等都是比较常见的三维对象&#xff0c;在ArcGIS For JavaScript中我们知道点…

    DAY6,使用互斥锁 和 信号量分别实现5个线程之间的同步

    题目 请使用互斥锁 和 信号量分别实现5个线程之间的同步 代码&#xff1a;信号量实现 void* task1(void* arg); void* task2(void* arg); void* task3(void* arg); void* task4(void* arg); void* task5(void* arg);sem_t sem[5]; //信号量变量int main(int argc, const …

    19_PlayerPres持久化_创建角色窗口

    创建脚本 编写脚本 using UnityEngine; //功能 : 角色创建界面 public class CreateWnd : WindowsRoot{protected override void InitWnd(){base.InitWnd();//TODO//显示一个随机名字} }创建角色窗口CreateWnd.cs应该在玩家点击 进入游戏 按钮后显示 所以在 登录窗口LoginWnd…

    热更新杂乱记

    热更新主要有一个文件的MD5值的比对过程&#xff0c;期间遇到2个问题&#xff0c;解决起来花费了一点时间 1. png 和 plist 生成zip的时候再生成MD5值会发生变动。 这个问题解决起来有2种方案&#xff1a; &#xff08;1&#xff09;.第一个方案是将 png和plist的文件时间改…

    【2024年华为OD机试】 (C卷,100分)- 用户调度问题(JavaScriptJava PythonC/C++)

    一、问题描述 问题描述 在通信系统中&#xff0c;有 n 个待串行调度的用户&#xff0c;每个用户可以选择 A、B、C 三种调度策略。不同的策略会消耗不同的系统资源。调度规则如下&#xff1a; 相邻用户不能使用相同的调度策略&#xff1a;例如&#xff0c;如果第 1 个用户选择…

    FPGA中场战事

    2023年10月3日,英特尔宣布由桑德拉里维拉(Sandra Rivera)担任“分拆”后独立运营的可编程事业部首席执行官。 从数据中心和人工智能(DCAI)部门总经理,转身为执掌该业务的CEO,对她取得像AMD掌门人苏姿丰博士类似的成功,无疑抱以厚望。 十年前,英特尔花费167亿美元真金白银…

    从手动到智能:自动化三维激光扫描

    三维扫描&#xff0c;是通过先进三维扫描技术获取产品和物体的形面三维数据&#xff0c;建立实物的三维图档&#xff0c;满足各种实物3D模型数据获取、三维数字化展示、3D多媒体开发、三维数字化存档、逆向设计、产品开发、直接3D打印制造或辅助加工制造等一系列的应用。 传统的…

    电容的一些常用数值

    如果是滤高频信号的小电容一般采用100nF 如果是滤低频信号的大电容一般采用10uF(10000nF) 比如这个LDO降压 两个一起用滤波效果会更好 如果想要供电引脚悬空&#xff0c;按理不能悬空&#xff0c;所以应该接大电阻接地&#xff0c;一般采用5.1KΩ 比如这个6Pin USB-TypeC的…

    编写子程序

    实验内容、程序清单及运行结果 编写子程序&#xff08;课本实验10&#xff09; 1.显示字符串 问题显示字符串是现象工作中经常用到的功能&#xff0c;应该编写一个通用的子程序来实现这个功能。我们应该提供灵活的调用接口&#xff0c;使调用者可以决定显示的位置&#xff0…

    亚马逊新店铺流量怎么提升?自养号测评新趋势

    在竞争激烈的电商市场中&#xff0c;亚马逊新店铺如何在众多竞争者中脱颖而出&#xff0c;提升流量成为一大难题。对于新手卖家来说&#xff0c;掌握正确的流量提升策略至关重要。本文将为您揭秘亚马逊新店铺流量提升的方法&#xff0c;助您快速打开市场&#xff0c;实现业绩增…

    FPGA自分频产生的时钟如何使用?

    对于频率比较小的时钟&#xff0c;使用clocking wizard IP往往不能产生&#xff0c;此时就需要我们使用代码进行自分频&#xff0c;自分频产生的时钟首先应该经过BUFG处理&#xff0c;然后还需要进行时钟约束&#xff0c;处理之后才能使用。

    JQuery基本介绍和使用方法

    JQuery基本介绍和使用方法 W3C 标准给我们提供了⼀系列的函数, 让我们可以操作: ⽹⻚内容⽹⻚结构⽹⻚样式 但是原⽣的JavaScript提供的API操作DOM元素时, 代码⽐较繁琐, 冗⻓. 我们可以使⽤JQuery来操作⻚⾯对象. jQuery是⼀个快速、简洁且功能丰富的JavaScript框架, 于20…

    Go语言中的值类型和引用类型特点

    一、值类型 值类型的数据直接包含值&#xff0c;当它们被赋值给一个新的变量或者作为参数传递给函数时&#xff0c;实际上是创建了原值的一个副本。这意味着对新变量的修改不会影响原始变量的值。 Go中的值类型包括&#xff1a; 基础类型&#xff1a;int&#xff0c;float64…

    15-spring整合mybatis方式一

    spring整合mybatis 方式一【重要】 步骤: 1.导入相关jar包 junit mybatis mysql数据库 spring相关的 aop织入 mybatis-spring 【new】 junit junit 4.12 mysql mysql-connector-java 8.0.23 org.mybatis mybatis 3.5.2 org.springframework spring-webmvc 5…

    豆包MarsCode:小C的类二进制拼图

    问题描述 思路分析 1. 类二进制数字定义 从题目中我们可以知道&#xff0c;类二进制数字是仅由 0 和 1 组成的数字。比如&#xff1a;1, 10, 100, 101, 110 等等&#xff0c;这些数字都是合法的类二进制数字。换句话说&#xff0c;类二进制数字可以看作是 “二进制表示法” 对…

    中国综合算力指数(2024年)报告汇总PDF洞察(附原数据表)

    原文链接&#xff1a; https://tecdat.cn/?p39061 在全球算力因数字化技术发展而竞争加剧&#xff0c;我国积极推进算力发展并将综合算力作为数字经济核心驱动力的背景下&#xff0c;该报告对我国综合算力进行研究。 中国算力大会发布的《中国综合算力指数&#xff08;2024年…

    Vue中设置报错页面和“Uncaught runtime errors”弹窗关闭

    文章目录 前言操作步骤大纲1.使用Vue自带的报错捕获机制添加报错信息2.在接口报错部分添加相同机制3.把报错信息添加到Vuex中方便全局使用4.添加报错页面备用5.app页面添加if判断替换报错界面 效果备注&#xff1a;vue项目中Uncaught runtime errors:怎样关闭 前言 在开发Vue项…

    单调栈详解

    文章目录 单调栈详解一、引言二、单调栈的基本原理1、单调栈的定义2、单调栈的维护 三、单调栈的应用场景四、使用示例1、求解下一个更大元素2、计算柱状图中的最大矩形面积 五、总结 单调栈详解 一、引言 单调栈是一种特殊的栈结构&#xff0c;它在栈的基础上增加了单调性约束…