Redis-执行流程
- 建立连接
- 客户端通过tcp协议和redis服务器建立连接
- redis的io多路复用机制监听到新的连接事件
- 主事件循环会分配一个
连接应答处理器
来处理这个连接
- 处理器为这个连接创建一个client结构体,用于存储所有状态
- 读取命令
- 客户端发送命令(resp格式)
- io多路复用监听到客户端的套接字可读(数据到达内核缓冲区)
- 事件循环触发命令请求处理器
- 处理器调用函数,将数据从内核套接字缓冲区读取到该客户端专属的输入缓冲区中
- 解析命令
- redis尝试从缓冲区中按照resp的格式解析数据(以
\r\n
作为分隔符)
- 解析出来的参数被保存在client结构体的argv(参数数组)和argc(参数个数)字段中
- 查找命令
- 取第一个参数
argv[0]
作为命令名
- 在命令表中查找该命令名(命令表是一个字典,在服务器启动时完成初始化,值是一个redisCommand结构体)
- redisCommand结构体包含了命令的所有元信息,其中的
proc
函数指针,指向了实际实现函数
- 执行前检查
- 在调用函数前,redis会进行一系列检查。如果任何一项失败,都直接返回错误。如:参数个数、认证、内存、集群、数据类型(部分)的检查
- 调用实现函数
- 根据之前找到的函数,和argv中的参数,调用函数
- 更新服务器的统计信息,如key命中次数,内存使用量等
- 执行后操作
- 命令执行完毕后,还会执行一些后续操作,如:慢查询日志、aof持久化、主从复制等
- 回复客户端
- 函数将执行结果写入客户端的输出缓冲区
- 事件循环会监听到客户端的套接字变得可写
- 事件循环调用
命令回复处理器
- 处理器将输出缓冲区的内容通过网络发送回客户端
- 客户端收到回复并解析
- 持久化(可选)
- AOF:根据appendfsync策略,由后台线程将aof缓冲区的内容刷到磁盘
- RDB:如果满足了配置的保存条件,主进程会fork子进程来创建rdb快照,不影响主进程
上一篇
无
下一篇
ElasticsSearch-Segment的组成