近期学习了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底层框架的理解(一)相关推荐

  1. 对于redis底层框架的理解(一)

    近期学习了redis底层框架,好多东西之前都没听说过,算是大开眼界了. 先梳理下redis正常的通讯流程吧 首先服务器启动都有主函数main,这个main函数就在redis.c里 首先是initser ...

  2. 专访 | 商汤HPC负责人刘文志(风辰):未来战略的两大方向及招人的4个标准

    记者 | 鸽子 前不久,商汤刚刚完成了4.1亿美金的B轮融资,创下了人工智能领域最大融资金额的记录. 据业界人士透露,之所以能完成这次巨大数额融资,一方面是因为商汤的算法在整个行业处于绝对领先的地位, ...

  3. 专访 | 商汤HPC负责人刘文志(风辰):未来战略的两大方向及招人的四个标准...

    记者 | 鸽子 前不久,商汤刚刚完成了4.1亿美金的B轮融资,创下了人工智能领域最大融资金额的记录. 据业界人士透露,之所以能完成这次巨大数额融资,一方面是因为商汤的算法在整个行业处于绝对领先的地位, ...

  4. 层和 native_React-Native与小程序的底层框架比较

    react RN框架 框架 js层 该层提供了各种供开发者使用的组件以及一些工具库(事件分发等). C++层 主要处理java/OC与js的通信(JSBridge)以及执行JavaScript(JS脚 ...

  5. 保存到redis的字符串类型出现斜杆_深入浅出Redis:这次从Redis底层数据结构开始...

    1.概述 相信使用过Redis 的各位同学都很清楚,Redis 是一个基于键值对(key-value)的分布式存储系统,与Memcached类似,却优于Memcached的一个高性能的key-valu ...

  6. redis底层数据结构之跳跃表

    redis底层数据结构之跳跃表 redis 的zset有序连表为啥选择用跳跃表? 我们要思考一问题,首先多问问自己为什么,才容易理解它,ps:这是个人观点.首先我们选择的数据结构和算法原因有以下几种: ...

  7. 接私活/毕业设计必备,基于SpringBoot+Activiti的Java底层框架的实现

    啦啦啦啦啦,富贵同学又开始开坑了,出了个免费的专栏,主要给大家从0基础开始用springBoot集成第三方的插件或者功能,如果这篇专栏能帮到你,一定不要忘了点一个赞哦!!欢迎大家收藏分享 第一步,导入 ...

  8. Redis底层原理和数据结构-总结篇

    本文数据结构部分内容转自:SmartKeyerror 先了解数据结构,后看具体应用部分,本文着重应用部分的优缺点进行总结!数据结构部分仅仅做初步了解介绍,源码实现具体请参考如下目录自行学习,本文以6. ...

  9. 02 Redis 底层数据结构

    一.不同数据类型存储结构 Redis底层数据结构一共有 6 种,分别是简单动态字符串.双向链表.压缩列表.哈希表.跳表和整数数组.它们和数据类型的对应关系如下图所示: 1 数组与链表的区别 数组和链表 ...

  10. Redis底层数据结构详解(一)

    Redis底层数据结构 一.简单动态字符串SDS 1. SDS 2. 为什么Redis没用C语言原生字符串? 2.1 C语言中的字符串 2.2 使用SDS的好处 二.链表linkedlist 三.压缩 ...

最新文章

  1. 深度学习时代,调包侠没有未来,但是这个“包”有
  2. 上线随想之2011-03-25
  3. hibernate映射一对多双向关联关系实例
  4. C# 利用Newtonsoft.Json将DataTable进行JSON序列化
  5. 抓包工具- fiddler的安装
  6. 天池 在线编程 所有子数组之和(排列组合)
  7. Java-三元运算符
  8. IAR 窗口重置默认配置
  9. 生活在信息世界,人人都该懂得大数据概念
  10. 代码重构之道,重构即重生,让你的代码起死回生
  11. 使用Android Studio 进行NDK开发和调试
  12. 生成.o linux,JaxoDraw下载 费曼图生成工具JaxoDraw for linux v2.1.0 官方安装版 下载-脚本之家...
  13. [Python] 字典 update()函数:在字典中更新 (或加入) 键值对
  14. delphi ehlib 添加选择框_教你用CASS10.1,在宗地图中添加“亩”注记
  15. 小米手机解锁,root
  16. 牛顿插值法 matlab程序计算方法,(最新整理)牛顿插值法matlab程序
  17. 【路在前端】我的前端工作流程梳理
  18. 使用小爱同学来控制电脑关机
  19. 计算机网络篇- 网络层
  20. Burpsuite 上

热门文章

  1. 面试官: MySQL 数据库的优化,你知道有哪些?
  2. 区块链入门教程,这一篇就足够了
  3. 一年Android工作经验,一举拿下百度、网易、美团、小米、快手等Offer面经
  4. 新型超级生物计算机简介,自然形成的超级生物计算机
  5. java单线程任务调度_一文详解Spring任务执行和调度(小结)
  6. LeetCode每周刷题(2019.7.8-2019.7.14)
  7. HDU-1159-Common Subsequence
  8. openfire:openfire单独编译指定插件的方法
  9. 微信小程序 3 ~ 微信小程序开源项目合集
  10. spring的定时调度