`

Redis代码阅读1--Redis启动原理

 
阅读更多

   前面写了一篇文章简单介绍Redis的list结构。再写完之后,我觉得有必要熟悉Redis的启动过程和如何读取Redis的命令,因此本文将通过分析代码来介绍Redis的启动过程,通过查看Redis 的启动脚本,得知Redis的启动时从Redis.c的main方法开始的。Redis启动可以分为以下几个步骤:

  1. 初始化Redis服务器全局配置
  2. 重置服务器Save参数(具体下文详解)和加载配置文件
  3. 初始化服务器
  4. 加载数据库
  5. 开始网络监听

   一,初始化Redis服务器全局配置。这一步骤主要是主要是根据Redis.h中设置的Static值来初始化Redis服务器配置,这里设置是Redis服务器的默认配置。如:

  • TCP Port,Redis Client的缺省Timeout;
  • Redis缺省的数据库数目;
  • Redis Append 持久化方式的参数设置;
  • Redis的所支持的各种数据结构的缺省值的设置;
  • Redis内存Swap相关设置;
  • Redis Master & Slave相关的配置;
  • Redis Command Table初始化。

  二,加载配置文件:

      这一步是通过读取的配置文件来对Redis服务器进行设置,将会覆盖上一步的某些缺省设置。打开下载下来的Redis源代码,我们可以看到其根目录下有一个默认的配置文件redis.conf。需要注意的是,如果在启动Redis的时候没有指定配置文件,则Redis服务器在启动的时候是不会加载这个默认的配置文件进行配置的。而且这个默认的配置文件和第一步中得全局默认缺省配置不尽相同,比如针对Redis的Append模式的数据保存策略的配置,redis.conf里面的设置是:

save 900 1 -------15分钟内一次更新
save 300 10 ------5分钟内10次更新
save 60 10000 ---1分钟内10000次更新。

而上一步里面的默认缺省配置确实:

save 60*60 1 -------一个小时内1次更新
save 300 100 ------5分钟内100次更新
save 60 10000 ---1分钟内10000次更新。

    因此我们在启动Redis的时候如果默认配置不能满足要求,则需要指明配置文件进行配置。

 

   三,初始化服务器:

   初始化服务器是在initServer()方法中完成的,次方法利用上两步设置的参数进一步初始化服务器:

  • 创建用来维护clients和slaves的list
  • 创建共享对象。redisObject这个struct里有个变量叫做refcount,这个变量就是用来实现共享的。Redis的对象目前Redis只支持共享StringObject。Redis的共享对象有两大类比:第一类:Redis server的各种操作需要经常用到的各类对象,如:Redis Command的分隔符 "\r\n",用于Redis command的reply的"+OK\r\n"或者"-ERR\r\n"等对象,因为在Redis的各种操作这类对象要被频繁使用,所以就在启动Redis的时候创建好,然后共用这些对象,减少时间成本和空间成本;第二,类的共享对象就是对应于数字的StringObject,如:Set "olylakers1" 1234; Set "olylakes2" 1234;在Redis内部,"olylakers1"和"olylakers2"这两个key都指向由数字1234转化的StringObject。这样在海量数据和特定存储内容下,可以节省大量的内存空间。可用通过REDIS_SHARED_INTEGERS这个参数来指定Redis启动的时候创建多少个第二类共享对象,默认的参数是10000,即创建的StrongObject个取值范围是0-9999之间。
  • 创建Pub/Sub通道
  • 初始化网络监听EventLoop的相关内容,如eventLoop,timeEvent,fileEvent等
  • 如果开启了VM,则初始化虚拟内存相关的IO/Thread

  四,加载数据:

   根据配置的不同,Redis加载数据的源也不一样,如果在配置文件里设置了appendonly  yes(默认是no),那么就从appendfile加载数据,反之则从RedisDb加载数据

  •   从appendfile加载数据:我们先来看一下appendfile的内容是什么。下面的一条记录摘取自appendfile:SET $9 olylakers $3 oly。很显,appendfile保存的就是redis server接收到的各种命令,那么从appendfile加载数据就是redis server从appenfile里面读取这些命令的记录,然后重新把这些命令执行一遍即可。需要注意的是,如果开启了VM,那么在从appendfile加载数据的时候可能要涉及swap操作。
  • 从redisdb加载数据:如果没有开启appendonly,那么则需要从db file加载数据到内存,其过程是:
    1. 通过处理select命令,选择DB
    2. 然后从db file读取key和value
    3. 检查key是否过期,如果过期则跳过这个key,如果不过期,则把数据Add到对应的db的dict中
    4. 如果开启了VM,则从db file中load数据,也可能涉及到swap操作

  五,开始网络监听:

         Redis的网络监听没有采用libevent等,而是自己实现了一套简单的机遇event驱动的API,具体见ae.c。因为这一部分内容比较多,因此后面会单独写篇文章来描述其过程。

 

   以上五个部分就是Redis启动的全部过程,

 

 

1
0
分享到:
评论

相关推荐

    redis-session-manager-redis-session-manager-2.0.2.tar.gz

    1. **源代码**:Java、Python或其他语言实现的Redis Session Manager的源代码,供开发者阅读和修改。 2. **文档**:包括用户手册、API参考、配置指南等,帮助开发者了解如何安装和使用该工具。 3. **示例**:可能...

    Redis-Windows-32bit-master

    1. **编译与安装**:由于Redis默认不提供Windows预编译版本,用户通常需要下载源代码并使用Visual Studio或其他C编译工具进行编译。"Redis-Windows-32bit-master"意味着这个版本已经适配了32位Windows系统,编译时...

    redis-session-manager-redis-session-manager-2.0.7.tar.gz

    **Redis Session Manager的工作原理:** 1. **会话创建**:当用户首次访问Web应用时,服务器会在Redis中创建一个新的Session,并将Session ID返回给客户端(通常通过Cookie)。 2. **会话存储**:服务器将用户的会话...

    Redission分布式锁-本地单机Redis实战-springboot-redis-lock.zip

    本项目中的“springboot-redis-lock-master”可能包含了这些结构,以及启动类、配置文件、业务代码等。 7. **实战步骤**: - 配置Redis连接:在application.properties或application.yml中设置Redis的连接信息。 ...

    【Redis开发】资源Redis-v6.0.20.zip

    通过阅读源码,开发者可以深入理解Redis的工作原理,而编译安装教程可以帮助你在本地搭建Redis服务器。为了部署和运行Redis,你需要熟悉基本的命令行操作,如`redis-server`启动服务,`redis-cli`进行交互式操作,...

    Redis-win-3.2.100

    Redis-win-3.2.100 是一个针对Windows平台的Redis版本,它包含了源代码和安装包,方便用户在Windows环境下快速搭建和使用Redis...结合源代码,开发者还可以深入了解其工作原理,进一步定制和优化Redis以满足特定需求。

    redis-3.0-vs2017.zip

    1. `src`目录:包含Redis服务器的源代码文件,如`redis-server.exe`用于启动Redis服务,以及`redis-cli.exe`作为命令行客户端工具,用于与Redis服务器进行交互。 2. `deps`目录:可能包含了Redis依赖的第三方库,...

    redis-3.2.9.tar.gz+redis-3.2.1.gem.rar

    解压这个文件后,你可以得到Redis的源代码,包括所有必要的头文件、C语言实现以及配置脚本等。以下是一些关于安装和配置Redis 3.2.9的知识点: 1. **安装步骤**: - 解压:`tar -zxvf redis-3.2.9.tar.gz` - 进入...

    秒杀实战 redis nginx 分布式session-secKill.zip

    源代码中,可能会有处理秒杀逻辑的服务端代码,例如Java或Python,它负责处理业务逻辑,与Redis交互,以及与Nginx进行通信。配置文件可能包括Nginx的配置,用于设置反向代理、限流规则以及Session共享。而README文档...

    redis-trib.rb文件.zip

    在 Windows 环境中安装 Redis 集群,你需要首先下载 Redis 的源代码或者预编译的二进制文件。通常,Redis 在 Unix-like 系统上运行更为顺畅,但在 Windows 上也可以通过 Cygwin 或其他兼容环境来实现。以下是使用 `...

    redis-2.6.14.tar.gz

    开发者可以通过阅读源码了解Redis的工作原理,或者对其进行定制和调试。 综上所述,Redis-2.6.14作为一个历史悠久的版本,尽管不如新版本功能全面,但它仍然具有良好的稳定性和效率,适用于那些不需要最新特性的...

    redis-4.0.1.gem/redis-4.0.1.tar.gz

    接下来,`redis-4.0.1.tar.gz`是Redis 4.0.1版本的源代码包,如果你需要从源代码编译安装Redis,或者想要了解其内部工作原理,这个文件非常有用。解压后,你将得到Redis的源代码和相关的构建脚本。为了从源代码编译...

    Redis安装包X64及源码.rar

    阅读源码不仅有助于理解Redis的工作原理,还能帮助开发者在遇到问题时进行调试和优化。如果你是C++开发者,理解源码将使你更擅长于定制Redis,满足特定应用场景的需求。 总结来说,"Redis安装包X64及源码.rar"提供...

    Redis-6.2源码调试

    这个配置告诉VSCode使用gdb作为调试器,启动`src/redis-server`作为程序,并在当前工作区目录下运行。"preLaunchTask"可以配置为一个构建任务,确保在调试前编译源码。 为了编译Redis,你需要安装gcc/g++编译器,并...

    redis-2.8.19主从配置+sentinel主从切换+Java源码案例

    Redis是一款高性能的...这个案例可能还包括作者的理解注释,帮助理解代码逻辑和Redis的工作原理。通过实践这些代码,开发者可以更好地理解和掌握Redis的主从配置、Sentinel的使用以及如何在Java应用程序中集成Redis。

    redis单机三节点等部署

    本文将详细阐述如何在单台机器上部署三个Redis节点,形成一个简单的集群,以便于理解Redis集群的基本原理和操作流程。 首先,我们需要理解Redis集群的基本概念。Redis集群采用分片(Sharding)策略,数据分散到多个...

    Redis启动过程详解

    ### Redis启动过程详解 #### 一、概述 Redis是一款高性能的键值存储系统,它具有内存数据存储、网络通信及复杂的数据结构操作等功能。本文旨在深入解析Redis的启动过程,帮助读者更好地理解其内部机制。文章主要...

    RedisCache-master.zip

    1. **Redis 基本概念**: - **键(Key)**:Redis 中的数据存储以键值对形式存在,键是唯一标识符。 - **值(Value)**:键对应的值可以是字符串、哈希、列表、集合、有序集合等多种数据类型。 - **数据类型**:...

    Windows 10的.bat 批处理文件脚本打开程序员的开发工具脚本源码,一键打开IDEA,Nacos,Redis等

    在这个特定的场景中,我们有一个名为"启动redis和nacos.bat"的批处理脚本,它的目的是帮助程序员一键启动常见的开发工具,包括IntelliJ IDEA、Nacos和Redis。 IntelliJ IDEA是JetBrains公司开发的一款流行的Java...

    redis-2.0.0.tar.gz

    1. **src**:这是主要的源代码目录,包含Redis服务器的主程序`redis-server`以及客户端工具,如`redis-cli`(命令行接口)、`redis-check-dump`(检查RDB文件)和`redis-sentinel`(哨兵系统,用于监控、故障转移和...

Global site tag (gtag.js) - Google Analytics