开公司网站创建费用,佛山顺德容桂做网站的公司,注册推广软件,163企业邮箱怎么开通注册从本篇文章开始(命名为Redis分析系列)#xff0c;将会通过分析Redis的源代码(以Redis 2.2.0 RC1为准)#xff0c;来对它的内部实现做一些探讨。本文主要介绍Redis启动加载过程#xff0c;总体上可以分为如下几步#xff1a;1. 初始化全局服务器配置2. 加载配置文件(如果指定…从本篇文章开始(命名为Redis分析系列)将会通过分析Redis的源代码(以Redis 2.2.0 RC1为准)来对它的内部实现做一些探讨。本文主要介绍Redis启动加载过程总体上可以分为如下几步1. 初始化全局服务器配置2. 加载配置文件(如果指定了配置文件否则使用默认配置)3. 初始化服务器4. 加载数据库5. 网络监听整个启动加载过程如下图所示下面对于上图中的各个步骤一些介绍有些部分(如数据库加载、网络监听)会在后面单独用一篇文章详细说明。初始化全局服务器配置初始化全局服务器配置通过initServerConfig()函数完成主要是初始化server变量它是一个redisServer的结构类型structredisServer server;初始化的内容包括下面几个方面1. 网络监听相关如绑定地址TCP端口等2. 虚拟内存相关如swap文件、page大小等3. 保存机制多长时间内有多少次更新才进行保存4. 复制相关如是否是slavemaster地址、端口5. Hash相关设置6. 初始化命令表如其中的保存机制中服务器初始化策略为// 1小时内1次更新appendServerSaveParams(60*60,1);// 5分钟内100次更新appendServerSaveParams(300,100);// 1分钟内10000次更新appendServerSaveParams(60,10000);如果在启动服务器时指定了配置文件则会在下面的“加载配置文件”步骤中根据配置文件内容更改其中的某些服务器配置。加载配置文件如果指定了配置文件Redis使用loadServerConfig()函数加载配置文件整个过程没什么可以说的无非是使用标准I/O库打开配置文件循环读取每一行然后覆盖上一步进行的默认配置。这里有一点需要注意的是下载Redis后代码包中有一个默认配置文件如果启动Redis服务器时不指定配置文件Redis不会使用这个默认文件的配置而是使用上一步“初始化全局服务器配置”中的配置。在默认配置文件中提供的配置项与上一步默认初始化的配置有些事不一样的所以如果没有指定配置文件千万不能认为Redis的行为会按照默认配置文件进行最典型的一个例子在默认配置文件中的数据保存策略是#15分钟内1次更新save 900 1#5分钟内100次更新save 300 10#1分钟内10000次更新save 60 10000而默认初始化的全局配置中数据保存策略// 1小时内1次更新appendServerSaveParams(60*60,1);// 5分钟内100次更新appendServerSaveParams(300,100);// 1分钟内10000次更新appendServerSaveParams(60,10000);初始化服务器初始化服务器的工作在initServer()函数中主要是完成前面未完成的工作继续对server变量初始化如设置信号处理、创建clients、slaves列表创建Pub/Sub通道列表同时还会创建共享对象shared.crlf createObject(REDIS_STRING,sdsnew(\r\n));shared.ok createObject(REDIS_STRING,sdsnew(OK\r\n));shared.err createObject(REDIS_STRING,sdsnew(-ERR\r\n));shared.emptybulk createObject(REDIS_STRING,sdsnew($0\r\n\r\n));最后如果启用了虚拟内存机制还需要初始化虚拟内存相关如Thread I/O等。加载数据库在完成了上面的所有的初始化工作之后Redis开始加载数据到内存中如果启用了appendonly了(不知道这个参数做什么的请先看配置文件篇)则Redis从appendfile加载数据否则就从dbfile加载数据。1. 从appendfile中加载数据loadAppendOnlyFile()函数在此之前我们先来看一下appendfile里面保存了什么如我执行了下面两条命令(记得在配置文件中开启appendonly)redis SET mykey001 myvalue001OKredis GET mykey001myvalue001使用cat命令查看appendonly.aof文件内容$ cat appendonly.aof*2$6SELECT$10*3$3SET$8mykey001$10myvalue001嗯相信大家都能看明白(看不明白的请先看这篇文章)在appendonly.aof文件中保存的正是从客户端发过来的请求命令还可以看到对于GET命令并没有保存。既然appendonly.aof中保存了所有写入数据的请求命令那么在加载数据的时候只要重新执行一遍这些命令即可。事实上Redis也正是这么做的在开始加载之前暂时关闭appendonly然后Redis创建一个假的Redis客户端server.appendonly 0;fakeClient createFakeClient();startLoading(fp);然后读取appendonly.aof文件中的命令在假的Redis客户端上下文中执行同时服务器也不对该客户端做任何应答fakeClient-argc argc;fakeClient-argv argv;cmd-proc(fakeClient);/* The fake client should not have a reply */redisAssert(fakeClient-bufpos 0 listLength(fakeClient-reply) 0);如果加载过程中物理内存不够用并且Redis开启了VM则还需要处理swap操作最后加载完成后重新设置appendonly标志。2. 从dbfile中加载数据rdbLoad()函数如果Redis没有开启appendonly就需要从数据库文件中加载数据到内存基本步骤如下a. 处理SELECT命令即选择数据库b. 读取keyc. 读取valued. 检测key是否过期e. 添加新的对象到哈希表f. 设置过期时间(如果需要)g. 如果开启了VM处理swap操作网络监听在完成了初始化配置和数据加载后Redis启动监听。Redis的网络库没有使用libevent或者libev而是作者自己实现的一个非常轻量级的库(主要实现在ae.c文件中)这部分内容在后面分析Redis的网络库的时候单独写篇文章。通过本文介绍了Redis的启动加载过程希望对大家有所帮助。