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

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介:

近期学习了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版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
3月前
|
NoSQL Java Redis
springboot搭建后台框架 (二)整合Redis
springboot搭建后台框架 (二)整合Redis
41 0
|
10月前
|
存储 SQL NoSQL
京东T9纯手打688页神笔记,SSM框架整合Redis搭建高效互联网应用
Spring框架是Java应用最广的框架。它的成功来源于理念,而不是技术本身,它的理念包括loC (Inversion of Control,控制反转)和AOP (Aspect Oriented Programming,面向切面编程)。
|
11月前
|
缓存 NoSQL Redis
Redis中的事件驱动框架(二)
Redis中的事件驱动框架
67 0
|
11月前
|
NoSQL Linux Redis
Redis中的事件驱动框架(一)
Redis中的事件驱动框架
232 0
|
11月前
|
NoSQL 网络协议 Go
用go写一个简单的Redis客户端框架
用go写一个简单的Redis客户端框架
103 0
|
缓存 NoSQL API
分布式服务器框架之Servers.Common中使用CSRedis测试操作Redis中的string、hash_table、list、set、zset
在Servers.Common类库总创建了一个TestRedis.cs文件,我是在Servers.GameServer中去初始化的。主要是测试了Redis中常用的数据类型和常用的API,有一些不常用的可能没有写。需要详细了解API的话可以安装上CSRedis之后F12追进去查看,上面有详细的API说明。
分布式服务器框架之Servers.Common中使用CSRedis测试操作Redis中的string、hash_table、list、set、zset
|
NoSQL Redis CDN
分布式服务器框架之搭建C#+MongoDB+Redis初步
WebAccount站点主要干的事儿是下发 服务器状态信息,这个服务器会和WorldServer建立连接,等所有的GameServer初始化完成之后会同步给WorldServer,WorldServer同步给账号服务器站点,然后账号站点等待玩家请求。
|
NoSQL 算法 中间件
分布式服务器框架之搭建C#+MongoDB+Redis初步
Common类库主要做的是一些大家都需要用到的通用的事情,为了避免重复,所以就提取出来了一个Dll。Common库主要是实现了表格数据的加载模块、在CsRedisClient、MongoClient中间件的基础上进行二次封装。实现了数据库连接、Redis连接、以及数据库和Redis的增删改查断开操作。
|
存储 缓存 NoSQL
redis灵魂拷问:聊一聊redis底层数据结构
redis灵魂拷问:聊一聊redis底层数据结构
138 0
redis灵魂拷问:聊一聊redis底层数据结构
还在用 RedisTemplate?试试 Redis 官方 ORM 框架吧,用起来够优雅
之前在SpringBoot项目中,我一直使用RedisTemplate来操作Redis中的数据,这也是Spring官方支持的方式。对比Spring Data对MongoDB和ES的支持,这种使用Template的方式确实不够优雅!最近发现Redis官方新推出了Redis的专属ORM框架RedisOM,用起来够优雅,推荐给大家! RedisOM简介 RedisOM是Redis官方推出的ORM框架,是对Spring Data Redis的扩展。由于Redis目前已经支持原生JSON对象的存储,之前使用RedisTemplate直接用字符串来存储JOSN对象的方式明显不够优雅。通过RedisOM我