redis的原理分析-Redis是单进程?性能为什么这么快

1,207 阅读2分钟
Redis采用了一种非常简单的做法,单线程来处理来自所有客户端的并发请求,Redis把任务封闭在一个线程中从而 避免了线程安全问题;redis为什么是单线程?

 官方的解释是,CPU并不是Redis的瓶颈所在,Redis的瓶颈主要在机器的内存和网络的带宽。那么Redis能不能处 理高并发请求呢?当然是可以的,至于怎么实现的,我们来具体了解一下。 【注意并发不等于并行,并发性I/O 流,意味着能够让一个计算单元来处理来自多个客户端的流请求。并行性,意味着服务器能够同时执行几个事情, 具有多个计算单元】

 多路复用 

Redis 是跑在单线程中的,所有的操作都是按照顺序线性执行的,但是由于读写操作等待用户输入或输出都是阻塞 的,所以 I/O 操作在一般情况下往往不能直接返回,这会导致某一文件的 I/O 阻塞导致整个进程无法对其它客户提 供服务,而 I/O 多路复用就是为了解决这个问题而出现的。 

了解多路复用之前,先简单了解下几种I/O模型 

(1)同步阻塞IO(Blocking IO):即传统的IO模型。

 (2)同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为 NONBLOCK。

 (3)IO多路复用(IO Multiplexing):即经典的Reactor设计模式,也称为异步阻塞IO,Java中的Selector和 Linux中的epoll都是这种模型。 

(4)异步IO(Asynchronous IO):即经典的Proactor设计模式,也称为异步非阻塞IO。

 同步和异步、阻塞和非阻塞,到底是什么意思,感觉原理都差不多,我来简单解释一下 

同步和异步,指的是用户线程和内核的交互方式

 阻塞和非阻塞,指用户线程调用内核IO操作的方式是阻塞还是非阻塞 

就像在Java中使用多线程做异步处理的概念,通过多线程去执行一个流程,主线程可以不用等待。

而阻塞和非阻塞 我们可以理解为假如在同步流程或者异步流程中做IO操作,如果缓冲区数据还没准备好,IO的这个过程会阻塞。