首页 > 数据库 >Redis源码分析之启动流程

Redis源码分析之启动流程

时间:2023-09-24 17:55:28浏览次数:81  
标签:初始化 ae 流程 end Redis server 源码 anet group

  • 源码版本:5.0

@startuml
group main
  server.c -> setproctitle.c : spt_init():为函数setproctitle调用做初始化工作
  server.c -> server.c : setlocale(LC_COLLATE,"");
  server.c -> server.c : tzset();
  server.c -> server.c : zmalloc_set_oom_handler(redisOutOfMemoryHandler);
  server.c -> server.c : srand(time(NULL)^getpid());
  server.c -> server.c : gettimeofday(&tv,NULL);
  server.c -> server.c : dictSetHashFunctionSeed((uint8_t*)hashseed);
  server.c -> server.c : initServerConfig() 初始化server对象
  server.c -> config.c : loadServerConfig() 根据配置文件和命令行参数设置server
  server.c -> server.c : 打印启动信息
  server.c -> server.c : 根据配置决定是否后台进程启动
  server.c -> server.c : initServer() 初始化服务器
  group initServer
    server.c -> server.c : setupSignalHandlers() 设置信号处理函数
    server.c -> server.c : 根据配置决定是否开启系统日志
    server.c -> server.c : 初始化server对象用到的的结构体:list、rax等
    server.c -> server.c : createSharedObjects() 创建共享对象
    server.c -> server.c : adjustOpenFilesLimit() 适配打开文件数限制
    server.c -> ae.c : aeCreateEventLoop() 创建事件循环对象el
    server.c -> server.c : listenToPort() 开启本地端口监听
    group listenToPort
      server.c -> anet.c : anetTcpServer() 
        group anetTcpServer
          anet.c -> system : socket() 创建服务端socket
          anet.c -> anet.c : anetSetReuseAddr() 设置地址重用
          anet.c -> system : bind() 绑定本地地址
          anet.c -> system : listen() 开始监听端口
        end
      server.c -> anet.c : anetNonBlock() 设置非阻塞监听
    end
    server.c -> server.c : 初始化默认的16个数据库对象
    server.c -> evict.c : evictionPoolAlloc() 初始化内存淘汰池
    server.c -> server.c : 初始化server的其他字段
    server.c -> ae.c : aeCreateTimeEvent() 创建时间处理事件,处理函数为serverCron
    server.c -> ae.c : aeCreateFileEvent() 绑定socket到el,监听读事件,处理函数为acceptTcpHandler
    server.c -> server.c : 如果开启了AOF,则打开AOF文件
    server.c -> cluster.c : clusterInit() 开启了集群能力,则进行集群初始化工作
    server.c -> replication.c : replicationScriptCacheInit() 本分脚本缓存初始化
    server.c -> script.c : scriptingInit() 脚本初始化
    server.c -> slowlog.c : slowlogInit() 慢日志初始化
    server.c -> latency.c : latencyMonitorInit() 延迟监控初始化
  end
  server.c -> server.c : 有必要则创建pid文件
  server.c -> setproctitle.c : redisSetProcTitle() 设置进程名称
  server.c -> server.c : redisAsciiArt() 打印logo
  server.c -> server.c : 进行相关系统检查
  server.c -> server.c : InitServerLast
  group InitServerLast
    server.c -> bio.c : 初始化后台线程
  end
  server.c -> server.c : loadDataFromDisk() 从磁盘加载数据
  group loadDataFromDisk 优先加载aof,没有则加载rdb
    server.c -> aof.c : loadAppendOnlyFile() 加载aof文件
    server.c -> rdb.c : rdbLoad() 加载rdb文件
  end
  server.c -> cluster.c : verifyClusterConfigWithData() 如果是集群,进行集群配置验证 
  server.c -> ae.c : aeSetBeforeSleepProc() 设置休眠前处理函数beforeSleep
  server.c -> ae.c : aeSetAfterSleepProc() 设置休眠后处理函数afterSleep
  server.c -> ae.c : aeMain() 开始事件循环,正常启动后会一直循环
  server.c -> ae.c : aeDeleteEventLoop() 删除事件循环,释放事件循环资源
end

@enduml

标签:初始化,ae,流程,end,Redis,server,源码,anet,group
From: https://www.cnblogs.com/zby9527/p/17726315.html

相关文章

  • golang 使用redis设置分布式锁 demo
    内容来自对chatgpt的咨询分布式锁是在多个节点上运行的应用程序中协调工作的一种常用方法,而Redis是实现分布式锁的流行选择。以下是使用Go语言和github.com/go-redis/redis库来设置Redis分布式锁的一个简单示例:首先,确保你已经安装了该库:goget-ugithub.com/go-redis/redi......
  • BRICS区块链比赛流程
    BRICS比赛流程梳理如下,从上到下的顺序为比赛流程的顺序。总共3个部分,从环境搭建到常见问题踩坑。提供了参考。整合了许多文档于一体的一部参考文档。对于未完成的部分,未来会完成补坑。区块链平台运维基于提供的开发环境,使用离线安装包搭建区块链网络平台,含FISCOBCOS区块链......
  • Redis搭建集群架构
    使用docker搭建6.x版本以后的镜像docker支持部署集群模式,由于Redis要求集群至少要有三个主节点,因此本次测试搭建了三主三从的Redis集群。不基于Host网络模式配置docker-compose.yml文件version:"3"networks:redis-cluster:driver:bridgeipam:......
  • Qemu源码分析(7)--Apple的学习笔记
    一,前言今天继续分析主要的api,包括了printlog和属性add及set,因为对于不同对象的操作,主要就是靠属性值设置及判断使用。二,源码分析A,关于qemu中自带的-d的log需要传入的参数主要通过-d然后传入的参数如下第2个成员,比如out_asmconstQEMULogItemqemu_log_items[]={{CPU_LOG_TB......
  • Redis 命令工具
    ---Redis命令工具---redis-serverRedis服务器启动命令redis-clishutdown停止服务redis-benchmark:性能测试工具,用于检测Redis在本机的运行效率redis-check-aof:修复有问题的AOF持久化文件redis-check-rdb:修复有问题的RDB持久化文件redis-cli:Redis客户端命令行......
  • 深入探讨Spring Boot中的Redis缓存
    介绍Redis是一种高性能的内存数据库,常用于缓存和消息队列等场景。在SpringBoot中,我们可以通过集成Redis来实现缓存功能。本文将深入探讨SpringBoot中的Redis缓存。集成Redis在SpringBoot中,我们可以通过添加以下依赖来集成Redis:<dependency><groupId>org.springframewor......
  • 基于SpringBoot的书籍阅读管理系统设计与实现-计算机毕业设计源码+LW文档
    摘要:书籍阅读管理系统是针对目前书籍阅读管理的实际需求,从实际工作出发,对过去的书籍阅读管理系统存在的问题进行分析,完善客户的使用体会。采用计算机系统来管理信息,取代人工管理模式,查询便利,信息准确率高,节省了开支,提高了工作的效率。本系统结合计算机系统的结构、概念、模型、原......
  • 基于SpringBoot的校园疫情防控系统-计算机毕业设计源码+LW文档
    一、选题的背景与意义开发背景21世纪,我国早在上世纪就已普及互联网信息,互联网对人们生活中带来了无限的便利。像大部分的企事业单位等机构都有自己的管理系统,由传统的管理模式向互联网发展,如今开发自己的系统是时代发展的必然产物。那么开发校园疫情防控系统意义和用处有哪些呢?......
  • 基于SpringBoot的幼儿园管理系统-计算机毕业设计源码+LW文档
    摘 要幼儿园管理系统是一种以信息技术为基础,为幼儿园提供全面管理和服务的软件系统。本文旨在设计并实现一种针对幼儿园管理的信息化系统,以提高幼儿园的管理效率、服务质量和家长满意度。本文首先介绍了幼儿园管理系统的背景和意义,以及相关的技术和理论基础。随后,对幼儿园管理......
  • 基于Springboot的准妈妈孕期交流平台的设计与实现-计算机毕业设计源码+LW文档
    系统的背景及意义 智能化的高校排课系统是基于WEB的校园教务信息综合管理系统的一项重要功能,能很好的解决上述问题。为响应我国的教育改革和素质教育的号召,学生自主选课及校园内日常标准化选课的信息量日夜增长,合理安排课程的工作量与复杂程度也随之增大,手工管理的传统模式已经......