Redis-03持久化

news2024/11/16 17:32:28

1、RDB持久化

Redis是一个键值对数据库服务器,服务器中通常包含着任意个非空数据库,而每个非空数据库中又可以包含任意个键值对,通常情况下将服务器中的非空数据库以及它们的键值对统称为数据库状态

Redis是内存数据库,它将自己的数据库状态储存在内存里面,如果不想办法将存储在内存中的数据库状态保存到磁盘中,那么一旦服务器进程退出,服务器中的数据库状态也会消失不见

为了解决持久化相关的问题,Redis提供了RDB持久化功能,这个功能可以将Redis在内存中的数据库状态保存到磁盘里面,避免上述数据意外丢失的情况

RDB持久化既可以手动执行,也可以根据服务器配置选项定期执行,该功能可以将某个时间点上的数据库状态保存到一个RDB文件中,如下图所示:

pPLwgWnpng

RDB持久化功能所生成的RDB文件是一个经过压缩的二进制文件,通过该文件可以还原成RDB文件中保存某个时间点的数据库状态,如下图所示:

pPLw5eUpng

因为RDB文件是保存在硬盘里面的,所以即使Redis服务器进程退出,甚至运行Redis服务器的计算机停机,但只要RDB文件仍然存在,Redis服务器就可以用RDB文件来还原数据库状态。

1.1、RDB文件的创建与载入

在Redis服务器中,有两个Redis命令可以用于生产RDB文件,一个是SAVE,另外一个是BGSAVE

SAVE命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在服务区进程阻塞期间,服务器不能处理任何命令请求:

127.0.0.1:6379 > SAVE // 等待RDB文件创建完毕,才会处理其他命令
OK

BGSAVE命令会派生出一个子进程,然后由子进程负责创建RDB文件,服务器进程(父进程)继续处理命令请求:

127.0.0.1:6379> BGSAVE // 派生子进程,并由子进程创建RDB文件
Background saving started

上述两个创建RDB文件的工作,是由rdb.c/rdbSave函数完成的,SAVE命令和BGSAVE命令会以不同的方式调用这个函数:

def SAVE() :
    # 创建RDB文件
    rdbSave();

def BGSAVE() :
    # 创建子进程
    pid = fork()

    if pid = 0 : 

        # 子进程负责创建RDB文件
        rdbSave()

        # 完成之后向父进程发送信号
        signal_parent()
    elif pid > 0 :

        # 父进程继续处理命令请求,并通过轮训等待子进程的信号
        handle_request_and_wait_signal()

    else :

        # 处理出错情况
        handle_fork_error()

RDB文件的载入工作是在服务器启动时自动执行的,Redis服务器在启动时检测到RDB文件存在,就会自动载入RDB文件

1.2、自动间隔性保存

SAVE命令与BGSAVE命令的实现方式主要有以下区别:

  • SAVE命令由服务器进程执行保存工作,SAVE会阻塞服务器

  • BGSAVE命令则由子进程执行保存工作,BGSAVE不会阻塞服务器

由于BGSAVE命令可以在不阻塞服务器进程的情况下执行,所以Redis允许用户通过设置服务器配置的save选项,让服务器每隔一段时间自动执行一次BGSAVE命令

服务器状态中会保存所有用save选项设置的保存条件,当任意一个保存条件被满足时,服务器会自动执行BGSAVE命令

配置案例如下:

# 服务器在900秒之内,对数据库进行了至少1次修改
save 900 1

# 服务器在300秒之内,对数据库进行了至少10次修改
save 300 10

# 服务器在60秒之内,对数据库进行了至少10000次修改
save 60 10000

1.3、RDB文件结构

RDB文件是一个经过压缩的二进制文件,由多个部分组成。

RDB的文件结构如下:

pPLrY0fpng

全大写单词表示常量,全小写单词表示变量和数据

  • REDIS

    • 这是RDB文件最开头的部分

    • 该部分长度为5字节

    • 保存着“REDIS”五个字符

    • 通过该部分保存的五个字符,程序可以在载入文件时,快速检查所载入的文件是否是RDB文件

  • db_version

    • 长度为4字节

    • 它的值是一个字符串表示的整数

    • 记录了RDB文件的版本号

  • databases

    • 包含着零个或者任意多个数据库(非空数据库

    • 以及各个数据库中的键值对数据

  • EOF

    • 这个常量长度为1字节

    • 标志着RDB文件正文内容的结束

    • 当读取程序遇到这个值的时候,表示数据库的所有键值对都已经载入完毕了

  • check_sum

    • 8字节长度的无符号整数

    • 保存着一个校验和

    • 这个校验和是程序通过对REDIS、db_version、databases、EOF四个部分的内容进行计算得出的

    • 服务器在载入RDB文件时,会将载入数据所计算出的校验和与check_sum所记录的校验和进行对比,以此来检查RDB文件是否出错或者损坏的情况出现

2、AOF持久化

除了上述提及的RDB持久化功能之外,Redis还提供了AOF(Append Only File)持久化功能。

AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的,如下图所示:

pPLyGo8png

例如,我们对空白的数据库执行以下写命令,那么数据库中将包含三个键值对:

127.0.0.1:6379[1]> SET msg "hello"
OK
127.0.0.1:6379[1]> SADD fruits "apple" "banana" "cherry"
(integer) 3
127.0.0.1:6379[1]> RPUSH numbers 128 256 512
(integer) 3

AOF持久化保存数据库状态的方法是将服务器执行的SET、SADD、RPUSH三个命令保存到AOF文件中

被写入AOF文件的所有命令都是以Redis的命令请求协议格式保存的,因为Redis的命令请求协议都是纯文本格式的,所以我们可以直接打开一个AOF文件

例如,上述所执行的三个命令,服务器将产生包含以下内容的AOF文件:

pPLysoTpng

服务器在启动时,可以通过载入和执行AOF文件中保存的命令来还原服务器关闭之前的数据库状态

2.1、AOF实现原理

AOF持久化功能的实现可以分为命令追加(append)、文件写入、文件同步(sync)三个步骤

2.1.1、命令追加

当AOF持久化功能处于打开状态时,服务器在执行一个写命令之后,会以协议格式将被执行的写命令追加到服务器状态的aof_buf缓冲区的末尾

struct redisServer{
    // AOF 缓冲区
    sds aof_buf;
}

2.1.2、文件写入&同步

Redis服务器进程就是一个事件循环(loop),这个循环中的文件事件负责接收客户端的命令请求,以及向客户端发送命令回复,而时间事件则负责执行像serverCron函数这样定时运行的函数

服务器在处理文件事件时会执行写命令,使得一些内容被追加到aof_buf缓冲区里面。

所以在服务器每次结束一个事件循环之前,都会调用flushAppendOnlyFile函数,考虑是否需要将aof_buf缓冲区中的内容写入和保存到AOF文件中,伪代码如下:

def eventLoop() :
    while True : 
        # 处理文件事件,接收命令请求以及发送命令回复
        # 处理命令请求时可能会有新内容被追加到aof_buf 缓冲区中
        processFileEvents()

        # 处理时间事件
        processTimeEvents()

        # 考虑是否要将 aof_buf 中的内容写入和保存到 AOF 文件中
        flushAppendOnlyFile()

flushAppendOnlyFile函数行为由服务器配置的appendfsync选项来决定:

默认选项为everysec

pPL6rjApng

2.2、AOF文件的载入与数据还原

因为AOF文件里面包含了重建数据库状态所需的所有写命令,所以服务器只要读入并重新执行一遍AOF文件里面保存的写命令,就可以还原服务器关闭之前的数据库状态。

还原数据库状态的步骤:

  • 创建一个不带网络连接的伪客户端(fake client)

  • 从AOF文件中分析并读出一条写命令

  • 使用伪客户端执行被读出的写命令

  • 一直执行步骤2和步骤3,直到AOF文件中的所有写命令都被处理完毕为止

pPL2k1epng

2.3、AOF重写

因为AOF持久化时通过保存被执行的写命令来记录数据库状态的,所以随着服务器运行时间的流逝,AOF文件中的内容会越来越多,文件的体积也会越来越大,如果不加以控制的话,体积过大的AOF文件很可能对Redis服务器、甚至整个宿主机造成影响,并且AOF文件的体积越大,使用AOF文件来进行数据还原所需的时间就越多。

为了解决AOF文件体积膨胀的问题,Redis提供了AOF文件重写(rewrite)功能

通过文件重写,Redis服务器可以创建一个新的AOF文件来替代现有的AOF文件,新旧两个AOF文件所保存的数据库状态相同,但新的AOF文件不会包含任何浪费空间的冗余命令,所以新AOF文件的体积通常会比旧AOF文件的体积要小得多

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

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

相关文章

【Ingress】

Ingress 一、作用二、使外部应用能够访问集群内服务方案1.NodePort2.LoadBalancer3.externalIPs4.Ingress 三、Ingress的组成1.ingress:nginx配置文件2.ingress-controller: 当作反向代理或者说是转发器 四、Ingress工作原理五、ingress暴露服务的方式方式一:Deploy…

WPF向Avalonia迁移(四、其他事项)

开发必备 1. Avalonia项目源代码!!!!!!!!!!没有源代码,你连控件的背景色怎么改都找不着!! 2.下载你所使用的版本&#x…

Tomcat 线程模型性能调优

Linux I/O模型详解 I/O要解决什么问题 I/O:在计算机内存与外部设备之间拷贝数据的过程。 程序通过CPU向外部设备发出读指令,数据从外部设备拷贝至内存需要一段时间,这段时间CPU就没事情做了,程序就会两种选择: 让出…

投资 3DEXPERIENCE® WORKS 的 10 大理由

3DEXPERIENCE Works 通过利用基于云的 3DEXPERIENCE 平台提供一个统一的协作环境,扩展 SOLIDWORKS 的价值,使参与 产品开发的每个人都能为创新流程做出贡献。简而言之,如果您喜欢使用 SOLIDWORKS,那么您可以在继续使用的同时&…

在minkube上部署Milvus

Milvus Milvus是一个向量数据库,可以为ai做数据支撑。 Preparatory Work minikube minikube是一款微型本地k8s install curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64sudo install minikube-linux-amd64 /usr/loca…

深入理解强化学习——强化学习的定义

分类目录:《深入理解强化学习》总目录 在机器学习领域,有一类任务和人的选择很相似,即序列决策(Sequential Decision Making)任务。决策和预测任务不同,决策往往会带来“后果”,因此决策者需要为…

电脑技巧:推荐一款桌面增强工具AquaSnap(附下载)

下载:飞猫盘|文件加速传输工具|云盘|橘猫旗下新概念云平台,取件码:ZdRW 一、软件介绍 AquaSnap(界面增强软件)是一款功能强大的界面增强软件。这款软件支持屏幕边缘吸附与屏幕分屏即多显示器控制、摇晃窗口…

重构项目 vue2 => vue3 nuxt2 => nuxt3 遇到的问题

vue3获取组件的上下文 import { getCurrentInstance } from vue; // 获取当前组件实例 const instance getCurrentInstance();// 获取当前组件的上下文,下面两种方式都能获取到组件的上下文。// 方式一,这种方式只能在开发环境下使用,生产环…

文件名太长,批量改名不求人:轻松解决文件名问题

在电脑使用过程中,我们经常需要处理各种文件,有时候会遇到文件名过长的问题。过长的文件名可能会让人感到混乱,也可能会引发一些操作问题。那么,如何快速解决文件名过长的问题呢?其实,我们可以通过批量重命…

webpack不同环境下使用CSS分离插件mini-css-extract-plugin

1.背景描述 使用mini-css-extract-plugin插件来打包css文件(从css文件中提取css代码到单独的文件中,对css代码进行代码压缩等)。 本次采用三个配置文件: 公共配置文件:webpack.common.jsdev开发环境配置文件&#x…

《DevOps 精要:业务视角》- 读书笔记(七)

DevOps 精要:业务视角(七) DevOps历程什么是企业体系的DevOps?DevOps的目标是什么? DevOps的知识体系规范敏捷持续交付IT服务管理以TPS理念为基础 DevOps团队角色流程主管(Process Master)服务主管&#xf…

环信web、uniapp、微信小程序SDK报错详解---登录篇

项目场景: 记录对接环信sdk时遇到的一系列问题,总结一下避免大家再次踩坑。这里主要针对于web、uniapp、微信小程序在对接环信sdk时遇到的问题。主要针对报错400、404、401、40 (一) 登录用户报400 原因分析: 从console控制台输出及networ…

Fuzz测试:发现软件隐患和漏洞的秘密武器

0x01 什么是模糊测试 模糊测试(Fuzz Testing)是一种广泛用于软件安全和质量测试的自动化测试方法。它的基本思想是向输入参数或数据中注入随机、不规则或异常的数据,以检测目标程序或系统在处理不合法、不正常或边缘情况下的行为。模糊测试通…

Elasticsearch搜索引擎:ES的segment段合并原理

在讲 segment 之前,我们先用一张图了解下 ES 的整体存储架构图,方便后面内容的理解: 一、segment文件的合并流程: 当我们往 ElasticSearch 写入数据时,数据是先写入 memory buffer,然后定时(默…

react create-react-app v5配置 px2rem (不暴露 eject方式)

环境信息: create-react-app v5 “react”: “^18.2.0” “postcss-plugin-px2rem”: “^0.8.1” 配置步骤: 不暴露 eject 配置自己的webpack: 1.下载react-app-rewired 和 customize-cra-5 npm install react-app-rewired customize-cra…

Python —— UI自动化之八大元素定位

1、基础元素定位 1、id定位 使用html中标签的id元素去定位,在一般定位中优先选择,举例: from time import sleep from selenium import webdriver from selenium.webdriver.common.by import Bydriver webdriver.Firefox() driver.get(&q…

【Linux 安装Kibana 及 Es 分词器安装】

一、客户端Kibana安装 Kibana是一个开源分析和可视化平台,旨在与Elasticsearch协同工作。参考文档 1. 下载并解压缩Kibana 下载路径 选择的版本是和 ElasticSearch 对应(7.17.3) 下载后上传到Linux 系统中,并放在 /root/ 下&a…

微软出品,166页深度解读,多模态GPT-4V

多模态王炸大模型GPT-4V,166页“说明书”重磅发布!而且还是微软团队出品。 什么样的论文,能写出166页? 不仅详细测评了GPT-4V在十大任务上的表现,从基础的图像识别、到复杂的逻辑推理都有展示; 还传授了…

【C++ 学习 ㉖】- 布隆过滤器详解(哈希扩展)

目录 一、布隆过滤器的简介 二、布隆过滤器的实现 2.1 - BloomFilter.h 2.2 - test.cpp 一、布隆过滤器的简介 布隆过滤器(Bloom Filter)是由 Burton Howard Bloom 在 1970 年提出的一种紧凑型的、比较巧妙的概率型数据结构(probabilist…

阿里云服务器全方位介绍——看这一篇就够了

阿里云服务器ECS英文全程Elastic Compute Service,云服务器ECS是一种安全可靠、弹性可伸缩的云计算服务,阿里云提供多种云服务器ECS实例规格,如经济型e实例、通用算力型u1、ECS计算型c7、通用型g7、GPU实例等,阿小云axiaoyun.com分…