单线程的redis为何要用multi,exec和pipeline两套批量指令

众所周知,redis是单线程的。

多个客户端发来的所有指令会按接受到的顺序一个个的执行。

那么multi,exec的作用是什么呢?和pipeline区别在哪?

如果只是简单的认为,multi可以在客户端打包要执行的命令批量的提交到服务端,从而减少每条指令每次发送的网络通讯。那么和pipeline有何区别?

然而redis是单线程的。这两套指令看起来没有什么区别。

从定义上可以得知multi指令的用途是保证multi和exec之间的所有指令不被其他客户端的指令打扰的一个个执行。

pipeline会被打扰吗?在单线程模式下,没有理由认为会被打扰,除非redis服务端将所有指令入队列后,每次随机的挑选一个出来执行。这样做毫无意义,也会造成不公平问题。

有一个场景,就是如果指令很多,多到需要分多次发送到服务端,这时,pipeline不会等到所有指令到达后一起执行,而是收到一个包就执行这部分指令。

但是服务端收到multi指令后,会一直等到exec指令到达,才将所有的指令一起放入队列执行。

 

posted @ 2017-09-30 14:17  java林森  阅读(437)  评论(0编辑  收藏  举报