恋恋风辰 对于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 ...
- 专访 | 商汤HPC负责人刘文志(风辰):未来战略的两大方向及招人的4个标准
记者 | 鸽子 前不久,商汤刚刚完成了4.1亿美金的B轮融资,创下了人工智能领域最大融资金额的记录. 据业界人士透露,之所以能完成这次巨大数额融资,一方面是因为商汤的算法在整个行业处于绝对领先的地位, ...
- 专访 | 商汤HPC负责人刘文志(风辰):未来战略的两大方向及招人的四个标准...
记者 | 鸽子 前不久,商汤刚刚完成了4.1亿美金的B轮融资,创下了人工智能领域最大融资金额的记录. 据业界人士透露,之所以能完成这次巨大数额融资,一方面是因为商汤的算法在整个行业处于绝对领先的地位, ...
- 层和 native_React-Native与小程序的底层框架比较
react RN框架 框架 js层 该层提供了各种供开发者使用的组件以及一些工具库(事件分发等). C++层 主要处理java/OC与js的通信(JSBridge)以及执行JavaScript(JS脚 ...
- 保存到redis的字符串类型出现斜杆_深入浅出Redis:这次从Redis底层数据结构开始...
1.概述 相信使用过Redis 的各位同学都很清楚,Redis 是一个基于键值对(key-value)的分布式存储系统,与Memcached类似,却优于Memcached的一个高性能的key-valu ...
- redis底层数据结构之跳跃表
redis底层数据结构之跳跃表 redis 的zset有序连表为啥选择用跳跃表? 我们要思考一问题,首先多问问自己为什么,才容易理解它,ps:这是个人观点.首先我们选择的数据结构和算法原因有以下几种: ...
- 接私活/毕业设计必备,基于SpringBoot+Activiti的Java底层框架的实现
啦啦啦啦啦,富贵同学又开始开坑了,出了个免费的专栏,主要给大家从0基础开始用springBoot集成第三方的插件或者功能,如果这篇专栏能帮到你,一定不要忘了点一个赞哦!!欢迎大家收藏分享 第一步,导入 ...
- Redis底层原理和数据结构-总结篇
本文数据结构部分内容转自:SmartKeyerror 先了解数据结构,后看具体应用部分,本文着重应用部分的优缺点进行总结!数据结构部分仅仅做初步了解介绍,源码实现具体请参考如下目录自行学习,本文以6. ...
- 02 Redis 底层数据结构
一.不同数据类型存储结构 Redis底层数据结构一共有 6 种,分别是简单动态字符串.双向链表.压缩列表.哈希表.跳表和整数数组.它们和数据类型的对应关系如下图所示: 1 数组与链表的区别 数组和链表 ...
- Redis底层数据结构详解(一)
Redis底层数据结构 一.简单动态字符串SDS 1. SDS 2. 为什么Redis没用C语言原生字符串? 2.1 C语言中的字符串 2.2 使用SDS的好处 二.链表linkedlist 三.压缩 ...
最新文章
- 深度学习时代,调包侠没有未来,但是这个“包”有
- 上线随想之2011-03-25
- hibernate映射一对多双向关联关系实例
- C# 利用Newtonsoft.Json将DataTable进行JSON序列化
- 抓包工具- fiddler的安装
- 天池 在线编程 所有子数组之和(排列组合)
- Java-三元运算符
- IAR 窗口重置默认配置
- 生活在信息世界,人人都该懂得大数据概念
- 代码重构之道,重构即重生,让你的代码起死回生
- 使用Android Studio 进行NDK开发和调试
- 生成.o linux,JaxoDraw下载 费曼图生成工具JaxoDraw for linux v2.1.0 官方安装版 下载-脚本之家...
- [Python] 字典 update()函数:在字典中更新 (或加入) 键值对
- delphi ehlib 添加选择框_教你用CASS10.1,在宗地图中添加“亩”注记
- 小米手机解锁,root
- 牛顿插值法 matlab程序计算方法,(最新整理)牛顿插值法matlab程序
- 【路在前端】我的前端工作流程梳理
- 使用小爱同学来控制电脑关机
- 计算机网络篇- 网络层
- Burpsuite 上
热门文章
- 面试官: MySQL 数据库的优化,你知道有哪些?
- 区块链入门教程,这一篇就足够了
- 一年Android工作经验,一举拿下百度、网易、美团、小米、快手等Offer面经
- 新型超级生物计算机简介,自然形成的超级生物计算机
- java单线程任务调度_一文详解Spring任务执行和调度(小结)
- LeetCode每周刷题(2019.7.8-2019.7.14)
- HDU-1159-Common Subsequence
- openfire:openfire单独编译指定插件的方法
- 微信小程序 3 ~ 微信小程序开源项目合集
- spring的定时调度