300分钟吃透分布式缓存-21讲:Redis读取请求数据后,如何进行协议解析和处理?

Redis 协议解析及处理

协议解析
上一课时讲到,请求命令进入,触发 IO 读事件后。client 会从连接文件描述符读取请求,并存入 client 的 query buffer 中。client 的读缓冲默认是 16KB,读取命令时,如果发现请求超过 1GB,则直接报异常,关闭连接。
在这里插入图片描述
client 读取完请求命令后,则根据 query buff 进行协议解析。协议解析时,首先查看协议的首字符。如果是 *,则解析为字符块数组类型,即 MULTIBULK。否则请求解析为 INLINE 类型。

INLINE 类型是以 CRLF 结尾的单行字符串,协议命令及参数以空格分隔。解析过程参考之前课程里分析的对应协议格式。协议解析完毕后,将请求参数个数存入 client 的 argc 中,将请求的具体参数存入 client 的 argv 中。

协议执行
请求命令解析完毕,则进入到协议执行部分。协议执行中,对于 quit 指令,直接返回 OK,设置 flag 为回复后关闭连接。
在这里插入图片描述
对于非 quit 指令,以 client 中 argv[0] 作为命令,从 server 中的命令表中找到对应的 redisCommand。如果没有找到 redisCommand,则返回未知 cmd 异常。如果找到 cmd,则开始执行 redisCommand 中的 proc 函数,进行具体命令的执行。在命令执行完毕后,将响应写入 client 的写缓冲。并按配置和部署,将写指令分发给 aof 和 slaves。同时更新相关的统计数值。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-11 20:56:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-11 20:56:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-11 20:56:04       82 阅读
  4. Python语言-面向对象

    2024-03-11 20:56:04       91 阅读

热门阅读

  1. golang中fallthrough简介及用法

    2024-03-11 20:56:04       45 阅读
  2. Spring Data的Repositories----Query by Example

    2024-03-11 20:56:04       42 阅读
  3. L1阶段题解方法总结

    2024-03-11 20:56:04       31 阅读
  4. 使用docker安装logstash的具体方法

    2024-03-11 20:56:04       38 阅读
  5. [蓝桥杯]接龙数列(C语言)

    2024-03-11 20:56:04       42 阅读
  6. docker使用笔记

    2024-03-11 20:56:04       39 阅读