Redis中RDB中的文件写入

RDB文件的创建与载入。

有两个Redis命令可以用于生成RDB文件,一个是SAVE,另一个是BGSAVE.
SAVE命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在服务器进程阻塞期间,服务器
不能处理任何命令请求:

127.0.0.1:6379> save
OK

和SAVE命令直接阻塞服务器进程的做法不同,BGSAVE命令会派生出一个子进程,然后由子进程负责
创建RDB文件,服务器进程(父进程)继续处理命令请求:

127.0.0.1:6379> BGSAVE
Background saving started

SAVE和BGSAVE的区别

创建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:# 处理出错情况

文件载入

和使用SAVE命令或者BGSAVE命令创建RDB文件不同,RDB文件的载入工作是在服务器启动自动执行的,所以Redis并没有专门用于载入RDB文件的命令,只要Redis服务器在启动时检测到RDB文件存在,它就会自动z载入RDB文件。以下时Redis服务器启动时打印的日志记录,其中第二条日志DB loaded from disk…就是服务器在成功RDB文件之后打印的:

[95568] 24 Mar 12:01:29.565 # Server started, Redis version 3.0.504
[95568] 24 Mar 12:01:29.565 * DB loaded from disk: 0.000 seconds
[95568] 24 Mar 12:01:29.566 * The server is now ready to accept connections on port 6379

注意

值得一提的是,因为AOF文件的更新频率通常比RDB文件的更新频率高,所以:

  • 1.如果服务器开启了AOF持久化功能,那么服务器会优先使用AOF文件来还原数据库状态
  • 2.只有在AOF持久化功能处于关闭状态时,服务器才会使用RDB文件来还原数据库状态。
    服务器判断该用哪个文件来还原数据库状态的流程如图所示。
    在这里插入图片描述

服务器在载入RDB文件期间,会一直处于阻塞状态,直到载入共工作完成为止。
载入RDB文件的实际工作由rdb.c/rdbLoad函数完成,这个函数和rdbSave函数之间的关系
可以用图表示
在这里插入图片描述

SAVE命令执行时的服务器状态.

当SAVE命令执行时,Redis服务器会被阻塞,所以当SAVE命令正在执行时,客户端发送的
所有命令请求都会被阻塞。只有在服务器执行完SAVE命令、重新开始接受命令请求之后,客户端
发送的命令才会被处理

BGSAVE命令执行时的服务器状态

因为BGSAVE的保存工作是由子进程执行的,所以在子进程创建RDB文件的过程中,Redis服务器
仍然可以继续处理客户端的命令请求,但是,在BGSAVE命令执行期间,服务器处理SAVE、BGSAVE、BGREWRITEAOF三个命令的方式会和平时有所不同.
首先,在BGSAVE命令执行期间,客户端发送的SAVE命令会被服务器拒绝,服务器禁止SAVE命令和BGSAVE命令执行是为了避免父进程(服务器进程)和子进程同时执行两个rdbSave调用,防止产生竞争条件。其次,在BGSAVE命令执行期间,客户端发送的BGSAVE命令会被服务器拒绝,因为同时执行两个BGSAVE会被服务器拒绝,因为同时执行两个BGSAVE命令也会产生竞争条件,代码如下

127.0.0.1:6379> BGSAVE
Background saving started
127.0.0.1:6379> BGSAVE
(error) ERR Background save already in progress

最后,BGREWRITEAOF和BGSAVE两个命令不能同时执行:

  • 1.如果BGSAVE命令正在z执行,那么客户端发送的BGREWRITEAOF命令会被延迟到BGSAVE命令执行完毕之后执行
  • 2.如果BGREWRITEAOF和BGSAVE两个命令的实际工作都由子进程执行,所以这两个命令在操作方面并没有什么冲突的地方,不能同时执行它们只是一个性能方面的考虑——并发出两个子进程,并且这两个子进程都同时执行大量的磁盘写入操作

自动间隔保存

当Redis服务器启动时,用户可以通过指定配置文件或者传入启动参数的方式设置save选项,
如果用户没有主动设置save选项,那么服务器会为save选项设置默认条件:

save 900 1
save 300 10
save 60 10000

接着,服务器程序会根据save选项所设置的保存条件,设置服务器状态redisServer结构的saveparams
属性:

struct redisServer {// ...// 记录了保存条件的数组struct saveparam *saveparams;// ...
};

saveparams属性是一个数组,数组中的每隔元素是一个saveparam结构,每隔saveparam结构都保存了一个save选项设置的保存ll额一个save选项设置的保存条件:

struct saveparam {// 秒数time_t seconds;// 修改int changes;
};

例子

举个例子,比如说,如果save选项的值为以下条件

save 900 1
save 300 10
save 60 10000

那么服务器状态中的saveparams数组将会是如图所示
在这里插入图片描述

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

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

相关文章

6.3 BP神经网络

在多层感知器被引入的同时,也引入了一个新的问题:由于隐藏层的预期输出并没有在训练样例中给出,隐藏层结点的误差无法像单层感知器那样直接计算得到。 为了解决这个问题,反向传播(BP)算法被引入&#xff0…

Python Flask 自定义404错误

from flask import Flask, abort, make_response, request, render_templateapp Flask(__name__)# 重定向到百度 app.route(/index, methods["GET", "POST"]) def index():if request.method "GET":return render_template("index.html&q…

阿里云倚天服务器全解析_倚天710处理器_基于新一代CIPU架构

阿里云倚天云服务器CPU采用倚天710处理器,租用倚天服务器c8y、g8y和r8y可以享受优惠价格,阿里云服务器网aliyunfuwuqi.com整理倚天云服务器详细介绍、倚天710处理器性能测评、CIPU架构优势、倚天服务器使用场景及生态支持: 阿里云倚天云服务…

c#矩阵求逆

目录 一、矩阵求逆的数学方法 1、伴随矩阵法 2、初等变换法 3、分块矩阵法 4、定义法 二、矩阵求逆C#代码 1、伴随矩阵法求指定3*3阶数矩阵的逆矩阵 (1)伴随矩阵数学方法 (2)代码 (3)计算 2、对…

SpringCloud-记

目录 什么是SpringCloud 什么是微服务 SpringCloud的优缺点 SpringBoot和SpringCloud的区别 RPC 的实现原理 RPC是什么 eureka的自我保护机制 Ribbon feigin优点 Ribbon和Feign的区别 什么是SpringCloud Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发…

设计模式之状态模式(一)

设计模式专栏: http://t.csdnimg.cn/4Mt4u 目录 1.概述 2.结构 3.实现 4.总结 1.概述 状态模式( State Pattern)也称为状态机模式( State Machine pattern), 是允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类, 属于行为型模式。 在状…

竞赛 python opencv 深度学习 指纹识别算法实现

1 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 python opencv 深度学习 指纹识别算法实现 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分工作量:4分创新点:4分 该项目较为新颖…

Docker(二):Docker常用命令

docker 查看docker支持的所有命令和参数。 ➜ ~ docker Management Commands:config Manage Docker configscontainer Manage containersimage Manage imagesnetwork Manage networksnode Manage Swarm nodesplugin Manage pluginssecret …

linux系统编程 socket part2

报式套接字 1.动态报式套接字2.报式套接字的广播3.报式套接字的多播4.UDP协议分析4.1.丢包原因4.2.停等式流量控制 接linux系统编程 socket part1 1.动态报式套接字 在之前的例子上,发送的结构体中的名字由定长改变长。可以用变长结构体。 变长结构体是由gcc扩展的…

蓝桥杯基础练习详细解析一(代码实现、解题思路、Python)

试题 基础练习 数列排序 资源限制 内存限制&#xff1a;512.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 给定一个长度为n的数列&#xff0c;将这个数列按从小到大的顺序排列。1<n<200 输入格式 第…

对于组件通信的深刻理解

父组件传递数据给子组件 props传递数据 父组件在子组件的标签上写自定义的属性,属性值是自己的变量,当渲染到子组件时,执行props会找自定义属性,内存了变量的内存,可访问到,写props,会生成vue实例的时候,将props的变量赋给,值找变量内存存入变量.插值语句等可访问.父组件会变…

android Fragment 生命周期 方法调用顺序

文章目录 Introlog 及结论代码 Intro 界面设计&#xff1a;点击左侧按钮&#xff0c;会将右侧 青色的RightFragment 替换成 黄色的AnotherRightFragment&#xff0c;而这两个 Fragment 的生命周期方法都会打印日志。 所以只要看执行结果中的日志&#xff0c;就可以知道 Fragme…