Redis为什么是单线程
首先我们要知道严格来说Redis并不是单线程的,Redis的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。Redis的单线程是指:Redis的网络IO和键值对读写是由一个线程完成的,这也是Redis对外提供键值存储服务的主要流程(注意:网络IO和键值对读写)
在了解Redis为什么采用单线程时,我们首先了解一下Redis为什么不使用多线程
1.Redis为什么不使用多线程
日常写程序时,我们经常会听到一种说法:“使用多线程,可以增加系统吞吐率,或是可以增加系统扩展性。”的确,对于一个多线程的系统来说,在有合理的资源分配的情况下,可以增加系统中处理请求操作的资源实体,进而提升系统能够同时处理的请求数,即吞吐率。下面的左图是我们采用多线程时所期待的结果。
但是,请你注意,通常情况下,在我们采用多线程后,如果没有良好的系统设计,实际得到的结果,其实是右图所展示的那样。我们刚开始增加线程数时,系统吞吐率会增加,但是,再进一步增加线程时,系统吞吐率就增长迟缓了,有时甚至还会出现下降的情况。
为什么会出现这种情况呢?一个关键的瓶颈在于,系统中通常会存在被多线程同时访问的共享资源,比如一个共享的数据结构。**当有多个线程要修改这个共享资源时,为了保证共享资源的正确性,就需要有额外的机制进行保证,而这个额外的机制,就会带来额外的开销。**比如我们常见的加锁机制,就会导致给系统带来额外的消耗(Redis不采用多线程的原因之一)
举例子来说:Redis有List的数据类型,并提供出队(LPOP)和入队(LPUSH)操作。假设Redis采用多线程设计,如下图所示,现在有两个线程A和B,线程A对一个List做LPUSH操作,并对队列长度加1。同时,线程B对该List执行LPOP操