25-二十五、Redis 管道技术
引言
Redis
是一种基于 客户端-服务端 模型以及 请求/响应 协议的 TCP
服务
所以一次 Redis
命令请求会遵循以下步骤
1、 客户端向服务端发送一个查询请求,并监听 Socket
返回,通常是以阻塞模式,等待服务端响应
2、 服务端处理命令,并将结果返回给客户端
每一个单独的 Redis
命令都要重复以上步骤,如果要同时发送多个 Redis
命令,则非常消耗带宽和时间
Redis 管道技术
Redis
管道可以向 Redis
服务发送多个 Redis
命令,然后一次性读取所有服务端的响应
下面的 Shell
范例使用 Redis
管道来一次性操作多个 Redis
命令
注意 $ 符号是命令提示符 nc 命令 NetCat 的简写,你可以访问 Linux nc 了解更多
$ (echo -en "PING\r\n SET site www.ycbbs.vip\r\nGET site\r\nINCR visitor\r\nINCR visitor\r\nINCR visitor\r\n"; sleep 10) | nc localhost 6379
+PONG
+OK
$11
www.ycbbs.vip
:1
:2
:3
上面的 Shell
命令,我们先使用 PING 命令查看 Redis
服务是否可用, 之后我们们设置了 site
的值为 www.ycbbs.vip ,然后我们获取 site 的值并使得 visitor 自增 3 次
从返回的结果中我们可以看到这些命令是一次性向 Redis
服务提交,然后一次性读取所有服务端的响应
Redis 管道的优势
Redis
管道最显著的优势是提高了 Redis
服务的性能
更多范例
下面的 Ruby
代码用来测试 Redis
管道技术对速度的提升效果
require 'rubygems'
require 'redis'
def bench(descr)
start = Time.now
yield
puts "#{descr} #{Time.now-start} seconds"
end
def without_pipelining
r = Redis.new
10000.times {
r.ping
}
end
def with_pipelining
r = Redis.new
r.pipelined {
10000.times {
r.ping
}
}
end
bench( "without pipelining" )
{
without_pipelining
}
bench( "with pipelining" )
{
with_pipelining
}
在我的 Mac OS
系统中运行代码,输出结果如下
without pipelining 1.195238 seconds
with pipelining 0.230783 seconds
从结果可以看出来:开启了管道操作后,往返时延的速度效率提升了将近 5
倍
希望读者能够给小编留言,也可以点击[此处扫下面二维码关注微信公众号](https://www.ycbbs.vip/?p=28 "此处扫下面二维码关注微信公众号")
看完两件小事
如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:
- 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
- 关注公众号 「方志朋」,公众号后台回复「666」 免费领取我精心整理的进阶资源教程
本文著作权归作者所有,如若转载,请注明出处
转载请注明:文章转载自「 Java极客技术学习 」https://www.javajike.com