前言
用过redis的人,或者去面试的人被问redis的问题,基本都会了解redis特别快。
redis高校的原因:
- 1.单线程,减少了线程切换的消耗。
- 2.基于内存操作
- 3.IO多路复用
说起IO多路复用,可以先从IO模型开始了解。
BIO
BIO是一种同步阻塞的IO模型,由用户程序线程发起请求,完成数据的复制接收。
BIO 同步阻塞IO模型.png
NIO
NIO是一种同步非阻塞的I/O模型,也是I/O多路复用的基础,成为解决高并发与大量连接、I/O处理问题的有效方式。
NIO 同步非阻塞IO模型.png
IO多路复用
IO多路复用模型,就是通过一种新的系统调用,一个进程可以监视多个文件描述符,一旦某个描述符就绪(一般是内核缓冲区可读/可写),内核kernel能够通知程序进行相应的IO系统调用。
目前支持IO多路复用的系统调用,有 select,epoll等等。select系统调用,是目前几乎在所有的操作系统上都有支持,具有良好跨平台特性。epoll是在linux 2.6内核中提出的,是select系统调用的linux增强版本。
IO多路复用IO模型.png
异步IO模型 AIO
在内核kernel的等待数据和复制数据的两个阶段,用户线程都不是block(阻塞)的。用户线程需要接受kernel的IO操作完成的事件,或者说注册IO操作完成的回调函数,到操作系统的内核。所以说,异步IO有的时候,也叫做信号驱动 IO 。
异步IO模型.png
多种IO模型区别
在以上多种IO模型中,各个模型有自己的特点,也有各自的优缺点。
BIO的优缺点
优点:
- 1.BIO模型程序简单,用户线程基本不会占用CPU资源,无需线程切换。
- 2.在并发量小的情况下适用,不必用其他复杂的IO模型来解决问题。
缺点:
- 1.每个连接配套一条独立的线程,在高并发的情况下,对内存、线程切换开销非常巨大。
综上,在简单的低并发的场景下,为了降低程序的复杂度,可以使用BIO,在高并发的场景下,不建议使用。
NIO的优缺点
优点:
- 线程非阻塞,实时性好。
缺点:
- 轮询的行为,毫无疑问的讲占用大量的CPU时间,系统资源利用率也会下降。
综上,可以看出,虽然具有非阻塞的特点,但是在高并发的场景下,也存在着巨大的消耗问题。单纯的使用NIO,并不建议使用。
异步IO模型
优点:
- 线程非阻塞
缺点:
- 需要用户程序或者内核空间做一系列事情来完成上述功能。
- 提出时间较短,并没有非常完善的解决方案。
综上,虽然从模型上看,异步IO模型在各方面综合比较来说,的确有非常大的优势,但是还在完善阶段,未来肯定会有更好的发挥作用,但是在现在的场景下,使用的还是相对较少。
IO多路复用
优点:
- 1.通过select/epoll优势,一个线程可以处理更多的连接,提高了性能,提高了能力。
缺点:
- select/epoll的系统调用,其实也是BIO,也是阻塞的,而且也是通过轮询的方式。
综上所述,IO多路复用其实也是有阻塞的,只不过相对于一个线程维护一个连接,大大提高了性能,减少了系统的开销。
IO多路复用也是大多数框架使用的IO模型。
redis中IO多路复用
redis服务器中有两类事件:
- 文件事件:redis主进程中进行处理,主要处理客户端的连接请求和响应
- 时间事件:fork出的子进程中进行处理,服务器定期或者周期性执行的事件,例如,rdb、aof等
文件事件是对套接字操作的抽象,每当一个套接字准备好执行连接应答、写入、读取、关闭等操作时,就会产生一个文件事件。
包括可读事件、可写事件。
针对套接字、文件事件、文件描述符等概念后续计划出一篇文章进行讲解。
网友评论