对于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()函数

  1. int main(int argc, char **argv) {
  2. //设置时间,一般都是设置事件poll等待多长时间返回
  3. struct timeval tv;
  4. /* We need to initialize our libraries, and the server configuration. */
  5. #ifdef INIT_SETPROCTITLE_REPLACEMENT
  6. //进程重命名
  7. spt_init(argc, argv);
  8. #endif
  9. //好像是更改字符编码
  10. setlocale(LC_COLLATE,"");
  11. //设置多线程安全模式
  12. zmalloc_enable_thread_safeness();
  13. //注册内存使用过量报错的函数
  14. zmalloc_set_oom_handler(redisOutOfMemoryHandler);
  15. srand(time(NULL)^getpid());
  16. gettimeofday(&tv,NULL);
  17. //哈希种子
  18. dictSetHashFunctionSeed(tv.tv_sec^tv.tv_usec^getpid());
  19. //服务器的启动模式:单机模式、Cluster模式、sentinel模式
  20. server.sentinel_mode = checkForSentinelMode(argc,argv);
  21. initServerConfig();
  22. loadServerConfig(configfile,options);
  23. 。。。
  24. //创建守护进程
  25. if (server.daemonize) daemonize();
  26. //初始化服务器
  27. initServer();
  28. //设置服务器sleep之前的函数调用
  29. aeSetBeforeSleepProc(server.el,beforeSleep);
  30. //主函数事件驱动
  31. aeMain(server.el);
  32. //删除事件循环的结构,释放空间
  33. aeDeleteEventLoop(server.el);
  34. return 0;
  35. }

谢谢关注我的公众号:
https://cdn.llfc.club/gzh.jpg

热门评论

热门文章

  1. C++ 类的继承封装和多态

    喜欢(588) 浏览(2565)
  2. slice介绍和使用

    喜欢(521) 浏览(1715)
  3. Linux环境搭建和编码

    喜欢(594) 浏览(5491)
  4. windows环境搭建和vscode配置

    喜欢(587) 浏览(1710)
  5. 解密定时器的实现细节

    喜欢(566) 浏览(1841)

最新评论

  1. 利用内存模型优化无锁栈 卡西莫多的礼物:感谢博主指点,好人一生平安o(* ̄▽ ̄*)ブ
  2. 类和对象 陈宇航:支持!!!!
  3. 泛型算法的定制操作 secondtonone1:lambda和bind是C11新增的利器,善于利用这两个机制可以极大地提升编程安全性和效率。
  4. 基于锁实现线程安全队列和栈容器 secondtonone1:我是博主,你认真学习的样子的很可爱,哈哈,我画的是链表由空变成1个的情况。其余情况和你思考的类似,只不过我用了一个无效节点表示tail的指向,最初head和tail指向的都是这个节点。
  5. 解决博客回复区被脚本注入的问题 secondtonone1:走到现在我忽然明白一个道理,无论工作也好生活也罢,最重要的是开心,即使一份安稳的工作不能给我带来事业上的积累也要合理的舍弃,所以我还是想去做喜欢的方向。

个人公众号

个人微信