Redis网络模型
# Redis网络模型
# 阻塞IO(BIO)
- 用户进程向内核空间发起系统调用,等待网卡数据
- 内核空间等待数据,数据到来后写到内核缓冲区,然后再将数据拷贝到用户缓冲区,然后用户处理数据
- 整个过程用户进程一直在阻塞地等待数据。

# 非阻塞IO(NIO)
- 用户进程发起系统调用等待数据时,内核态直接向用户进程返回调用失败。然后用户进程反复调用询问数据好了没有,因此等待数据阶段用户进程是非阻塞的。但忙等会导致CPU空转。
- 内核态中,一旦数据准备好之后会将数据从内核缓冲区拷贝到用户缓冲区中,才会给用户进程返回OK。数据拷贝阶段进程依旧是阻塞的。

# IO多路复用
- select
①首先创建一个fd集合,以bitmap的形式标记要监听的fd,然后将fd集合从用户态拷贝到内核态。
②内核监听每个fd对应的设备状态,如果有就绪的保留1,未就绪则变成0。然后会把fd集合从内核空间拷贝到用户空间中。
③用户空间需要遍历fd集合,找到对应就绪的fd。
- poll
fd数组监听的数量没有上限。整个数组拷贝到内核空间后转链表存储。
- epoll
epoll_ctl:将FD从用户空间拷贝到内核空间的红黑树中,并关联callback,当fd就绪触发callback就会把就绪的fd加入到一个专门的链表集合中。(相比于select每次都要拷贝到内核空间,epoll每个fd只需要执行一次epoll_ctl添加到红黑树中)
epoll_wait:返回就绪链表集合fd数量,并拷贝就绪的fd到用户空间。
ET模式:当FD有数据可读时,进程只会被通知一次。可以避免LT的惊群现象
LT模式:当FD有数据可读时,会重复通知多次,直至数据被处理完成。

# 信号驱动IO
用户进程和内核建立信号关联,用户进程在等待数据期间可以执行其它业务,无需阻塞等待,当数据就绪后内核会通过信号通知用户。

# 异步IO(AIO)
用户只需要发送系统调用后,进程不阻塞,等待内核等待数据、拷贝数据后发给用户处理数据信号。
# Redis网络模型
Redis核心业务部分是单线程。
Redis是纯内存操作,执行速度非常快,性能瓶颈是网络延迟而不是执行速度。多线程会导致上下文切换,带来不必要的开销;并且多线程会面临线程安全问题。
#
编辑 (opens new window)
上次更新: 2023/12/15, 15:49:57