redis为何是单线程以及redis为何这么快?

Redis为何这么快网络

一、彻底基于内存,绝大部分请求是纯粹的内存操做,很是快速。数据存在内存中,相似于HashMap,HashMap的优点就是查找和操做的时间复杂度都是O(1);数据结构

二、数据结构简单,对数据操做也简单,Redis中的数据结构是专门进行设计的;多线程

三、采用单线程,避免了没必要要的上下文切换和竞争条件,也不存在多进程或者多线程致使的切换而消耗 CPU,不用去考虑各类锁的问题,不存在加锁释放锁操做,没有由于可能出现死锁而致使的性能消耗;函数

四、使用多路I/O复用模型,非阻塞IO;性能

五、使用底层模型不一样,它们之间底层实现方式以及与客户端之间通讯的应用协议不同,Redis直接本身构建了VM 机制 ,由于通常的系统调用系统函数的话,会浪费必定的时间去移动和请求;spa

以上几点都比较好理解,下边咱们针对多路 I/O 复用模型进行简单的探讨:线程

(1)多路 I/O 复用模型设计

多路I/O复用模型是利用 select、poll、epoll 能够同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,因而程序就会轮询一遍全部的流(epoll 是只轮询那些真正发出了事件的流),而且只依次顺序的处理就绪的流,这种作法就避免了大量的无用操做。进程

这里“多路”指的是多个网络链接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可让单个线程高效的处理多个链接请求(尽可能减小网络 IO 的时间消耗),且 Redis 在内存中操做数据的速度很是快,也就是说内存内的操做不会成为影响Redis性能的瓶颈,主要由以上几点造就了 Redis 具备很高的吞吐量。事件

那么为何Redis是单线程的

咱们首先要明白,上边的种种分析,都是为了营造一个Redis很快的氛围!官方FAQ表示,由于Redis是基于内存的操做,CPU不是Redis的瓶颈,Redis的瓶颈最有多是机器内存的大小或者网络带宽。既然单线程容易实现,并且CPU不会成为瓶颈,那就瓜熟蒂落地采用单线程的方案了(毕竟采用多线程会有不少麻烦!)。