本来打算一周写一篇文章进行技术记录和分享的,但是最近有些忙估计有几个星期没有更了也不知道要写些什么好 🤣
今晚突发奇想想写一下IO模型方面的,所以就萌生了写这篇文章的想法。
如果有时间后面可能会用Java语言来实现NIO模型并且做一个简单的通信。
什么是NIO
NIO是一个IO模型,比NIO更早的是BIO(意为阻塞同步IO)而NIO则是非阻塞同步IO
NIO与BIO相比有哪些好处
BIO名副其实是一个阻塞同步IO,当链接进来时会为每一个链接创建一个线程来处理读写请求而当线程没有进行读写时该线程则阻塞无法处理其它事件。
NIO则是一个非阻塞同步IO,当链接进来时它不会专门为每个链接都创建一个线程来进行处理而是会创建一个Channel然后注册到Selector通过Selector来管理多个Channel。相比于BIO每个线程只能维护一个链接,NIO能维护更多的链接更节约系统资源。
NIO的组成部分
Seletor、Channel、Buffer
NIO模型示意图
上图就是NIO的模型,服务端通过SocketServerChannel的Select能够感知变化,如果客户端第一次连接上来则会为该客户端创建一个SocketChannel并且注册到Selector,注册之后会返回SelectorKey它与Selector相互绑定,通过SelectorKey可以得到相对应的Channel亦能得到相应的Buffer。
延伸问题
Redis为什么是高性能的
答曰:因为Redis的数据储存在内存里面
面试官:今天就到这里吧,先回去等通知!
Redis高性能的原因除了操作是内存级别的操作还有重要的一点就是多路复用,也就是NIO