redis源码学习3 启动、配置及socket

现在就从服务器启动入口开始讲

先列模块

  • server.c 程序入口,初始化逻辑,主循环逻辑等
  • config.c 配置读写、处理
  • anet.c 操作接口,主要是面向操作系统的接口
  • networking.c 服务器具体网络操作
  • redis-cli.c 客户端

跟随 README.md 的脚步走,先看结构主要字段

/* redis服务器 */
struct redisServer {
    redisDb *db;                /* 存储数据的地方 */
    dict *commands;             /* 命令表 */
    list *clients;              /* 连接到此服务器的客户端链表 */
    client *master;             /* 如果自身是从库,这个就是主库的客户端 */
    //....
}
/* redis客户端 */
struct client{
    int fd;                 /* socket 描述符 */
    redisDb *db;            /* 指向当前选择的 DB. */
    sds querybuf;           /* 累积的请求的缓存 */
    int argc;               /* 当前命令数量 */
    robj **argv;            /* 当前命令参数 */
    int flags;              /* 客户端标志值: CLIENT_* 宏. */
    list *reply;            /* 回复给客户端的对象列表 */
    /* 回复缓存 */
    int bufpos;
    char buf[PROTO_REPLY_CHUNK_BYTES];
}

server.c 程序入口,初始化逻辑,主循环逻辑等

启动逻辑主要调用下面几个函数

* `initServerConfig()` 初始化服务器默认值,载入命令表
* `loadServerConfig()` 根据参数设置服务器配置
* `initServer()` 分配内存给server的各种字段,创建 EventLoop, 建立tcp 流socket与unix 流socket,在需要时初始化集群等
* `aeMain()` 开始处理 EventLoop(事件处理),将在下一章专门讲

下面两函数会经常调用
1. `serverCron()` 根据 `server.hz` 周期性调用, 做各种任务, 如检查超时客户端.
2. `beforeSleep()` EventLoop 处理事件前会调用,注意会调用 ` handleClientsWithPendingWrites()`来发送之前(基本是上次循环)留下的数据到客户端


其他重要函数
* `call()` 调用redis命令
* `freeMemoryIfNeeded()` 在新的写入命令时调用,并根据是否达到`maxmemory` 的内存溢出再作处理
* 全局 `redisCommandTable` 字义了所有命令,会被处理后存进 `server.commands` 里

anet.c socket 操作接口,主要是面向操作系统的接口

调用 socket(), bind(), listen() 等函数

  • `anetNonBlock()` 设置为非阻塞


networking.c 服务器具体网络操作

应用于客户端、主从服(只是特殊的客户端)等

下面是重要的函数
  • `createClient()` 每个客户端连接进来都会创建一个client, selectDb(c,0)
  • `freeClient()` 释放内存,断掉连接再移除
  • `readQueryFromClient()` 读取来自客户端的数据到缓存
  • `processInputBuffer()` 处理客户端协议缓存的入口,然后调用 `server.c` 里的 `processCommand()` 执行命令
  • `addReply*()` 是一组回复客户端命令,给client.reply 追加数据的函数
  • `writeToClient()` 由`sendReplyToClient()`调用,发送缓存的数据到客户端

一些注意点

  • 监听的socket设置了非阻塞,因而同一个调用中最多能接收 MAX_ACCEPTS_PER_CALL(1000)个连接
  • 连接成功的文件描述符也是非阻塞的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值