Redis多线程模型
zhaolengquan Lv3

为什么redis6.0之前不使用多线程?

使用redis时,几乎不存在cpu成为瓶颈的情况,Redis主要受限于内存和网络

在Linux系统上,Redis通过pipelining每秒可以处理100万个请求,所以如果应用程序主要使用 O(N) 或O(log(N)) 的命令,它几乎不会占用太多 CPU。

使用单线程,可维护性高,多线程模型虽然在某些方面表现优异,但是它却引入了程序执行顺序的不确定性,带来了并发读写的一系列问题,增加了系统复杂度、同时可能存在线程切换、甚至加锁解锁、死锁造成的性能损耗。

单线程机制让Redis内部实现复杂度大大降低,Hash的惰性Rehash,Lpush等线程不安全的命令都可以无所进行.

img

执行命令阶段,Redis是单线程处理命令,每一条到达服务器的命令不会立即执行,所有的命令都会进入一个socket队列,socket可读则交给单线程事件分发器逐个被执行.

img

为什么Redis6.0要引入多线程?

Redis性能瓶颈可能出现在网络io的读写,也就是单个线程处理网络读写的速度跟不上底层网络硬件的速度.

读写网络的read/write系统调用占用了Redis执行期间大部分CPU时间,瓶颈在于网络IO消耗

Redis多线程Io只用来处理网络读写请求,对于Redis的读写命令,依然是单线程处理.

 Comments