字如其名,pipeline就是管道的意思。管道本身是能够承载流式数据的一个长链路,所以通过管道的字面意思我们能够知道他能够进行事件的缓冲的。
redis客户端与服务器端的交互
Redis其实是一个基于TCP协议的CS架构的内存数据库。所有的操作都是一个request一个response的同步操作。redis每接收到一个命令就会处理一个命令,并同步返回结果。这样带来的问题就是,一个命令就会产生一次RTT(Round Time Trip),这样的话必然会消耗大量的网络IO。
pipeline的出现
为了提高redis的读写能力,所以就有了pipeline的出现,我们对于多个命令执行,不再同步等待每个命令的返回结果。我们会在统一一个时间点来获取response。这样就解决多个RTT的问题
普通请求模型:
Pipeline请求模型:
image.png
注:图片来源,侵删
当然,通过pipeline我们也不仅仅只是通过减少RTT来提高服务的响应能力,对于redis来说,处理单次redis command所带来的访问数据结果操作和响应客户端操作是没有多少耗费的,但是处理多次redis command除了带来了频繁的网络io,同样需要redis调用多次read() 和write()系统方法,系统方法会将数据从用户态转移到内核态,这样就会对进程上下文有比较大的影响了。
通过pipeline我们将会大大减少这样的操作。
参考文章
pipeline注意点
- pipeline只适用于那些不需要获取同步结果的场景,比如hincr,hset等更新操作。而对于读取hget操作则不能适用。
- pipeline组装命令也不能是没有节制的,如果pipeline组装命令数据过多,则会导致一次pipeline同步等待时间过长,影响客户端体验甚至导致网络阻塞。
- pipeline不能保证命令执行的原子性。如多个命令在执行的中间发生了异常,那么将会丢失未执行的命令。所以我们一般使用pipeline时,需要自己保证执行命令的数据安全性。
网友评论