`
liuxinglanyue
  • 浏览: 562697 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

understanding redis internal - 主体结构与启动流程

阅读更多

一. redis的定义

 
   官方wiki对redis的定义是:a disk backed in-memory database
   从这个可以理解实际上使用redis的场景应该大部分情况下你的数据集应该是在内存中操作的,同时提供了落地的功能

二. redis 主体框架与启动流程

    redis主体上是一个单线程基于事件机制的一个模型,使用了一套事件处理框架 aeEvent,基本上这个东西和libevent做的是相同的工作,提供事件处理机制以及封装不同平台的IO事件模型   

    redis启动流程大体如下(有兴趣可以参照函数名翻阅源代码,暂时忽略vm选项处理细节):
   
    initServerConfig()    //初始化全局struct server数据结构,给每个成员赋予默认值        
    loadConfig()          //如果指定了配置文件,会读取redis.conf重新赋值给struct server实例
    initServer()          //初始化其它数据结构,创建db 对应dict数据结构等,bind,listen启动网络服务
           
    initServer函数里最重要的是下面2行代码
        aeCreateTimeEvent(server.el, 1, serverCron, NULL, NULL); //添加定时器事件
        aeCreateFileEvent(server.el, server.fd, AE_READABLE,acceptHandler, NULL);  //添加IO事件

        initServer函数在这里向aeEvent 添加了2个事件:
        1. 事件启动后的下一毫秒调用 serverCron 函数,
           实际这个serverCron在执行完后会被重新设置加入调度事件中,以后每隔100 毫秒执行一次

           (这里aeEvent框架使用的是链表来保存定时器事件的,也就是说查找超时事件是O(n)的复杂度,且              处理了一个超时事件后,需要重新定位到队头重新扫描一遍,对比libevent的minheap数据结构               O(1)复杂度应该差一些)

        2. 注册网络监听accept 客户端连接事件,客户端连接建立成功后,回调acceptHandler方法
           需要说明的是这里只是注册了这个事件并没有真正启动事件处理,对于epoll来说只是调用了                 epoll_ctl的add,需要等待调用epoll_wait后才开始调度io事件,所以前面虽然已经调用了socket            的bind,listen,实际上redis还没有准备好提供服务

           (这里的网络细节处理实际上是:服务器可以与客户端发来的syn进行tcp的3次握手,但是最后这个              已连接fd会被放入tcp的已完成队列中,等待accept操作来把这个fd取走)

    initServer()函数结束后,会根据配置来加载数据文件,如果是第一次启动当然没有这个了

    if (server.appendonly) {
        if (loadAppendOnlyFile(server.appendfilename) == REDIS_OK) ...            
    } else {
        if (rdbLoad(server.dbfilename) == REDIS_OK) ...           
    }
  
    根据配置是appendonly的aof文件还是快照保存的rdb文件来加载数据

    最后通过aeMain来启动事件处理框架,实际对应网络io api,也就是调用最终的epoll_wait或者select()函     数

    整个server启动完毕,可以看到启动后事件框架中主要处理2个事件:
    
    1. redis的网络io accept及读写事件
    2. 每隔100毫秒执行一次的定时器事件serverCron

    整个流程暂时忽略vm选项,那个处理的细节比较多暂时没梳理清楚,所以先忽略下
      
        
 三. serverCron定时器事件处理流程
     
     再来看下serverCron这个每100毫秒执行一次的函数都干了什么:

     1. 打印非空db的一些信息,log功能
     2. 如果当前没有后台运行dump数据保存到文件的进程,则可以根据内存使用情况重新调整hashTables大小
     3. 日志输出一些client的连接信息
     4. 检测idle的client 连接,关闭idle连接
     5. 判断是否有正在进行dump数据到文件的后台进程
          如果有判断是否已经结束,进行结束后的一些工作(这个跟replication有关,后续详细说明)
          没有则判断是否需要启动新的进程dump数据到文件
     6. 处理expired的key
     7. vmSwapOut功能,如果启动了vm选项,则判断是否超过vmMaxMemory,如果超过进行value的swap
     8. 判断如果server是slave,则连接master,发送sync命令,和master同步数据

分享到:
评论

相关推荐

    redis-5.0.5.tar.gz

    redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-...

    Redis-x64-5.0.14.msi和Redis-x64-5.0.14.zip

    2. **服务化**:为了使Redis在系统启动时自动运行,可以将`redis-server.exe`配置为Windows服务。这可以通过命令行工具`sc create`或使用`.msi`安装包实现。 3. **数据持久化**:Redis支持多种持久化方式,包括RDB...

    redis++使用说明,windows下编译redis-plus-plus

    通过这篇文章,我们可以了解Redis++的组件结构和编译过程,从而更好地掌握Redis++的使用方法。 Redis++是Redis的C++版本,它提供了Redis的所有功能,并且可以与Redis服务器集成。Redis++可以用于各种应用场景,包括...

    tomcat-redis-session-manager-master-2.0.0

    1.添加 redis session 集群依赖的jar包到 tomcat/lib 目录下 tomcat-redis-session-manager-2.0.0.jar jedis-2.5.2.jar ...3.启动 DOS 环境进入 redis 目录,启动 redis redis-server.exe redis.windows.conf

    redis64-2.6.12.1.rar 亲测好用

    2. **redis-server.exe**:这是Redis服务器的执行程序,用于启动和管理Redis服务。当您运行此程序并指定配置文件时,Redis服务器将开始监听网络连接并处理客户端请求。 3. **redis-cli.exe**:Redis命令行界面工具...

    Redis-x64-3.2.100.zip

    启动了redis,但是只要一关闭cmd窗口,redis就会消失。所以要把redis设置成windows下的服务。,这样就不用每次都去手动启动了,以后可以直接使用,脚本如下 redis-serviceinstall .cmd安装成服务脚本(redis设置成...

    Redis-x64-5.0.14.1

    在Windows上运行Redis可能与Linux环境有所不同,但仍然提供了相同的核心功能。 1. **Redis的特性**: - **内存存储**:Redis的所有数据都存储在内存中,以实现快速的数据读写。 - **持久化**:通过RDB(快照)和...

    Understanding-the-Top-5-Redis-Performance-Metrics

    - **定义**:`total_commands_processed`指标显示自Redis启动以来已处理的命令总数。 - **重要性**:这个指标可以帮助评估Redis的负载情况和工作强度。 - **监控建议**:监控该指标的增长速率,如果发现增长过快,...

    tomcat-redis-session-manager的jar包-包含Tomcat7和Tomcat8

    为了解决这些问题,开发者引入了Redis作为session存储的中间件,而Tomcat-Redis-Session-Manager就是这样一个将Tomcat与Redis结合的解决方案。 Tomcat-Redis-Session-Manager是一个开源项目,它允许Tomcat服务器将...

    关于 phpredis2.2.5-5.5 ts-vc11-x64 的分享版本

    Redis 支持多种数据结构,包括字符串、列表、集合、有序集合和哈希表。了解这些数据结构及其用法对于有效地设计和实现应用至关重要。例如,字符串常用于简单的键值对存储;列表可以用于消息队列;集合用于不重复...

    jizq-redis-mq

    jizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-redis-mqjizq-...

    redis-windows-7.0.10.zip

    用户需要通过`redis-server.exe`启动服务,并通过`redis-cli.exe`进行交互式操作。 Redis的数据结构丰富多样,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。这些数据...

    redis-windows-7.2.4.zip

    Redis以其高速度和丰富的数据结构而闻名,广泛应用于互联网服务,如计数、排行榜、会话存储等场景。 在Windows环境下安装Redis,首先你需要下载的压缩包是"redis-windows-7.2.4.zip",这是Redis的Windows版本。...

    redis+redis-desktop-manager-0.8.3.3850+笔记

    5. 启动Redis服务:`src/redis-server` 6. 配置:可以通过修改`redis.conf`来配置Redis服务,例如设置端口、数据持久化策略等。 **Redis.conf配置文件** `redis.conf`是Redis服务器的配置文件,其中包含了大量的...

    Redis稳定版 Redis-x64-5.0.14.1.zip

    - `redis-cli`: 官方提供的命令行客户端,用于与Redis服务器交互。 - `redis.conf`: 默认配置文件,用户可以根据需求进行修改。 - `redis-benchmark`: 性能测试工具,用于测量Redis的读写速度。 - `redis-check-aof`...

    redis-stack-server-6.2.6-v7.rhel7.x86-64.tar.gz

    它支持多种数据结构,如字符串、哈希、列表、集合、有序集合等,这些数据结构使得 Redis 在实时数据分析和处理中表现出色。Redis Stack 进一步扩展了 Redis 的功能,集成了诸如图形数据库、搜索、分析和其他高级服务...

    redis-mac-6.2.2

    Redis在IT行业中以其快速、灵活和丰富的数据结构而备受推崇。"redis-mac-6.2.2"是Redis的一个特定版本,专为MacOS操作系统设计,确保在苹果电脑上能够顺利运行。 Redis 6.2.2是Redis的一个稳定版本,它包含了多项...

    redis-windows-7.0.8.zip

    5. **数据结构与操作**:Redis支持多种数据结构,每种都有其特定的应用场景。例如: - **字符串**:最基础的数据类型,可以存储任何序列化后的数据。 - **哈希**:用于存储键值对的集合,适用于表示对象。 - **...

    redis-desktop-manager-0.9.0.616.exe、Redis-x64-3.0.504

    Redis是世界上最受欢迎的开源内存数据结构存储系统,它可以用作数据库、缓存和消息代理。在给定的压缩包文件中,我们有两个与Redis相关的组件:`redis-desktop-manager-0.9.0.616.exe` 和 `Redis-x64-3.0.504.zip`。...

Global site tag (gtag.js) - Google Analytics