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。当执行每个命令时,它直接异步发送(而不是一起发送所有命令)。