跟着大彬读源码 - Redis 2 - 服务器如何响应客户端请求?(上)

上次我们通过问题“启动服务器,程序都干了什么?”,跟着源码,深入了解了 Redis 服务器的启动过程。

既然启动了 Redis 服务器,那我们就要连上 Redis 服务干些事情。这里我们可以通过 redis-cli 测试。

现在客户端和服务器都准备好了,那么Redis 客户端和服务器如何建立连接?服务器又是如何响应客户端的请求呢?

1 连接服务器

客户端和服务器进行通讯,首先应该就是建立连接。接下来,我们来看下 redis-cli 与服务器的连接过程。

还记得我们上次使用 gdb 调试程序的步骤吗?让我们对 redis-cli 再来一次,看看源码的执行步骤。在开始之前,记得在编辑器打开 redis-cli.c,定位到 main 函数的位置,毕竟 gdb 看代码没有编辑器看着舒服。

debug 步骤如下:

# bash
cd /opt/redis-3.2.13
// 启动 Redis 服务。Ctrl+c 可推出服务器启动页,同时保持服务器运行
./src/redis-server --port 8379 &
// 调试 redis-clli
gdb ./src/redis-cli
# gdb 
(gdb) b main
(gdb) r -p 8379
(gdb) layout src
(gdb) focus cmd

执行完上述步骤,我们会进入如下界面:

图 1 - 进入 redis-cli main 函数

这时候我们就可以回到编辑器页,看看对 main 函数中哪一行比较感兴趣,就停下来研究研究。到了 2618 行,我们会看到有执行 parseOptions 这个函数,看名字,好像是初始化一些可选项。那就进去看看呗。

1.1 初始化客户端配置

函数执行步骤:main -> parseOptions -> main

我们会看到,在执行 redis-cli 时携带的参数都是在这个函数中解析,比如我们启动的时候带着的 -p 参数,会在 996 行被解析到,同时赋值给客户端的 hostport 配置项。如下图:

图 2 - 启动 redis-cli 携带的 -p 参数被赋值给 hostport 配置项

1.2 客户端启动模式

函数执行步骤:main

回到 main 函数,会看到后面的代码会出现很多 cliConnect 函数。要注意的是,这里并不表示 redis-cli 会执行多次 cliConnect 函数。实际上,每一个 if 语句块,都代表着客户端的一种连接模式,3.2.13 版本支持以下模式:

  1. Latency mode:延迟模式。redis-cli --latency -p 8379 用来测试客户端与服务器连接的延迟。还有 --history--dist 可选项,用来展示不同的形式。
  2. Slave mode:模拟从节点模式。
  3. Get RDB mode:生成并发送 RDB 持久化文件,保存在本地。
  4. Pipe mode:管道模式。将命令封装成指定数据格式,批量发送给 redis 服务器执行。
  5. Find big keys:统计 bigkey 的分布。
  6. Stat mode:统计模式。实时展示服务器的统计信息。
  7. Scan mode:扫描指定模式的键,相当于 scan 模式。
  8. LRU test mode:实时测试 LRU 算法的命中情况。
1.3 连接服务器

函数执行步骤:main -> cliConnect -> redisConnect -> redisContextInit -> redisContextConnectTcp -> _redisContextConnectTcp -> cliConnect

我们上面没有使用特殊模式启动,因此,我们会看到在 2687 行真正的去调用 cliConnect 函数。跟踪进去,让我们看看究竟是如何和服务器进行连接的。

cliConnect 函数中,我们看到,根据 hostsocket 的配置项,会使用不同的连接模式。从名字上,我们大概可以猜出,一个是 TCP Socket 连接,另一个是本机 Unix Socket 连接。

如果想要使用 Unix Socket 连接,只需按格式配置 hostscoket 即可:./src/redis-cli -s /tmp/redis.sock

我们这里使用 TCP Scoket 连接,使用 redisConnect 函数建立连接。

不断追踪,我们会看到上面所示的函数执行步骤,在 _redisContextConnectTcp 函数中会看到 getaddrinfoconnect 函数的调用,这里就是建立 TCP 连接的地方。

1.4 校验权限及选择数据库

函数执行步骤:cliConnect -> anetKeepAlive -> cliAuth -> cliSelect -> main

回到 cliConnect 函数,如果正常连接上服务器后,还会将我们上面创建的 TCP 连接设置为长连接,然后校验权限,选择连接数据库。

...
/* Set aggressive KEEP_ALIVE socket option in the Redis context socket
 * in order to prevent timeouts caused by the execution of long
 * commands. At the same time this improves the detection of real
 * errors. */
anetKeepAlive(NULL, context->fd, REDIS_CLI_KEEPALIVE_INTERVAL);
/* Do AUTH and select the right DB. */
if (cliAuth() != REDIS_OK)
    return REDIS_ERR;
if (cliSelect() != REDIS_OK)
    return REDIS_ERR;
...

至此,我们已经跑完客户端与服务器建立连接的全过程。感兴趣的小伙伴可以尝试连接不存在的 IP 或 端口,观察程序抛出异常的时机,熟悉整个连接过程。

客户端与 服务器建立连接后,就可以使用相关命令操作数据库中的 key 了。下面我们以 SET KEY VALUE 命令为例,来看看命令的执行过程。

2 发送命令请求

当用户在客户端键入一个命令请求时,客户端会将这个命令请求按协议格式转换,然后通过连接到服务器的套接字,将转换后的命令请求发送给服务器,如图 3 所示:

图 3 - 客户端接收并发送命令请求的过程

因此,对于我们上面的命令请求,客户端会转成:

"*3\r\n$3\r\nSET\r\n$3\r\nKEY\r\n$5\r\nVALUE\r\n"

然后发给服务器。

以上是客户端发送命令给服务器的过程,在下一节中,我们再来认识服务器是如何响应客户端请的。

转载于:https://www.cnblogs.com/BeiGuo-FengGuang/p/11161960.html

dianfuquan4988
关注 关注
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
网站服务器如何处理客户端请求,实际的Web服务器处理客户端请求的步骤分析
weixin_35061887的博客
08-06 2344
第一步——接受客户端连接接受一个客户端连接,或者如果不希望与这个客户端建立连接,就将其关闭。第二步——接收请求报文从网络中读取一条HTTP请求报文解析报文1. 解析请求行,查找请求方法、指定的资源标识符(URI)以及版本号,各项之间由一个空格分隔,并以一个回车换行(CRLF)序列作为行的结束;2. 读取以CRLF结尾的报文首部;3. 检测到以CRLF结尾的、标识首部结束的空行(如果有的话);4. ...
macbook安装Redis客户端another-redis-desktop-manager
weixin_43818327的博客
07-18 3400
macbook安装Redis客户端工具,超简单命令安装another-redis-desktop-manager。 这台电脑主要在使用Ruby,就简单做一个增删查的操作给大家示范一下,不做过多操作。点击左上角设置,可以设置主题(夜间模式)和语言。命令执行完成之后,桌面就会显示对应图标。设置完成之后,可以看到对应的信息。手动新增key,设置value。不讲废话,直接上命令。......
跟着大彬读源码 - Redis 8 - 对象编码之字典
dianfuquan4988的博客
08-05 116
目录 1 字典的实现 2 插入算法 3 rehash 与 渐进式 rehash 总结 字典,是一种用于保存键值对的抽象数据结构。由于 C 语言没有内置字典这种数据结构,因此 Redis 构建了自己的字典实现。 在 Redis 中,就是使用字典来实现数据库底层...
跟着大彬读源码 - Redis 10 - 对象编码之整数集合
dianfuquan4988的博客
08-12 143
目录 1 整数集合的实现 2 升级操作 3 升级优势 4 交、并、差集算法 5 总结 整数集合是 Redis 集合键的底层实现之一。当一个集合只包含整数值元素,并且元素数量不多时,Redis 就会使用整数集合作为集合键的底层实现。 1 整数集...
跟着大彬读源码 - Redis 5 - 对象和数据类型(上)
dianfuquan4988的博客
07-22 116
目录 1 对象 2 字符串对象 3 列表对象 总结 相信很多人应该都知道 Redis 有五种数据类型:字符串、列表、哈希、集合和有序集合。但这五种数据类型是什么含义?Redis 的数据又是怎样存储的?今天我们一起来认识下 Redis 这五种数据结构的含义及其...
跟着大彬读源码 - Redis 3 - 服务器如何响应客户端请求?(下)
dianfuquan4988的博客
07-15 131
目录 1 服务器处理 2 客户端接收并打印回复 总结 继续我们上一节的讨论。服务器启动了,客户端也发送命令了。接下来,就要到服务器“表演”的时刻了。 1 服务器处理 服务器读取到命令请求后,会进行一系列的处理。 1.1 读取命令请求客户端服务器之间的套接字因客户端的写...
tomcat-cluster-redis-session-manager:Tomcat集群Redis会话管理器Java客户端
05-11
当tomcat从客户端收到请求时,将直接从Redis加载会话。 支持Redis默认,哨兵和集群模式(基于配置)。 展望未来,我们无需在Load Balancer中启用粘性会话(JSESSIONID)。 支持: Apache Tomcat 7 Apache ...
基于muduo网络库的集群聊天服务器客户端源码,使用nginx tcp负载均衡,mysql数据库redis发布-订阅.zip
最新发布
12-28
基于muduo网络库的集群聊天服务器客户端源码,使用nginx tcp负载均衡,mysql数据库redis发布-订阅数据库redis发布-订阅 基于muduo网络库的集群聊天服务器客户端源码,使用nginx tcp负载均衡,mysql数据库,...
cpp-redis328的源码注释
08-16
2. **命令发送**:客户端通过发送命令字节流到服务器执行操作。Redis协议通常是基于简单字符串协议(RESP,Re-dis Serialization Protocol),这意味着命令由`*`开头的参数计数值,然后是`$`开头的每个参数的字节数...
tomcat-redis-session-manager支持tomcat7
12-20
因tomcat7使用redis共享session,其他的包存在问题,自己编译后处理通过。 该包是在https://github.com/jcoleman/tomcat-redis-session-manager 将源码编译后的包。
跟着大彬读源码 - Redis 1 - 启动服务,程序都干了什么?
dianfuquan4988的博客
07-08 156
目录 1 搭建 debug 环境 2 初始化服务 3 初始化详细解读 4 其它操作 5 gdb 基础使用 总结 一直很羡慕那些能读 Redis 源码的童鞋,也一直想自己解读一遍,但迫于 C 大魔王的压力,解读日期遥遥无期。 相...
服务器响应请求,服务器是怎样响应请求的?
weixin_42512936的博客
08-04 997
小弟最近在改后端项目,但出了个 bug 又解决不了,我觉得是我的后端知识太欠缺了,特来这里请教。流程是这样的,前端有上送信息,接口收到信息后,用收到的部分信息再去第三方接口请求信息,把两部分合起来存储。收到的信息中有一部分是用户ID(绝不重复),我用这个 ID + 收到信息的时刻(精确到秒)做 md5,生成一个唯一的序列号作为主键。但是有些时候是上传失败的,日志是这么记录的Could not ex...
服务器是靠什么响应请求的,服务器是怎样响应请求的?
weixin_42195569的博客
08-04 509
小弟最近在改后端项目,但出了个 bug 又解决不了,我觉得是我的后端知识太欠缺了,特来这里请教。流程是这样的,前端有上送信息,接口收到信息后,用收到的部分信息再去第三方接口请求信息,把两部分合起来存储。收到的信息中有一部分是用户ID(绝不重复),我用这个 ID + 收到信息的时刻(精确到秒)做 md5,生成一个唯一的序列号作为主键。但是有些时候是上传失败的,日志是这么记录的Could not ex...
响应服务器客户端请求响应,接收对客户端请求的后台服务器响应
weixin_30844407的博客
08-06 419
这是在我的机器上工作的完整代码。在两个事件处理程序中都放置一个断点以查看发生了什么。也许你的网络套接字服务器抛出了一个异常,你只是不知道:public partial class Form1 : Form{private readonly WebSocket _client;public Form1(){InitializeComponent();_client = new WebSocket("...
网络是怎样连接的】第六章 请求到达服务器以及响应客户端(完结)
Currybeefer的博客
07-02 560
1.服务器架构 当网络包到达Web服务器后,服务器就会接收这个包并进行处理。服务器有很多种类,其硬件和操作系统与客户端相比是不一样的。但是网络相关的部分,如网卡,协议栈,Socket库什么的和客户端却别无二致。无论硬件还是OS如何变化,TCP和IP的功能都是一样的。(当然Socket库的用法以及服务器程序的结构还是不同的)服务器的程序结构如图,我们可以把程序分为两个模块,等待连接模块a以及负责与客户端通信的模块b。当服务器启动的时候就会运行等待连接模块a,这个模块负责创建套接字,然后进入等待连接的暂停状态。
客户端服务器之间的通信过程
weixin_58414196的博客
04-28 3492
客户端服务器之间的通信过程主要分为三步:请求——处理——响应 1、客户端发起请求 2、服务器处理本次请求 3、服务器响应客户端
客户端服务器端交互原理(HTTP数据请求与HTTP响应
热门推荐
TKOP_的博客
03-11 1万+
回顾有关服务器客户端的一些概念。了解 HTTP 协议的一些浅层概念,并知道 nodejs 构建服务器的基础知识。
九、客户端服务器端的请求响应
weixin_45602227的博客
05-18 507
一、浏览器发送http请求 1.1 超链接 1.2 form表单提交 1.3 form 表单通过button提交 1.4 ajax提交 二、服务器端如何响应数据 1.1 利用tomcat, 输出流文件 >>>>>> 转发时使用域对象 >>>>>> 请求重定向或转发时通过cookie 1.2 利用servelt的IO流 response.getWrite().write("123") ...
基于Scrapy-Redis的Python分布式爬虫毕设源码
资源摘要信息:"Python基于Scrapy-Redis分布式爬虫设计毕业源码(毕设项目).zip" Scrapy-Redis分布式爬虫是基于Python语言和Scrapy框架开发的分布式爬虫解决方案。Scrapy是一个高效且易于使用的开源Web爬虫框架,适用...
写文章

热门文章

  • 网络协议 15 - P2P 协议:小种子大学问 509
  • 网络协议 终章 - GTP 协议:复杂的移动网络 407
  • 网络协议 22 - RPC 协议(下)- 二进制类 RPC 协议 344
  • 网络协议 4 - 交换机与 VLAN:办公室太复杂,我要回学校 335
  • 网络协议 8 - TCP协议(上):性恶就要套路深 240

最新文章

  • Nginx 实用配置
  • 跟着大彬读源码 - Redis 10 - 对象编码之整数集合
  • 跟着大彬读源码 - Redis 9 - 对象编码之 三种list
2019年25篇
2018年23篇
2016年4篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家江苏玻璃钢小羊动物雕塑定制高质量玻璃钢雕塑订做价格人物玻璃钢雕塑哪家合适池州校园玻璃钢雕塑定制山西现代人物玻璃钢雕塑潮汕人物石氏玻璃钢雕塑商丘玻璃钢人物景观雕塑厂家曲阳玻璃钢雕塑网站上海卡通玻璃钢动物大象雕塑rtm法玻璃钢雕塑生产温州玻璃钢人物雕塑淮北玻璃钢雕塑联系方式玻璃钢雕塑网黑龙江玻璃钢卡通雕塑价格广州玻璃钢小品雕塑河南玻璃钢卡通草莓雕塑信阳玻璃钢浮雕雕塑制作流程云浮定制玻璃钢动物雕塑商场中空吊挂美陈装置玻璃钢甜甜圈雕塑商场飞檐下口美陈挂件灯饰玻璃钢花盆行业濮阳抽象玻璃钢人物雕塑厂家邢台玻璃钢广场雕塑草莓玻璃钢雕塑介绍梅州主题玻璃钢雕塑供货商仙林商场美陈装饰湖南玻璃钢金属雕塑介绍福建常见商场美陈哪家好云南个性化玻璃钢雕塑图片香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化