redis之所以快,不仅仅是因为它是基于内存的操作,不需要像磁盘一样,读写数据需要经过磁盘IO操作,直接与CPU进行交互。除此之外,还得益于IO多路复用+单线程处理。
提到IO,经常谈及的是BIO、NIO、AIO。
- BIO 同步阻塞
- NIO 同步非阻塞
- AIO 异步非阻塞
IO多路复用
这里的IO指的是客户端与服务端redis的Socket IO,多路则是多个客户端与redis的连接请求。redis的多IO线程是用来处理网络请求的,对于读写操作命令,redis还是以单线程来处理。所以这里复用指的是redis的单线程处理多个客户端的Socket连接请求,并保证不会阻塞主流程。
原理如图所示:
redis的多路复用是使用epoll机制实现的,epoll将socket的文件描述符注册,然后负责监听哪些Socket上有消息到达,此时的Socket采用非阻塞模式,即收发客户端消息不会阻塞。
工作原理为:
1.初始化
redis启动时,创建一个epoll实例,并将监听套接字注册到epoll实例中
2.事件监听
redis使用epoll来监听多个文件描述符上的IO事件
3.事件处理
当有事件发生时,会根据事件列表调用相应的事件处理器
4.事件分派器
Redis 使用事件处理器来处理不同类型的事件。
5.非阻塞IO
在事件处理过程中,Redis 使用非阻塞 IO 来实现异步处理。这样可以避免线程阻塞,提高了服务器的并发性能和响应速度。