REDIS篇(4)——命令执行过程(readQueryFromClient)

news2024/11/22 23:22:02

前面讲过,ae循环在收到客户端请求时,会调用请求处理器——acceptTcpHandler ,而请求处理器会创建新的套接字并监听和绑定命令处理器——readQueryFromClient。本篇着重分析命令的执行过程。

大概可分为:

1、读取并分析套接口中协议格式的命令请求,设置redisClient的queryBuf、argv和argc属性------(processInlineBuffer)

2、执行命令------(processCommand)

  1. 查找对应的命令实现
  2. 执行预备操作
  3. 执行命令及执行完的后续操作

3、将命令回复发送给客户端------(sendReplyToClient)


源码分析:

首先一路跟踪readQueryFromClient函数来到processInputBuffer。这里主要看processInlineBufferprocessCommand分别对应上面的1、2两点
在这里插入图片描述

1、读取并分析套接口中协议格式的命令请求,设置redisClient的argv和argc属性(processInlineBuffer)
在这里插入图片描述
2、执行命令(processCommand)
在这里插入图片描述
上面除了lookupCommand(匹配命令实现函数)外,其他的大都是命令执行前的预备操作,而真正执行命令的地方在call方法

call:
在这里插入图片描述
其中c->cmd->proc©这一行即执行了对应的命令实现函数。后面的则是执行命令的后续操作(但不包括返回给客户端的操作)

3、将命令回复发送给客户端
跟踪完readQueryFromClient会发现并没有看到有回复执行结果给客户端的代码。
那么redis是如何将执行结果回复给客户端的呢?
以set命令为例,点开setCommand可以看到addReply方法
在这里插入图片描述
不点进去看的同学可能会以为这里就是回复了。但其实不然,这里只是将当前客户端加入了server.clients_pending_write,并且将执行结果存到bufpos缓存区而已,并没有真正的回复。。。
代码看到这里,一次事件处理就已经看完了。

但是还是没有回复客户端啊???究竟是如何回复的?
答案在aeMain(redis事件处理循环)
前面讲过,除了将执行结果存到缓存区外,还会将当前客户端加入server.clients_pending_write。而在aeMain每次处理事件之前会先执行beforesleep方法
在这里插入图片描述
而beforeSleep会执行handleClientsWithPendingWrites(处理缓存区里的写数据)
在这里插入图片描述
handleClientsWithPendingWrites方法会先尝试执行writeToClient直接回复。若不行,再执行aeCreateFileEvent创建一个文件写事件并绑定回复处理器sendReplyToClient加入事件循环,由后面的事件循环再调用。
在这里插入图片描述
最后来一波命令回复的总结:
在这里插入图片描述

参考文献:《Redis设计与实现》黄健宏著、redis-5.0.14源码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2499.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QT学习_06_UI设计

1 创建项目 前5篇的学习笔记都没有用到ui,从现在开始,就要用这个ui了 创建项目的时候,把这个Generate form√上 项目文件中,就多了mainwindow.ui 2 ui设计界面的介绍 双击这个.ui文件,就可以进入设计界面 下面简单的…

字节跳动内推软件测试【自动化测试】岗,最低年薪50W+

目录 字节跳动内推 测试开发工程师技能成长路径 字节跳动内推 今年大环境不好,内卷的厉害,薪资待遇好的工作机会更是难得。最近脉脉职言区有一条讨论火了: 哪家互联网公司薪资最‘厉害’? 下面的评论多为字节跳动,还炸…

JAVA计算机毕业设计网约车管理系统(附源码、数据库)

JAVA计算机毕业设计网约车管理系统(附源码、数据库) 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目…

毕业设计源码-计算机毕业设计源码

2022年09月 09/28文件文档在线预览解决方案09/22商城系统09/22知识分享与团队协同软件09/22共享充电桩小程序09/22共享雨伞租借系统09/22小程序博客09/22共享充电宝小程序09/22美容美发小程序09/22民宿小程序09/22兼职小程序09/22相亲小程序09/22贴身管家小程序09/22扫码点餐小…

Spring IOC 核心流程介绍

前言 接下来我们编写入口代码,跟代码梳理一下Spring IOC一些重要的方法节点。IOC有12个比较重要的方法,把这12个方法学习一下,整个Spring IOC基本就差不多了。 编写Spring IOC入口 1、创建需要被管理的类 接口类: package se…

蜜罐技术二三事

目录 1. 蜜罐技术介绍 1.1 蜜罐技术是什么 1.2 蜜罐分类 2. 使用蜜罐技术获取信息 2.1 初始化项目 2.2 读取 PFRO.log 文件 2.2.1 PFRO.log 作用及位置 2.2.2 使用 fs 读取 PFRO.log 文件 2.2.3 关于 buffer 与字符编码(扩展) 2.3 使用 正则表…

美国FBA海运有哪几种渠道

美国FBA海运有两种渠道,下面具体来看下这两种渠道: 一、Matson美森(CLX/CCX/CLX) 1、CLX美森限时达。时效性:开船后12-18天内交UPS配送(通常在13-15天); 2、CCX美森正班船。时效性:开船后16-22天内交UPS配送(通常在18-20天); 3、C…

基于改进PSO-ABC算法的机器人路径规划(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 系统试图借助人工蜂群针对粒子群算法和蜂群算法在寻优中存在的一些早熟和收敛速精度不高等问题,本文分别对粒子算法和蜂群算法…

MySQL是怎么保证数据不丢失的

一.什么是两阶段提交 1.SQL语句(update user set name‘李四’ where id3)的执行流程是怎样的呢? 1.执行器先找引擎取 ID3这一行。ID 是主键,引擎直接用树搜索找到这一行。 2.如果 ID3 这一行所在的数据页本来就在内存中&#x…

Android 开发学习(三)

文章目录1. ListView 的 使用2. RecyclerView 的 使用 (推荐)3. 动画3.1 逐帧动画3.2 补间动画3.2.1 补间动画 之 alpha透明度3.2.2 补间动画 之 rotate旋转3.2.3 补间动画 之 scale(缩放)3.2.3 补间动画 之 translate(平移)3.3 属性动画4. 单位 和 尺寸5. ViewPager 的使用6. …

程序员最浪漫的表白方式,将情书写在她的照片里,Python简直太厉害啦~

人生苦短,我用Python序言实现步骤1、准备工作2、Pillow 介绍3、实战演练序言 这不光棍节快到了,表弟准备写一封情书给他的女神,想在光棍节之前脱单。 为了提高成功率,于是跑来找我给他参谋参谋,本来我是不想理他的&am…

无刷电机控制基础(3)——FOC矢量控制入门

本节我们讲一些无刷电机FOC矢量控制的入门知识。 1)FOC矢量控制的作用 我们前两节讲的无刷电机(BLDC),是最简单的结构,当转子匀速转动时,定子内产生的反电动势是梯形波;在驱动无刷电机转动时&a…

【大二Web课程设计】基于HTML+CSS技术制作抗疫感动专题网页设计

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

Vue2 带纵向合并的原生表格实现切割侧栏分页

文章目录前言一、目标效果二、失败方案三、正确方案四、解决正确方案中的一个Bug总结前言 前端表格分页. 带纵向合并的表格, 到达固定行数强制分页, 截断本页纵向合并, 在下页展示该纵向列的剩余部分, 代码多为前端数据处理, 所以仅提供思路. 这并不难, 你可以直接看第三节. 一…

嵌入式系统-开关机测试笔记

在嵌入式系统中,产品在出厂前需要对开发板的开关机进行测试,用于验证产品在大量次数的开关机过程中是否出现异常.实现方法如下: 1.电源准备 我们不可能完全人工操作,太耽误时间和效率.在这里我选用了一款稳压源GW INSTEK GPD 3303这款产品支持串口编程控制,花了一些时间编写了…

智能车图像处理去畸变+逆透视教程

逆透视请参考:智能车逆透视教程(含上位机、源码)_LoseHu的博客-CSDN博客 去畸变请参考:智能车去畸变教程(含上位机、源码)_LoseHu的博客-CSDN博客 逆透视去畸变:如下 1.简介 在前两个博文中已经分别说明了单独去畸变、逆透视的方法。为了同…

web前端进阶之一些动画

1.字体图标的基本使用 首先下载iconfont文件夹&#xff0c;用link标签引入&#xff0c;使用如下&#xff1a; <i class"iconfont icon-favorites-fill green"></i> //改样式的话使用iconfont或者使用 .green(自己设置的类名) .iconfont {font-size: 60…

React.memo 和 useMemo 的使用

文章の目录问题背景useMemo 进行优化React.memo 进行优化props的值是基本类型props的值是引用类型写在最后问题背景 大家在使用 React 框架进行开发时一定遇到过以下问题&#xff1a; 当函数式组件中的某一状态改变&#xff0c;整个组件刷新&#xff0c;重新渲染在类组件中 s…

解决虚拟机下 “Linux和Windows之间复制粘贴” 的问题

大家在安装完虚拟机后&#xff0c;其实很多东西都还是要跟Windows打交道的&#xff0c;比如像Linux下某个软件的环境配置&#xff0c;你在Linux下遇到种种问题&#xff0c;这时你已习惯回到Windows下&#xff0c;默默的打开了“一亿名程序员都在用的CSDN平台”&#xff0c;找到…

腾讯疯狂招人,肝完自动化测试这关,20k+妥了

前言 对于程序员来说&#xff0c;BAT 为首的一线互联网公司肯定是自己的心仪对象&#xff0c;毕竟能到这些大厂工作&#xff0c;不仅薪资高待遇好&#xff0c;而且能力技术都能够得到提升&#xff0c;最关键的是还能够给自己镀上一层金&#xff0c;让人瞻仰。 最近很多同行群…