近期学习了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. Java面试之五大框架的理解

    五大框架(springMVC,struts2,spring,mybatis,hibernate) 说说你对springMVC框架的理解? 简要口述(如果感觉说的少可以在完整答案里面挑几条说) Spri ...

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

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

  3. 02 Redis 底层数据结构

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

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

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

  5. redis底层数据结构(redis底层存储结构、源码分析)

    文章目录 前言 一.redis为什么快? 二.redis的底层数据结构 2.1.redis的底层存储的扩容机制 2.1.1.扩容时间 2.1.2.扩容多大 2.1.3.扩容后的rehash 2.1.4 ...

  6. 【面试常问】谈谈你对集合框架的理解?

    谈谈你对集合框架的理解? 在面试中被问到这个问题该咋么回答呢?这个问题是我认为最难回答的一个问题,原因就他问的范围太大了不知道该咋么回答:就我而言遇到这种问题首先给他说个总的,从最大的开始说起,在说一 ...

  7. BlockChain:Python一步一步实现(流程最清楚)区块链底层技术流程图(理解一目了然,值得收藏)

    BlockChain:Python一步一步实现(流程最清楚)区块链底层技术流程图(理解一目了然,值得收藏) 导读 基于Python编程,实现一步一步实现(流程最清楚)区块链底层技术流程图,理解一目了然 ...

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

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

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

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

最新文章

  1. POJ - 3177 Redundant Paths 双联通补边
  2. python月薪是多少-2019年 Python就业市场行情好不好, 薪资多少?
  3. 2021-04-21--中标麒麟--yum源修改
  4. javascript之闭包深入理解(一)
  5. 循环所有数据库执行脚本
  6. echo 多行_Java中Scanner的用法:单行多行输入
  7. svn增量打包部署_超详细的jenkins持续集成工作原理、功能、部署方式等介绍
  8. ubuntu18安装微信
  9. ChemDraw 15支持哪些输入格式
  10. AC日记——由乃与大母神原型和偶像崇拜 洛谷 P3792
  11. 美国:DFA(Dimensional fund advisors LP)基金介绍
  12. 途游游戏 DevOps 实践|都说「单元测试」好,「AAAC四步法」少不了
  13. bt5 note [7] 无线破解
  14. 免费的可视化Web报表工具,JimuReport v1.5.0版本发布
  15. CTF简单的文件修复
  16. Linux发行版本及其区别
  17. Word2Vec解释
  18. 修改用户名和用户组名
  19. 【数据结构】排序算法
  20. NOIP学习之综合应用:177.八进制到十进制

热门文章

  1. SQL的各种连接(cross join、inner join、full join)的用法理解
  2. Ubuntu 11.10不得不知的快捷键
  3. android wifi工作流程
  4. Focus 焦点定位
  5. MINIST深度学习识别:python全连接神经网络和pytorch LeNet CNN网络训练实现及比较(三)...
  6. [leveldb] 3.put/delete操作
  7. 踩坑记(1)——使用slf4j+logback记录日志
  8. 个人学习进度条------第八周
  9. Strut学习-web.xml
  10. 引用dll动态库,动态库中弹出对话框输入,将输入参数,作为变量继续调用。...