复述中如何使用管道

介绍

这篇文章主要为大家展示了“复述中如何使用管道”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“复述中如何使用管道”这篇文章吧。

复述是一个cs模式的tcp服务器,使用和http类似的请求响应协议。一个客户端可以通过一个套接字连接发起多个请求命令。每个请求命令发出后端通常会阻塞并等待复述,服务处理,复述,处理完后请求命令后会将结果通过响应报文返回给客户。基本的通信过程如下
客户:增加X
服务器:1
客户:增加X
服务器:2
客户端:增加X服务器:
3
客户:增加X
服务器:4
基本上四个命令需要8个tcp报文才能完成。由于通信会有网络延迟,假如从客户机和服务器之间的包传输时间需要0.125秒。那么上面的四个命令8个报文至少会需要1秒才能完成。这样即使复述每秒能处理100个命令,而我们的客户也只能一秒钟发出四个命令。这显示没有充分利用复述的处理能力。除了可以利用mget, mset之类的单条命令处理多个关键的命令外
我们还可以利用管道的方式从客户打包多条命令一起发出,不需要等待单条命令的响应返回,而复述,服务端会处理完多条命令后会将多条命令的处理结果打包到一起返回给客户端。通信过程如下

客户:增加X
客户:增加X
客户:增加X
客户:增加X
服务器:1
服务器:2服务器:
3
服务器:4

假设不会因为tcp报文过长而被拆分。可能两个tcp报文就能完成四条命令,客户可以将四个增加命令放到一个tcp报文一起发送,服务器则可以将四条命令的处理结果放到一个tcp报文返回。通过管道方式当有大批量的操作时候。我们可以节省很多原来浪费在网络延迟的时间。需要注意到是用管道方式打包命令发送,复述,必须在处理完所有命令前先缓存起所有命令的处理结果。打包的命令越多,缓存消耗内存也越多,所以并是不是打包的命令越多越好。具体多少合适需要根据具体情况测试。下面是个jredis客户端使用管道的测试包jredisStudy
,
进口org.jredis.JRedis;
进口org.jredis.connector.ConnectionSpec;
进口org.jredis.ri.alphazero.JRedisClient;
进口org.jredis.ri.alphazero.JRedisPipelineService;
进口org.jredis.ri.alphazero.connection.DefaultConnectionSpec;
公共类PipeLineTest {
,,公共静态void main (String [] args) {
,,,,,,长开始=System.currentTimeMillis ();
,,,,,,usePipeline ();
,,,,,,长债=System.currentTimeMillis ();
,,,,,,System.out.println (end-start);

,,,,,,开始=System.currentTimeMillis ();
,,,,,,withoutPipeline ();
,,,,,,最终获得,=System.currentTimeMillis ();
,,,,,,System.out.println (end-start);
,,
,,}
,,,
,,私有静态孔隙withoutPipeline ()
,,{
,,,,,,试着{
,,,,,,,,JRedis JRedis=new JRedisClient (“192.168.56.55", 6379);
,,,,,,,,,,(int i=0;我& lt;100000;我+ +)
,,,,,,,,,,{
,,,,,,,,,,,,jredis.incr (“test2");
,,,,,,,,,,}
,,,,,,,,,,jredis.quit ();
,,,,,}捕捉(异常e) {
,,,,,}
,,}

,,私有静态孔隙usePipeline () {
,,,,才能尝试{
,,,,,,,,ConnectionSpec规范=DefaultConnectionSpec.newSpec (“192.168.56.55" 6379 0, null),
,,,,,,,,JRedis JRedis=newJRedisPipelineService(规范),
,,,,,,,,(int i=0;我& lt; 100000;我+ +)
,,,,,,,,{
,,,,,,,,,,jredis.incr (“test2");
,,,,,,,}
大敌;,,,,,,,jredis.quit ();
,,,,,}捕捉(异常e) {
,,,,,}
,,}
}
输出
103408//使用了管道
104598//没有使用

测试结果不是很明显,这应该是跟我的测试环境有关。我是在自己赢得连接虚拟机的linux。网络延迟比较小,所以管道
优势不明显。如果网络延迟小的话,最好还是不用管道。除了增加复杂外,带来的性能提升不明显。

以上是“复述中如何使用管道”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

复述中如何使用管道