对于redis底层框架的理解(一)
近期学习了redis底层框架,好多东西之前都没听说过,算是大开眼界了。
先梳理下redis正常的通讯流程吧
首先服务器启动都有主函数main,这个main函数就在redis.c里
首先是initserverconfig(),在这里初始化了redisserver基本的配置信息,
接着调用loadServerConfig(char *filename) 对 server 全局变量重新初始化。
然后是调用daemonize(),实现守护进程,脱离了控制台,是这个进程
成为独立的首领进程
接下来是initServer(),这个过程很重要,完成了事件驱动的注册和一些
回调函数的绑定,回头仔细说这个函数里面的功能
初始化服务器过后aeSetBeforeSleepProc(),设置了服务器休眠之前会
调用beforeSleep函数
然后进入主要的事件轮询函数 aeMain(server.el),在这里完成事件的派发
最后事件轮询过后我们调用aeDeleteEventLoop,释放之前开辟的内存,
结束进程。
中间略去一些琐碎的过程,我们总结一下
initserverconfig() ----> loadServerConfig------> daemonize()
initServer()-----> aeSetBeforeSleepProc()------>aeMain()----->
aeDeleteEventLoop
接下来详细说一下每一个步骤都做了什么。
看一下main()函数
int main(int argc, char **argv) {
//设置时间,一般都是设置事件poll等待多长时间返回
struct timeval tv;
/* We need to initialize our libraries, and the server configuration. */
#ifdef INIT_SETPROCTITLE_REPLACEMENT
//进程重命名
spt_init(argc, argv);
#endif
//好像是更改字符编码
setlocale(LC_COLLATE,"");
//设置多线程安全模式
zmalloc_enable_thread_safeness();
//注册内存使用过量报错的函数
zmalloc_set_oom_handler(redisOutOfMemoryHandler);
srand(time(NULL)^getpid());
gettimeofday(&tv,NULL);
//哈希种子
dictSetHashFunctionSeed(tv.tv_sec^tv.tv_usec^getpid());
//服务器的启动模式:单机模式、Cluster模式、sentinel模式
server.sentinel_mode = checkForSentinelMode(argc,argv);
initServerConfig();
loadServerConfig(configfile,options);
。。。
//创建守护进程
if (server.daemonize) daemonize();
//初始化服务器
initServer();
//设置服务器sleep之前的函数调用
aeSetBeforeSleepProc(server.el,beforeSleep);
//主函数事件驱动
aeMain(server.el);
//删除事件循环的结构,释放空间
aeDeleteEventLoop(server.el);
return 0;
}
微信订阅号

对于redis底层框架的理解(一)的更多相关文章
- 恋恋风辰 对于redis底层框架的理解(一)
近期学习了redis底层框架,好多东西之前都没听说过,算是大开眼界了. 先梳理下redis正常的通讯流程吧 首先服务器启动都有主函数main,这个main函数就在redis.c里 首先是initser ...
- 对于redis底层框架的理解(五)
之前总结了redis的通讯流程,基本框架,epoll的封装等等,这次介绍下 redis对于select模型的封装 //select 模型 typedef struct aeApiState { //读 ...
- Nginx Http框架的理解
Nginx Http框架的理解 HTTP框架是Nginx基础框架的一部分,Nginx的其它底层框架如master-worker进程模型.event模块.mail 模块等. HTTP框架代码主要有2个模 ...
- Java面试之五大框架的理解
五大框架(springMVC,struts2,spring,mybatis,hibernate) 说说你对springMVC框架的理解? 简要口述(如果感觉说的少可以在完整答案里面挑几条说) Spri ...
- Redis底层结构全了解
第一篇文章,思来想去,写一写Redis吧,最近在深入研究它. 一丶Redis底层结构 1. redis 存储结构 redis的存储结构从外层往内层依次是redisDb.dict.dictht.dict ...
- Redis底层数据结构详解
上一篇说了Redis有五种数据类型,今天就来聊一下Redis底层的数据结构是什么样的.是这一周看了<redis设计与实现>一书,现来总结一下.(看书总是非常烦躁的!) Redis是由C语言 ...
- iOS10通知框架UserNotification理解与应用
iOS10通知框架UserNotification理解与应用 一.引言 关于通知,无论与远程Push还是本地通知,以往的iOS系统暴漏给开发者的接口都是十分有限的,开发者只能对标题和内容进行简单的定义 ...
- redis底层设计(一)——内部数据结构
redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...
- 王晶:华为云OCR文字识别服务技术实践、底层框架及应用场景 | AI ProCon 2019
演讲嘉宾 | 王晶(华为云人工智能高级算法工程师王晶) 出品 | AI科技大本营(ID:rgznai100) 近期,由 CSDN 主办的 2019 中国AI 开发者大会(AI ProCon 2019) ...
随机推荐
- Kickstart 安装centos7
以前是怎么安装系统的 光盘(ISO文件,光盘的镜像文件)===>每一台物理机都得给一个光驱,如果用外置光驱的话,是不是每台机器都需要插一下 U盘:ISO镜像刻录到U盘==>需要每台机器都需 ...
- Beta阶段第2周/共2周 Scrum立会报告+燃尽图 04
此作业要求参见https://edu.cnblogs.com/campus/nenu/2018fall/homework/2412 版本控制地址 [https://git.coding.net/ ...
- 王者荣耀交流协会-小组互评Alpha版本
小组分工如下: 1.探路者---贪吃蛇(测评人:王玉玲) 链接:http://www.cnblogs.com/WYLFZ/p/7805520.html http://www.cnblogs.co ...
- HDU 5642 King's Order dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5642 King's Order Accepts: 381 Submissions: 1361 ...
- ubuntu关闭系统自动检测错误
sudo gedit /etc/default/apport 将enabled=1 改成 enabled=0
- oracle & 的用法!
/*select * from emp_bak where deptno = &"Department number" order by ename; select * f ...
- libcurl底层调用逻辑
libcurl就不多介绍了,一个支持HTTP,FTP,SMTP等协议的网络库 只涉及multi部分,easy部分就不提了. 两个线程,一个负责添加HTTP请求,另一个轮询,负责处理每一个请求 Thre ...
- 规则引擎之easyRules
规则引擎听起来是蛮高深的一个词语,但透过现象看本质,Martin Fowler 有如下言: You can build a simple rules engine yourself. All you ...
- JDK1.8 之Lambda
Lambda 理解的了很久才有一点小感觉. 语法 lambda表达式的特点,它的语法如下面. parameter -> expression body 下面是一个lambda表达式的重要特征. ...
- collection 多态 会自动转型为子类 继承多态需要显示转型