首页 > 编程知识 正文

redis源码分析 pdf(用wireshark分析http)

时间:2023-05-03 11:07:37 阅读:102460 作者:2778

00-1010这里我就不解释Wireshark的用法了。我可以专门用谷歌搜索一下。本章将分析redis的集合和MSET请求;

说明

1.设置

set('set_key ',' set _ value ');

set('set_key2 ',' set _ value 2 ');

按照以下方式观察捕获的数据:

红框区域:SYN为TCP三次握手建立的连接;

黄框区域:PSH发送数据,ACK为响应;

绿色区域:FIN表示关闭连接;

这里我们只分析发送的数据(即黄框区域的数据);

上面的set命令被请求了两次,我们可以想象这个过程:

客户端发送数据-服务器(PSH)

服务器接收数据并向客户端发送回执

服务器发送数据-客户端(PSH)

客户端接收数据并向服务器发送回执

对不对?让我们看看捕获的数据。

看起来像我们上面说的,但是为什么我们在下面重复这个步骤(下面有PSH和ACK),这样我们就可以看看先发送什么样的数据。

从上图可以看出,客户端请求了两次(即发送了两次数据),服务器响应了两次(即发送了两次数据),所以上面的步骤1、2、3、4会重复两次。我们再来看看发送数据的格式:

*3表示三个参数。

$3第一个参数的长度

设置第一个参数的值(命令=设置为执行)

$7第二个参数的长度

Set_key第二个参数(键)的值

$9第三个参数的长度

Set _ valuethe第三个参数(值)的值

正常执行结果

如果你不确定,我们继续找。

从图中,我们可以确认我们上面说的是对的。

2.MSET

与set相比,mset一次可以发送多个键和值(即一次发送多个命令)。让我们抓住数据看一看。

根据上面的内容,我们可以发现客户端确实只发送了一次请求,服务器也发送了一次(响应数据)。具体请求内容如下:

这表明与多个集合相比,mset减少了请求并缩短了时间。

如果你想看看其他命令是如何通信的,可以按照这个方法抓取数据,一目了然。

补充:

我通过Wireshark分析了Redis管道命令,发现客户端Jedis和生菜是不一样的(spring数据redisTemplate的底层是生菜)。

差异:

Jedis使用流水线。当客户端发送多个命令时,会将它们放入客户端缓冲区(此时没有真正的命令),最后向服务器发送一个请求(包括多个命令),服务器会逐一执行命令,然后将每个执行结果放入一个Response中返回给客户端。

生菜使用管道发送命令,因为底层使用Netty。当执行每个命令时,它直接异步发送(而不是一起发送所有命令)。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。