redis:八、redis线程相关和I/O多路复用模型

redis线程相关

redis是单线程的,为什么还这么快?

  • Redis是纯内存操作,执行速度非常快
  • 采用单线程,避免不必要的上下文切换可竞争条件,多线程还要考虑线程安全问题
  • 使用I/O多路复用模型,非阻塞IO

I/O多路复用模型

这部分黑马讲得不好,建议看别的视频。

用户空间和内核空间

Linux系统中一个进程使用的内存情况划分两部分:内核空间、用户空间

  • 用户空间只能执行受限的命令(Ring3),而且不能直接调用系统资源,必须通过内核提供的接口来访问
  • 内核空间可以执行特权命令(Ring0),调用一切系统资源

Linux系统为了提高IO效率,会在用户空间和内核空间都加入缓冲区:
写数据时,要把用户缓冲数据拷贝到内核缓冲区,然后写入设备
读数据时,要从设备读取数据到内核缓冲区,然后拷贝到用户缓冲区
redis:八、redis线程相关和I/O多路复用模型_第1张图片
所以要提升效率,就从两方面改进:

  1. 减少用户空间等待数据就绪的时间
  2. 减少整个过程中读写数据的时间

IO模型(linux系统)

阻塞IO

redis:八、redis线程相关和I/O多路复用模型_第2张图片

非阻塞IO

redis:八、redis线程相关和I/O多路复用模型_第3张图片

IO多路复用

IO多路复用是利用单个线程来同时监听多个Socket ,并在某个Socket可读、可写时得到通知,从而避免无效的等待,充分利用CPU资源。不过监听Socket的方式、通知的方式又有多种实现,常见的有:

  • select
  • poll
  • epoll

其中,select和poll只会通知用户进程有Socket就绪,但不确定具体是哪个Socket ,需要用户进程逐个遍历Socket来确认。
epoll则会在通知用户进程Socket就绪的同时,把已就绪的Socket写入用户空间。
现在多使用改良的epoll。

redis:八、redis线程相关和I/O多路复用模型_第4张图片

redis的网络模型(redis中的IO多路复用)

redis:八、redis线程相关和I/O多路复用模型_第5张图片

相关面试题

能解释一下I/O多路复用模型?

候选人:嗯~~,I/O多路复用是指利用单个线程来同时监听多个Socket ,并在某个Socket可读、可写时得到通知,从而避免无效的等待,充分利用CPU资源。目前的I/O多路复用都是采用的epoll模式实现,它会在通知用户进程Socket就绪的同时,把已就绪的Socket写入用户空间,不需要挨个遍历Socket来判断是否就绪,提升了性能。

其中Redis的网络模型就是使用I/O多路复用结合事件的处理器来应对多个Socket请求,比如,提供了连接应答处理器、命令回复处理器,命令请求处理器;

在Redis6.0之后,为了提升更好的性能,在命令回复处理器使用了多线程来处理回复事件,在命令请求处理器中,将命令的转换使用了多线程,增加命令转换速度,在命令执行的时候,依然是单线程。

你可能感兴趣的:(redis,redis,数据库,缓存,java,面试,后端)