redis设计与实现(二)——持久化

news2025/2/22 23:45:36

1. 前言:

  • redis是一个基于内存是键值对数据库,但是并非把数据存入内存就高枕无忧了。
  • 为了应对可能出现的进程中止,断电等意外情况,redis提供了持久化功能把数据持久化到硬盘。

2. RDB持久化

2.1. rdb文件的创建

rdb通过创建二进制数据文件进行文件的恢复和备份。
在这里插入图片描述

  1. SAVE命令
    在这里插入图片描述
    使用后redis阻塞所有命令。
  2. BGSAVE
    在这里插入图片描述
    BGSAVE 会启动一个子进程进行rdb备份。

总结

  • SAVE和 BGSAVE都是调用 rdbSAVE 方法进行备份。

  • BGSAVE的时候BGREWRITEAOF操作会被延迟执行。

  • 载入rdb文件的命令为rdbLoad。在这里插入图片描述

  • 服务器载入rdb文件的时候为阻塞状态。

2.2. 自动备份rdb

redis允许用户使用一些任务条件触发bgsave进行rdb备份。
在这里插入图片描述
redis通过saveprams添加savepram添加哎保存条件,只要条件有一个满足,就会执行rdb备份。
在这里插入图片描述

redis会每100毫秒遍历一次是否有条件满足

# 添加条件,900秒内进行了一次修改
save 900 1

在这里插入图片描述
redis中通过redisSetver中:

  • dirty:记录从上次rdbSave到现在修改次数
  • lastsave: 上次执行保存的时间

2.3. rdb的文件结构

1. rdb文件

在这里插入图片描述

  1. REDIS: 开头的五个字节,用于标识rdb文件
  2. db_version: 版本号,字符串表示的整数
  3. datebases : 核心存储数据
  4. EOF: 结束符
  5. check_sum: 校验和

2. database

在这里插入图片描述

  1. SELECTDB: 1字节,标识着数据库数据
  2. db_number: 1/2/5字节,数据库编号
  3. key_value_pairs: 核心保存数据

3.key_value_pairs

在这里插入图片描述

  • EXPIRETIME_MS: 1字节,字段标志符。
  • ms: 8字节整数,unix时间戳,过期时间。
  • type: value对象类型
  • key:键值对key,字符串对象
  • value:键值对value,根据type决定类型

2. AOF持久化

在这里插入图片描述
aop通过保存保存写命令记录数据库状态。

2.1. AOF 存储流程

在这里插入图片描述

  1. 当redis收到写命令是会把写命令追加到buf里,如使用set KEY VALUE 在这里插入图片描述
  2. redis会使用processFileEvents定期把buf里数据追加到aof文件里。频率为每次loop(redis本质就是一个无限loop的进程)
    在这里插入图片描述
  • flushAppendOnlyFile默认的默认策略是everysec
策略appendfsync 选项的值
always将 aof_buf 缓冲区中的所有内容写入 AOF 文件
everysec每秒将 aof_buf 缓冲区中的所有内容写入 AOF 文件,如果上次同步 AOF 文件的时间间隔超过了一秒钟,那么再次对 AOF 文件进行同步,并且这个同步操作是由一个线程专门负责执行的
no将 aof_buf 缓冲区中的所有内容写入 AOF 文件,但并不对 AOF 文件进行同步,同步操作由操作系统决定何时执行

为什么要有这几个策略?

  • 在操作系统中,如果执行write把数据写入到硬盘的时候,操作系统并不会立马写入,而是保存到缓冲区。等到缓冲区满或者超过一定时间才写入。
  • 这带来了额外的数据安全问题,redis提供了同步函数flushAppendOnlyFile,强制让操作系统把数据写入到硬盘。
  • 这几种策略是选择什么时候强制把数据写入硬盘。不同的写入策略关乎到性能和安全的权衡。

2.2. AOF 的读取和优化

  1. 读取aof还原
    在这里插入图片描述
    aof通过伪客户端,一步一步执行写入命令,由于aof文件保存了100%的写入命令,理论上它要慢得多。事实上也确实,但是aof存在优化策略,把部分写入命令合并。

  2. 重写aof优化

在这里插入图片描述
如果能把这六个命令变成一个命令就可以大大寄生空间

PRUSH list “C”
PRUSH list “A”

PRUSH list “B”

PRUSH list “G”

PRUSH list “D”,"E"
# 合成后
PRUSH list "A","B","C","D","E"

是不是以为redis要遍历aof文件找相同的合并同类项了?

可惜并没有。redis的重写并非老实巴交的合并同类项,而是通过查询redis数据库数据项,生成一个当前状态的写入语句。redis甚至没有遍历旧的aof文件
在这里插入图片描述
灵魂拷问:既然大概率重写,为什么要高缓冲区的那一套呢?
答:其实是一个空间和性能的综合考虑,而且aof 重写的概率并不高。

  1. aof的不阻塞重写
    在这里插入图片描述
  • aof通过子进程堆aof重写,能正常接受业务。
  • aof会将新的写入命令写如重写缓冲区
  • aof子进程完毕,请求父进程接管,父进程
  • 把aof重写缓冲区内容追加到aof新文件里,然后原子地替换旧的aof文件

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

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

相关文章

智能合约 - 部署ERC20

Remix介绍 Remix是一个由以太坊社区开发的在线集成开发环境(IDE),旨在帮助开发者编写、测试和部署以太坊智能合约。它提供了一个简单易用的界面,使得开发者可以在浏览器中直接进行智能合约的开发,而无需安装任何额外的…

借助Aspose.html控件,在 C# 中更改 HTML 边框颜色

在这篇博文中,我们将学习如何在 C# 中更改 HTML 边框颜色。本指南将为您提供使用 C# 以编程方式有效更改 HTML 文件中的边框颜色、CSS 边框颜色、 HTML表格边框颜色等所需的知识和技能。 Aspose.Html 是一种高级的HTML操作API,可让您直接在.NET应用程序…

Linux TCP参数——tcp_adv_win_scale

文章目录 tcp_adv_win_scaleip-sysctl.txt解释buffering overhead内核缓存和应用缓存示例计算深入理解从2到1(tcp_adv_win_scale的值)总结 tcp_adv_win_scale adv-advise;win-window; 用于指示TCP中接收缓存比例的值。 static inline int tcp_win_from_space(int …

【Unity每日一记】unity中的内置宏和条件编译(Unity内置脚本符号)

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:uni…

放慢音频速度的三个方法 享受慢音乐

如何让音频慢速播放?我们都知道,在观看视频时,我们可以选择快进播放,但是很少有软件支持慢速播放。然而,将音频慢速播放在某些情况下是非常必要的。例如,当我们学习一门新语言时,我们可以将音频…

C语言(排序、逆序、计算天数、矩阵转置)

一、对10个整数排序&#xff08;从小到大&#xff09;。例如原来 a[0]~a[9]的值为 6 90 45 56 1 15 44 78 58 101&#xff0c;排完序后a[0]~a[9]的值变为 1 6 15 44 45 56 58 78 90 101。 #include<stdio.h> int main() {int i,j,t;int a[10]{6,90,…

量子加速超算简介

量子加速超算简介 有用的量子计算的发展是全球政府、企业和学术界的巨大努力。 量子计算的优势可以帮助解决世界上一些与材料模拟、气候建模、风险管理、供应链优化和生物信息学等应用相关的最具挑战性的问题。 要实现量子计算的优势&#xff0c;需要将量子计算机集成到现有的…

SpringBoot+Redis实现分布式WebSocket

什么是分布式WebSocket&#xff1f; 是指在分布式系统架构中实现WebSocket的通信机制&#xff0c;它允许在不同的服务器节点之间共享和同步WebSocket会话状态&#xff0c;从而实现跨多个服务器的实时消息传递。 在分布式环境中实现WebSocket的挑战主要包括以下几点&#xff1a…

mac npm install 很慢或报错

npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://registry.npm.taobao.org/pnpm failed, reason: certificate has expired 1、取消ssl验证&#xff1a; npm config set strict-ssl false 修改后一般就可以了&#xff0c;…

BootScrap详细教程

文章目录 前言一、BootScrap入门二、导航三、栅格系统四、container五、面板六、媒体对象七、分页八、图标九、实现动态效果 前言 BootScrap是别人帮我们写好的CSS样式。如果想要使用BootScrap&#xff0c;需要先下载下来&#xff0c;在页面上引入&#xff0c;编写HTML需要按照…

【实验01 扩展实验】C#桌面项目:简易计算器

【实验要求】 &#xff08;1&#xff09;新建一个C#桌面项目Calc&#xff0c;实现简易计算器功能&#xff0c;界面如图1所示。 &#xff08;2&#xff09;计算方式&#xff1a;通过点击对应的按钮&#xff0c;输入第1个数&#xff08;可以是整数或实数&#xff09;&#xff0c…

配置LVS NAT模式

配置LVS NAT模式 环境准备 client1&#xff1a;eth0->192.168.88.10&#xff0c;网关192.168.88.5lvs1: eth0 -> 192.168.88.5&#xff1b;eth1->192.168.99.5web1&#xff1a;eth1->192.168.99.100&#xff1b;网关192.168.99.5web2&#xff1a;eth1->192.168…

【推荐】免费AI论文写作-「智元兔 AI」

还在为写论文焦虑&#xff1f;免费AI写作大师来帮你三步搞定&#xff01; 智元兔AI是ChatGPT的人工智能助手&#xff0c;并且具有出色的论文写作能力。它能够根据用户提供的题目或要求&#xff0c;自动生成高质量的论文。 不论是论文、毕业论文、散文、科普文章、新闻稿件&…

内置泵电源,热保护电路等功能的场扫描电路D78040,偏转电流可达1.7Ap-p,可用于中小型显示器。

D78040是一款场扫描电路&#xff0c;偏转电流可达1.7Ap-p&#xff0c;可用于中小型显示器。 二 特 点 1、有内置泵电源 2、垂直输出电路 3、热保护电路 4、偏转电流可达1.7Ap-p 三 基本参数 四 应用电路图 1、应用线路 2、PIN5脚输出波形如下&#xff1a;

顶顶通呼叫中心中间件-群集配置方法讲解(mod_cti基于FreeSWITCH)

群集介绍 比较多的外呼或呼入系统&#xff0c;假如整个系统需要1万并发&#xff0c;单机最高就3000-5000并发&#xff0c;这时就需要多机群集了。顶顶通呼叫中心中间件使用redis数据库&#xff0c;多个FreeSWITHC(mod_cti)连接同一个redis就可以很容易的配置成群集系统。 想了…

java Flink(四十二)Flink的序列化以及TypeInformation介绍(源码分析)

Flink的TypeInformation以及序列化 TypeInformation主要作用是为了在 Flink系统内有效地对数据结构类型进行管理&#xff0c;能够在分布式计算过程中对数据的类型进行管理和推断。同时基于对数据的类型信息管理&#xff0c;Flink内部对数据存储也进行了相应的性能优化。 Flin…

【DL经典回顾】激活函数大汇总(二十一)(BReLU附代码和详细公式)

激活函数大汇总&#xff08;二十一&#xff09;&#xff08;BReLU附代码和详细公式&#xff09; 更多激活函数见激活函数大汇总列表 一、引言 欢迎来到我们深入探索神经网络核心组成部分——激活函数的系列博客。在人工智能的世界里&#xff0c;激活函数扮演着不可或缺的角色…

深度学习面经-part3(RNN、LSTM)

3.RNN 核心思想&#xff1a;像人一样拥有记忆能力。用以往的记忆和当前的输入&#xff0c;生成输出。 RNN 和 传统神经网络 最大的区别:在于每次都会将前一次的输出结果&#xff0c;带到下一次的隐藏层中&#xff0c;一起训练。 RNN应用场景: 1.文本生成 2.语音识别 3.机器翻…

【DataWhale学习笔记-蝴蝶书共读】大语言模型背后

从图灵测试到ChatGPT 1950年&#xff0c;艾伦•图灵(Alan Turing)发表论文《计算机器与智能》&#xff08; Computing Machinery and Intelligence&#xff09;&#xff0c;提出并尝试回答“机器能否思考”这一关键问题。在论文中&#xff0c;图灵提出了“模仿游戏”&#xff…

RabbitMQ介绍及搭建

架构 RabbitMQ是实现了高级消息队列协议&#xff08;AMQP&#xff09;的开源消息代理软件&#xff0c;使用erlang语言编写&#xff0c;依赖Erlang环境运行。 Broker&#xff1a;运行消息队列服务进程的节点&#xff0c;包含Exchange、Queue&#xff1b; Producer&#xff1a;消…