Redis线程模型

彻底搞懂Redis的线程模型
了解redis的单线程模型工作原理

Redis线程模型_第1张图片
image.png

Redis线程模型_第2张图片
image.png

文件事件处理器

Redis基于Reactor模式开发了网络事件处理器,这个处理器被称为文件事件处理器。它的组成结构为4部分:多个套接字、IO多路复用程序、文件事件分派器、事件处理器。因为文件事件分派器队列的消费是单线程的,所以Redis才叫单线程模型。因此Redis是不存在并发问题的。

消息处理流程

  • 文件事件处理器使用I/O多路复用(multiplexing)程序来同时监听多个套接字,并根据- 套接字目前执行的任务来为套接字关联不同的事件处理器。
  • 当被监听的套接字准备好执行连接应答(accept)、读取(read)、写入(write)、关闭(close)等操作时,与操作相对应的文件事件就会产生,这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件。

redis客户端对服务端的每次调用都经历了发送命令,执行命令,返回结果三个过程。其中执行命令阶段,由于Redis是单线程来处理命令的,所有每一条到达服务端的命令不会立刻执行,所有的命令都会进入一个队列中,然后逐个被执行。并且多个客户端发送的命令的执行顺序是不确定的。但是可以确定的是不会有两条命令被同时执行,不会产生并发问题,这就是Redis的单线程基本模型。

高性能原因

1、纯内存访问,速度快
2、采用非阻塞I/O多路复用(用单线程高效的处理多个连接请求,基于事件驱动非阻塞)
3、单线程模型,避免了多线程上下文切换
4、持久化异步处理

6.0多线程版本线程模型

Redis线程模型_第3张图片
image.png

Redis线程模型_第4张图片
image.png

流程:
主线程负责接收建连请求,读事件到来(收到请求)则放到一个全局等待读处理队列
主线程处理完读事件之后,通过 RR(Round Robin) 将这些连接分配给这些 IO 线程,然后主线程忙等待(spinlock 的效果)状态
IO 线程将请求数据读取并解析完成(这里只是读数据和解析并不执行)
主线程执行所有命令并清空整个请求等待读处理队列(执行部分串行)
上面的这个过程是完全无锁的,因为在 IO 线程处理的时主线程会等待全部的 IO 线程完成,所以不会出现 data race 的场景。

特点:
1、IO 线程要么同时在读 socket,要么同时在写,不会同时读或写
2、IO 线程只负责读写 socket 解析命令,不负责命令处理

你可能感兴趣的:(Redis线程模型)