大家好,我是鸭鸭!
此答案节选自鸭鸭最近弄的**面试鸭小程序 ,更多大厂常问面试题**,可以点击下面的小程序进行阅读哈!
目前这个面试刷题小程序刚出,详细可以看这篇文章!
回归面试题!
正常情况下,如果要执行多条命令,那么操作如下:
而 Redis pipeline(管道)使得客户端可以一次性将要执行的多条命令封装成块一起发送给服务端,具体过程如下图所示:
Redis 服务端在收到来自管道发送的多条命令之后,会先把这些命令按序执行,并将执行结果保存到缓存中,直到最后一条命令执行完成,再把命令执行的结果一起返回给客户端。
Redis 使用 pipeline 主要有以下两个好处:
1)节省了 RTT
RTT(Round Trip Time)即往返时间。Redis 客户端将要执行的多条指令一次性给客户端,显然减少了往返时间。
拿快递来理解,将所有快递都装进卡车在两地一次性配送和将快递分批装进面包车,多次往返两地送完快递。很显然一次性用卡车送完花在两地往返的时间最短。
2)减少了上下文切换带来的开销
当服务端需要从网络中读写数据时,都会产生一次系统调用,系统调用是非常耗时的操作。其中涉及到程序由用户态切换到内核态,再从内核态切换回用户态的过程。当我们执行 100 条 Redis 指令的时候,就发生 100 次用户态到内核态之间上下文的切换,但是如果使用管道的话,其将多条命令一同发送给服务端,就只需要进行一次上下文切换就好了,这样就可以节约性能。
参考网络上的一个执行实验结果,使用 pipeline 性能提升了 100 倍。
这里需要注意 pipeline 不宜包装过多的命令,因为会导致客户端长时间的等待,且服务器需要使用内存存储响应,所以官方推荐最多一次 10k 命令。
还有一点需要注意 pipeline 命令执行的原子性不能保证,如果要保证原子性则使用 lua 脚本或者事务。
最后
最后再推荐下鸭鸭目前努力在做**面试神器面试鸭 **,已经有 1600 多道面试题目啦,欢迎大家来阅读!如果大家有不会的面试题,也可以在小程序内反馈!鸭鸭会第一时间为大家解答!
我是鸭鸭,我们下期见~