Redis 命令执行过程(上)

  • 时间:
  • 浏览:1
  • 来源:大发5分3D_大发5分3D官方

client 的属性所含也不 属性,比如里边会看后的输入缓冲区 querybuf 和输出缓冲区 buf,这里肯能代码过长做了省略,感兴趣的同学还可以自行阅读源码。

今天亲们来了解一下 Redis 命令执行的过程。在然后的文章中《当 Redis 所处高延迟时,到底所处了那此》亲们曾简单的描述了一条命令的执行过程,本篇文章展示深入说明一下,加深读者对 Redis 的了解。

Redis 服务器启动时,会调用 initServer 依据 ,首先会建立 Redis 被委托人的事件机制 eventLoop,一些在其上注册周期时间事件处理器,最后在所监听的 socket 上

创建文件事件处理器,监听 socket 建立连接的事件,其处理函数为 acceptTcpHandler。

processInputBuffer 主也不 将输入缓冲区中的数据解析成对应的命令,根据命令类型是 PROTO_REQ_MULTIBULK 还是 PROTO_REQ_INLINE,来分别调用 processInlineBuffer 和 processMultibulkBuffer 依据 来解析命令。

readQueryFromClient 依据 会调用 read 依据 从 socket 中读取数据到输入缓冲区中,一些判断其大小是算不算大于系统设置的 client_max_querybuf_len,肯能大于,则向 Redis返回错误信息,并关闭 client。

肯能文章篇幅大问题,本篇文章就先讲到这里,后半每种在接下来的文章中进行讲解,欢迎亲们继续关注。

设置读事件处理器,当客户端通过 socket 发送来数据后,Redis 会调用 readQueryFromClient 依据 。

当客户端向 Redis 建立 socket时,aeEventLoop 会调用 acceptTcpHandler 处理函数,服务器会为每个链接创建2个 Client 对象,并创建相应文件事件来监听socket的可读事件,并指定事件处理函数。

一些调用 processCommand 依据 来执行命令。执行成功后,肯能是主从客户端,还需用更新同步偏移量 reploff 属性,一些重置 client,让client还可以接收一条命令。

接下来,亲们分别来看一下各个步骤的具体原理和代码实现。

将数据读取到输入缓冲区后,readQueryFromClient 依据 会根据 client 的类型来做不同的处理,肯能是普通类型,则直接调用 processInputBuffer 来处理;肯能是主从客户端,还需用将命令同步到被委托人的从服务器中。也也不 说,Redis实例将主实例传来的命令执行后,继续将命令同步给被委托人的从实例。

设置 socket 为 非阻塞 socket、设置 NO_DELAY 和 SO_KEEPALIVE标志位来关闭 Nagle 算法一些启动 socket 存活检查机制。

createClient 依据 除了创建 client 内部管理体并设置其属性值外,总要对 socket进行配置并注册读事件处理器

acceptCommonHandler 则首先调用 createClient 创建 client,接着判断当前 client 的数量是算不算超出了配置的 maxclients,肯能超过,则给客户端发送错误信息,一些释放 client。

如下图所示,一条命令执行完成一些返回数据一共涉及三每种,第一步是建立连接阶段,响应了socket的建立,一些创建了client对象;第二步是处理阶段,从socket读取数据到输入缓冲区,一些解析并获得命令,执行命令并将返回值存储到输出缓冲区中;第三步是数据返回阶段,将返回值从输出缓冲区写到socket中,返回给客户端,最后关闭client。

call 依据 是 Redis 中执行命令的通用依据 ,它会处理通用的执行命令的前置和后续操作。

解析命令暂时不看,也不 将 redis 命令文本信息,记录到client的argv/argc属性中

processCommand 依据 会处理也不 逻辑,不过大致还可以分为2个 每种:首先是调用 lookupCommand 依据 获得对应的 redisCommand;接着是检测当前 Redis 是算不算还可以执行该命令;最后是调用 call 依据 真正执行命令。

这2个 阶段之间是通过事件机制串联了,在 Redis 启动阶段首没能注册socket连接建立事件处理器:

createClient 依据 用于创建 client,它代表着连接到 Redis 客户端,每个客户端需用本人的输入缓冲区和输出缓冲区,输入缓冲区存储客户端通过 socket 发送过来的数据,输出缓冲区则存储着 Redis 对客户端的响应数据。client一共有并算不算类型,不这类 型的对应缓冲区的大小需用同。

processCommand会做如下逻辑处理:

命令传播也不 将命令写入 repl-backlog-buffer 缓冲中,并发送给各个从服务器中。

acceptTcpHandler 函数会首先调用 anetTcpAccept 依据 ,它底层会调用 socket 的 accept 依据 ,也也不 接受客户端来的建立连接请求,一些调用 acceptCommonHandler 依据 ,继续后续的逻辑处理。

在《Redis 事件机制详解》一文中,亲们曾完整版介绍过 Redis 的事件机制,还可以说,Redis 命令执行过程中需用由事件机制协调管理的,也也不 initServer 依据 中生成的 aeEventLoop。当socket所处对应的事件时,aeEventLoop 对调用肯能注册的对应的事件处理器。