单线程的redis为何要用multi,exec和pipeline两套批量指令
众所周知,redis是单线程的。
多个客户端发来的所有指令会按接受到的顺序一个个的执行。
那么multi,exec的作用是什么呢?和pipeline区别在哪?
如果只是简单的认为,multi可以在客户端打包要执行的命令批量的提交到服务端,从而减少每条指令每次发送的网络通讯。那么和pipeline有何区别?
然而redis是单线程的。这两套指令看起来没有什么区别。
从定义上可以得知multi指令的用途是保证multi和exec之间的所有指令不被其他客户端的指令打扰的一个个执行。
pipeline会被打扰吗?在单线程模式下,没有理由认为会被打扰,除非redis服务端将所有指令入队列后,每次随机的挑选一个出来执行。这样做毫无意义,也会造成不公平问题。
有一个场景,就是如果指令很多,多到需要分多次发送到服务端,这时,pipeline不会等到所有指令到达后一起执行,而是收到一个包就执行这部分指令。
但是服务端收到multi指令后,会一直等到exec指令到达,才将所有的指令一起放入队列执行。