对于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底层框架的理解(一)相关推荐
- Java面试之五大框架的理解
五大框架(springMVC,struts2,spring,mybatis,hibernate) 说说你对springMVC框架的理解? 简要口述(如果感觉说的少可以在完整答案里面挑几条说) Spri ...
- redis底层数据结构之跳跃表
redis底层数据结构之跳跃表 redis 的zset有序连表为啥选择用跳跃表? 我们要思考一问题,首先多问问自己为什么,才容易理解它,ps:这是个人观点.首先我们选择的数据结构和算法原因有以下几种: ...
- 02 Redis 底层数据结构
一.不同数据类型存储结构 Redis底层数据结构一共有 6 种,分别是简单动态字符串.双向链表.压缩列表.哈希表.跳表和整数数组.它们和数据类型的对应关系如下图所示: 1 数组与链表的区别 数组和链表 ...
- Redis底层数据结构详解(一)
Redis底层数据结构 一.简单动态字符串SDS 1. SDS 2. 为什么Redis没用C语言原生字符串? 2.1 C语言中的字符串 2.2 使用SDS的好处 二.链表linkedlist 三.压缩 ...
- redis底层数据结构(redis底层存储结构、源码分析)
文章目录 前言 一.redis为什么快? 二.redis的底层数据结构 2.1.redis的底层存储的扩容机制 2.1.1.扩容时间 2.1.2.扩容多大 2.1.3.扩容后的rehash 2.1.4 ...
- 【面试常问】谈谈你对集合框架的理解?
谈谈你对集合框架的理解? 在面试中被问到这个问题该咋么回答呢?这个问题是我认为最难回答的一个问题,原因就他问的范围太大了不知道该咋么回答:就我而言遇到这种问题首先给他说个总的,从最大的开始说起,在说一 ...
- BlockChain:Python一步一步实现(流程最清楚)区块链底层技术流程图(理解一目了然,值得收藏)
BlockChain:Python一步一步实现(流程最清楚)区块链底层技术流程图(理解一目了然,值得收藏) 导读 基于Python编程,实现一步一步实现(流程最清楚)区块链底层技术流程图,理解一目了然 ...
- 层和 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 ...
最新文章
- POJ - 3177 Redundant Paths 双联通补边
- python月薪是多少-2019年 Python就业市场行情好不好, 薪资多少?
- 2021-04-21--中标麒麟--yum源修改
- javascript之闭包深入理解(一)
- 循环所有数据库执行脚本
- echo 多行_Java中Scanner的用法:单行多行输入
- svn增量打包部署_超详细的jenkins持续集成工作原理、功能、部署方式等介绍
- ubuntu18安装微信
- ChemDraw 15支持哪些输入格式
- AC日记——由乃与大母神原型和偶像崇拜 洛谷 P3792
- 美国:DFA(Dimensional fund advisors LP)基金介绍
- 途游游戏 DevOps 实践|都说「单元测试」好,「AAAC四步法」少不了
- bt5 note [7] 无线破解
- 免费的可视化Web报表工具,JimuReport v1.5.0版本发布
- CTF简单的文件修复
- Linux发行版本及其区别
- Word2Vec解释
- 修改用户名和用户组名
- 【数据结构】排序算法
- NOIP学习之综合应用:177.八进制到十进制
热门文章
- SQL的各种连接(cross join、inner join、full join)的用法理解
- Ubuntu 11.10不得不知的快捷键
- android wifi工作流程
- Focus 焦点定位
- MINIST深度学习识别:python全连接神经网络和pytorch LeNet CNN网络训练实现及比较(三)...
- [leveldb] 3.put/delete操作
- 踩坑记(1)——使用slf4j+logback记录日志
- 个人学习进度条------第八周
- Strut学习-web.xml
- 引用dll动态库,动态库中弹出对话框输入,将输入参数,作为变量继续调用。...