Redis中是如何初始化服务器的?
初始化服务器
一个Redis服务器从启动到能够接受客户端的命令请求,需要经过一系列的初始化和设置过程,比如初始化服务器状态,接受用户指定的服务器配置,创建相应的数据结构和网络连接等等
初始化服务器状态结构
初始化服务器的第一步就是创建一个struct redisServer类型的实例变量server作为服务器的状态,并为结构中的各个属性设置默认值。初始化server变量的工作由redis.c/initServerConfig函数完成,
void initServerConfig(void) {// 设置服务器的运行idgetRandomHexChars(seerver.runid, REDSI_RUN_ID_SIZE);// 为运行id加上结尾字符server.runid[REDIS_RUN_ID_SIZE] = '\0';// 设置默认配置文件路径server.configfile = NULL;// 设置默认服务器频率server.hz = REDIS_DEFAULT_HZ;// 设置服务器的运行架构server.arch_bits = (sizeof(long) == 8) ? 64 :32;// 设置默认服务器端口号server.port = REDIS_SERVERPORT;// ...
}
以下是initServerConfig函数完成的主要工作:
- 1.设置服务器的运行ID
- 2.设置服务器的默认运行频率
- 3.设置服务器的默认配置文件路径
- 4.设置服务器的运行结构
- 5.设置服务器的默认端口号
- 6.设置服务器的默认RDB持久化条件和AOF持久化条件
- 7.初始化服务器的LRU时钟
- 8.创建命令表
initServerConfig函数设置的服务器状态属性基本都是一些整数、浮点数、或者字符串属性,除了命令表之外,initServerConfig函数没有创建服务器状态的其他数据结构,数据库、慢查询日志、Lua环境、共享对象这些数据结构在之后的步骤才会被创建出来。当initServerConfig函数执行完毕之后,服务器就可以进入初始化的第二个节点——载入配置选项
载入配置选项
在启动服务器时,用户可以通过给定配置参数或者指定配置文件来修改服务器的默认配置。举个例子,如果我们在终端输入:
redis-server --port 10086
那么我们就通过给定配置参数的方式,修改了服务器的运行端口号。另外,如果在终端输入:
redis-server redis.conf
并且redis.conf文件中b包含以下内容:
# 将服务器的数据库数量设置为32个
databases 32
# 关闭RDB文件的压缩功能
rdbcompression no
那么我们就通过指定配置文件的方式修改了服务器的数据库数量,以及RDB持久化模块的压缩功能。服务器在用initServerConfig函数初始化server变量之后,就会开始载入用户给定的配置参数和配置文件,
并根据用户设定的配置,对server变量相关属性的值进行修改。例如,在初始化server变量时,程序会为决定服务器端口号的port属性设置默认值:
void initServerConfig(void) {// ...// 默认值为6379server.port = REDIS_SERVERPORT;
}
不过,如果用户在启动服务器时为配置选项port指定了新值10086,那么server.port属性的值就会被更新为10086,
这将使得服务器的端口号从默认的6379变为yoghurt指定的10086.
例如,在初始化server变量时,程序会为决定数据库数量的dbnum属性设置默认值:
void initServerConfig(void) {// ...// 默认值为16server.dbnum = REDIS_DEFUALT_DBNUM;
}
不过,如果用户在启动服务器时为选项databases设置了值32,那么server.dbnum属性的值就会被更新为32,这将使得服务器的数据库数量从默认的16个变为用户指定的32个。其他配置选项相关的服务器状态属性的情况与上面列举的port属性和dbnum属性一样:
- 1.如果用户为这些属性的相应选项指定了新的值,那么服务器就使用用户指定的值来更新相应的属性
2.如果用户没有为属性的相应选项设置新的值,那么服务器就沿用之前initServerConfig函数为属性的默认值。服务器在载入用户指定的配置选项,并对server状态进行更新之后,服务器就可以进入初始化的第三个阶段——初始化服务器数据结构
初始化服务器数据结构
在之前执行initServerconfig函数初始化server状态时,程序只创建了命令表一个数据结构,不过除了命令表之外,服务器状态还包括其他数据结构,比如:
- 1.server.clients链表,这个链表记录了所有与服务器相连的客户端的状态结构,链表的每隔节点都包含了一个redisClient结构实例
- 2.server.db数组,数组中包含了服务器的所有数据库
- 3.用于执行Lua脚本的Lua环境server.lua
- 4.用于保存慢查询日志的server.slowlog属性
当初始化服务器进行到这一步,服务器将调用initServer函数,为以上提到的数据结构分配内存,并在有需要时,为这些数据结构设置或者关联初始化值。服务器到现在才初始化数据结构的原因在于,服务器必须先载入用户指定的配置选项,然后才能正确地对数据结构进行初始化。如果在执行initServerConfig函数时就对数据结构进行初始化,那么一旦用户通过
配置选项修改了和数据有关地服务器状态属性,服务器就要重新调整和修改已创建地数据结构。为了避免出现这种麻烦的情况,服务器选择了将server状态的初始化分为两步进行,initServerConfig函数主要负责
初始化一般属性,而initServer函数主要负责初始化数据结构。除了初始化数据,initServer还进行了一些非常重要的设置操作,其中包括: - 1.为服务器设置进程信号处理器
- 2.创建共享对象,这些对象包含Redis服务器经常用到的一些值,比如包含"OK"回复的字符串对象,包含"ERR"回复的字符串对象,包含整数1到10000的字符串对象等等,服务器通过重用这些共享对象来避免反复
创建相同的对象 - 3.打开服务器的监听端口,并为监听套接字关联连接应答事件处理器,等待服务器正式运行时接受客户端的连接
- 4.为serverCron函数创建时间事件,等待服务器正式运行时执行serverCron函数
- 5.如果AOF持久化功能已经打开,那么打开现有的AOF文件,如果AOF文件不存在,那么创建并打开一个新的AOF文件,为AOF写入做好准备
- 6.初始化服务器的后台IO模块(bio),为将来的IO操作做好准备。
当initServer函数执行完毕之后,服务器将用ASCII字符在日志中打印出Redis的图标,以及Redis的版本号信息
file use E:\redis\redis-server.exe /path/to/redis.conf_.__.-``__ ''-.__.-`` `. `_. ''-._ Redis 3.0.504 (00000000/0) 64 bit.-`` .-```. ```\/ _.,_ ''-._( ' , .-` | `, ) Running in standalone mode|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379| `-._ `._ / _.-' | PID: 20212`-._ `-._ `-./ _.-' _.-'|`-._`-._ `-.__.-' _.-'_.-'|| `-._`-._ _.-'_.-' | http://redis.io`-._ `-._`-.__.-'_.-' _.-'|`-._`-._ `-.__.-' _.-'_.-'|| `-._`-._ _.-'_.-' |`-._ `-._`-.__.-'_.-' _.-'`-._ `-.__.-' _.-'`-._ _.-'`-.__.-'[20212] 01 Apr 21:06:44.205 # Server started, Redis version 3.0.504
[20212] 01 Apr 21:06:44.210 * DB loaded from disk: 0.005 seconds
[20212] 01 Apr 21:06:44.210 * The server is now ready to accept connections on port 6379
还原数据库状态
在完成了对服务器状态server变量的初始化之后,服务器需要载入RDB文件或者AOF文件,并根据文件记录的内容来还原服务器的数据库状态。根据服务器是否启用了AOF持久化功能,服务器载入数据时所使用的目标文件会有所不同:
- 1.如果服务器启用了AOF持久化功能,那么服务器使用AOF文件来还原数据库装填。
- 2.相反地,如果服务器没有启用AOF持久化功能,那么服务器使用RDB文件来还原数据库装填。当服务器完成数据库状态还原工作之后,服务器将在日志中打印出载入文件并还原数据库状态所耗费地时长:
[7256] 01 Apr 21:07:11.795 * DB loaded from disk: 0.000 seconds
执行事件循环
在初始化地最后一步,服务器将打印出以下日志:
[7256] 01 Apr 21:07:11.795 * The server is now ready to accept connections on port 6379
并开始执行服务器的事件循环(loop).至此,服务器的初始化工作圆满完成,服务器现在开始可以接受客户端的连接请求,并处理客户端发来的命令请求了
相关文章:
Redis中是如何初始化服务器的?
初始化服务器 一个Redis服务器从启动到能够接受客户端的命令请求,需要经过一系列的初始化和设置过程,比如初始化服务器状态,接受用户指定的服务器配置,创建相应的数据结构和网络连接等等 初始化服务器状态结构 初始化服务器的第…...
深度学习训练过程中,常见的关键参数和概念讲解
深度学习训练过程中的关键参数和概念对于构建、理解和优化模型至关重要。以下是一些最常见的参数和概念,以及它们的简要解释: 1. 学习率(Learning Rate) 学习率是优化算法中最重要的参数之一,它控制着权重调整的幅度…...
如何提高小红书笔记的收录率?
在小红书平台上,笔记的收录率是衡量一篇笔记是否受欢迎和有价值的重要因素。为了提高笔记的收录率,有几个关键点需要注意: 1.内容不涉及广告 在发布笔记前要先确保笔记内容不包含任何形式的广告或推广信息。小红书平台对于广告性质的内容有…...
思通数科:利用开源AI能力引擎平台打造企业智能搜索系统
在信息爆炸的时代,如何高效地管理和检索海量数据已成为企业和个人面临的一大挑战。思通数科 StoneDT 多模态AI能力引擎平台,以其强大的自然语言处理(NLP)、OCR识别、图像识别和文本抽取技术,为用户带来了前所未有的智能…...
Nginx配置其实很简单
Nginx配置其实很简单 不管作为前端还是后端,我们工作中或多或少得接触反向代理,比如代理静态页面或者文件、代理接口解决跨域、配置https、配置缓存和负载等等。而这些需求的实现,我们肯定能接触到Nginx,即使我们使用Caddy等等其它代理方式,但也肯定知道Nginx的存在。如果…...
Redis中的serverCron函数(一)
serverCron函数 Redis服务器中的serverCron函数默认每隔100毫秒执行一次,这个函数负责管理服务器的资源,并保持服务器自身的良好运转。 更新服务器时间缓存 Redis服务器中有不少功能需要获取系统的当前时间,而每次获取系统的当前时间都需要…...
python保存中间变量(学习笔记)
python保存中间变量 原因: 最近在部署dust3r算法,虽然在本地部署了,也能测试出一定的结果,但是发现无法跑很多图片,为了能够测试多张图片跑出来的模型,于是就在打算在autodl上部署算法,但是由…...
CTF wed安全(攻防世界)练习题
一、Training-WWW-Robots 进入网站如图: 翻译:在这个小小的挑战训练中,你将学习Robots exclusion standard。网络爬虫使用robots.txt文件来检查它们是否被允许抓取和索引您的网站或只是其中的一部分。 有时这些文件会暴露目录结构,…...
计算机网络链路层
数据链路 链路是从一个节点到相邻节点之间的物理线路(有线或无线) 数据链路是指把实现协议的软件和硬件加到对应链路上。帧是点对点信道的数据链路层的协议数据单元。 点对点信道 通信的主要步骤: 节点a的数据链路层将网络层交下来的包添…...
VUE3——reactive对比ref
从定义数据角度对比: 。ref用来定义:基本类型数据 。reactive用来定义:对象(或数组)类型数据。 。备注:ref也可以用来定义对象(或数组)类型数据,它内部会自动通过 reactive 转为代理对象。 从原理角度对比: 。ref通过 object.defineProperty()的 get 与set 来实现响应式(数据劫…...
广场舞团系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)
本项目包含可运行源码数据库LW,文末可获取本项目的所有资料。 推荐阅读100套最新项目持续更新中..... 2024年计算机毕业论文(设计)学生选题参考合集推荐收藏(包含Springboot、jsp、ssmvue等技术项目合集) 目录 1. 系…...
经典永不过时 Wordpress模板主题
经得住时间考验的模板,才是经典模板,带得来客户的网站,才叫NB网站。 https://www.jianzhanpress.com/?p2484...
QT布局管理和空间提升为和空间间隔
QHBoxLayout:按照水平方向从左到右布局; QVBoxLayout:按照竖直方向从上到下布局; QGridLayout:在一个网格中进行布局,类似于HTML的table; 基本布局管理类包括:QBoxLayout、QGridL…...
Yolo 自制数据集dect训练改进
上一文请看 Yolo自制detect训练-CSDN博客 简介 如下图: 首先看一下每个图的含义 loss loss分为cls_loss, box_loss, obj_loss三部分。 cls_loss用于监督类别分类,计算锚框与对应的标定分类是否正确。 box_loss用于监督检测框的回归,预测框…...
vlan间单臂路由
【项目实践4】 --vlan间单臂路由 一、实验背景 实验的目的是在一个有限的网络环境中实现VLAN间的通信。网络环境包括两个交换机和一个路由器,交换机之间通过Trunk链路相连,路由器则连接到这两个交换机的Trunk端口上。 二、案例分析 在网络工程中&#…...
day4 linux上部署第一个nest项目(java转ts全栈/3R教室)
背景:上一篇吧nest-vben-admin项目,再开发环境上跑通了,并且build出来了dist文件,接下来再部署到linux试试吧 dist文件夹是干嘛的? 一个pnpn install 直接生成了两个dist文件夹,前端admin项目一个…...
学会这几点,是搭建产品知识库的关键
现如今,企业都特别看重产品知识库,因为有了它,企业就能更好地管理产品信息,提升客户服务水平,还能帮企业做决策。但是,搭建一个好用、高效的产品知识库,也难倒了不少人。下面,我们一…...
MySql 常用的聚合函数总结
MySQL 中的聚合函数用于对一组数据进行计算,并返回单个值作为结果。以下是常用的 MySQL 聚合函数的总结及其功能描述: 1. COUNT() 功能:用于计算指定列或表中的行数。 语法: COUNT(*) COUNT(expression) 示例: SELECT …...
Charles for Mac 强大的网络调试工具
Charles for Mac是一款功能强大的网络调试工具,可以帮助开发人员和测试人员更轻松地进行网络通信测试和调试。以下是一些Charles for Mac的主要特点: 软件下载:Charles for Mac 4.6.6注册激活版 流量截获:Charles可以截获和分析通…...
【数据结构】优先级队列——堆
🧧🧧🧧🧧🧧个人主页🎈🎈🎈🎈🎈 🧧🧧🧧🧧🧧数据结构专栏🎈🎈🎈&…...
【力扣】45.跳跃游戏Ⅱ
45.跳跃游戏Ⅱ 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i j] 处: 0 < j < nums[i]i j < n 返回到达 n…...
containerd使用了解
containerd使用了解 yum安装 [rootvm ~]# curl -o /etc/yum.repos.d/docker.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo [rootvm ~]# yum list | grep containerd containerd.io.x86_64 1.6.28-3.1.el7 doc…...
gateway 分发时若两个服务的路由地址一样,怎么指定访问想要的服务下的地址
1.思路 在使用Spring Cloud Gateway时,如果两个服务的路由地址相同,可以通过Predicate(断言)和Filter(过滤器)的组合来实现根据请求的不同条件将请求分发到不同的服务下的地址。 使用Predicate进行路由条件…...
【LeetCode】三月题解
文章目录 [2369. 检查数组是否存在有效划分](https://leetcode.cn/problems/check-if-there-is-a-valid-partition-for-the-array/)思路:代码: [1976. 到达目的地的方案数](https://leetcode.cn/problems/number-of-ways-to-arrive-at-destination/) 思路…...
云手机:实现便携与安全的双赢
随着5G时代的到来,云手机在各大游戏、直播和新媒体营销中扮演越来越重要的角色。它不仅节约了成本,提高了效率,而且在边缘计算和云技术逐渐成熟的背景下,展现出了更大的发展机遇。 云手机的便携性如何? 云手机的便携性…...
fast_bev学习笔记
目录 一. 简述二. 输入输出三. github资源四. 复现推理过程4.1 cuda tensorrt 版 一. 简述 原文:Fast-BEV: A Fast and Strong Bird’s-Eye View Perception Baseline FAST BEV是一种高性能、快速推理和部署友好的解决方案,专为自动驾驶车载芯片设计。该框架主要包…...
Collection与数据结构链表与LinkedList(三):链表精选OJ例题(下)
1. 分割链表 OJ链接 class Solution {public ListNode partition(ListNode head, int x) {if(head null){return null;//空链表的情况}ListNode cur head;ListNode formerhead null;ListNode formerend null;ListNode latterhead null;ListNode latterend null;//定义…...
05 | Swoole 源码分析之 WebSocket 模块
首发原文链接:Swoole 源码分析之 WebSocket 模块 大家好,我是码农先森。 引言 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它允许客户端和服务器之间进行实时数据传输。 与传统的 HTTP 请求-响应模型不同,WebSocket 可以保持…...
Vue--------父子/兄弟组件传值
父子组件 子组件通过 props 属性来接受父组件的数据,然后父组件在子组件上注册监听事件,子组件通过 emit 触发事件来向父组件发送数据。 defineProps接收 let props defineProps({data: Array, }); defineModel接收 let bb defineModel("sit…...
Qt实现Kermit协议(一)
1 概述 Kermit文件运输协议提供了一条从大型计算机下载文件到微机的途径。它已被用于进行公用数据传输。 其特性如下: Kermit文件运输协议是一个半双工的通信协议。它支持7位ASCII字符。数据以可多达96字节长度的可变长度的分组形式传输。对每个被传送分组需要一个确认。Kerm…...
网站首页广告代码/上海推广网站
项目地址:github.com/razerdp/Fri… 下篇链接:http://www.jianshu.com/p/94e1e267b3b3 题目命名是不是很简单粗暴←_← 咳咳,进入正题,关于本项目什么的,在GitHub都写得清清楚楚了,我们就不废话,…...
做网站产品资料表格/做个小程序需要花多少钱
我正在建立一个网站并且有一个我似乎无法解决的小问题,我创建了一个高度为100%的div,里面的div是一个滑块div,高度为100%,问题是第一个div显示高度为0px,以便滑块div下面的div显示在滑块div后面,任何可以帮助我的人?这是我的代码:…...
能不能同行网站做站长统计/先做后付费的代运营
xsim安装手记(转)或许大家都已经搞定了Redhat Linux 7.3的汉化工作,但是却在为找一款而发愁,Redhat 7.3虽然已经自带了一个中文输入法――miniChinput,不过用来总觉得不爽,于是乎呢,我搜遍网络,终于找到了一…...
国内的优秀网站/东莞网站公司哪家好
1 先安装virtualbox软件 注意下载win版本的,因为我是想在windows环境下安装的。起初下载了linux的安装版本。安装直接安装提示默认选择next安装 2 .下载 ubuntu-64镜像文件 3 打开virtualbox软件 3.1 点击新建,为新建的虚拟机命名,选择系…...
阿里云网站建设方案书/杭州网站推广公司
本文给大家讲解了关于linux服务器被黑的解决方法。其中的讲到了“root kits”或者流行的刺探工具占用了你的CPU,存储器,数据和带宽的问题。 平时会有一些朋友遇见服务器被黑的问题,经过搜集和整理相关的相关的材料,在这里本人给大…...
wordpress 鼠标经过/浙江搜索引擎优化
使用make更新函数库文件 函数库文件也就是对Object文件(程序编译的中间文件)的打包文件。 在Unix下,一般是由命令"ar"来完成打包工作。 函数库文件的成员 一个函数库文件由多个文件组成。你可以以如下格式指定函数库文件及其组成…...