Redis03——线程模型

155 阅读2分钟

Redis的工作线程是单线程的,单线程指网络IO键值对读写一个线程完成,其他功能,如持久化异步删除集群同步依赖其他线程执行;

优点单线程可以简化数据结构和算法的实现,并且可以避免线程切换竞争造成的消耗;

缺点:如果某个命令执行的时间过长,会造成其他命令的阻塞;

单线程的IO模型多线程IO

Redis采用了IO多路复用机制,可以并发处理大量的请求。

6.x以前流程:

IO多路复用是一种同步IO模型,实现一个线程监视多个文件句柄;有就绪的文件句柄则会通知程序进行读写操作;没有就绪的文件句柄会阻塞程序,交出cpu。

使用**IO多路复用程序监听socket的状态**,底层通过操作系统的epoll等系统调用获取有读写事件套接字列表放入套接字队列,由主线程对每个请求进行读、计算、输出。

处理过程:文件事件分派器读取套接字队列的请求逐个处理,由不同的事件处理器处理对应的请求。

image-20220407122311729

6.x以后

网络IO是Redis的性能瓶颈之一,把网络IO做成多线程处理,会大大提升Redis的性能

不同在于:Redis中有单线程的工作线程和多线程的IO线程

主线程从epoll系统调用获取套接字列表放入套接字队列并将socketIO线程组的线程绑定套接字队列满了后,IO线程组并行读取socket的请求,请求读取完毕后,主线程执行所有请求命令,将执行结果写入缓冲区,命令执行完毕后,IO线程将结果并行写入对应的socket,再解绑。

优点:缩短执行时间提高吞吐量充分利用网卡资源

多线程IO流程:

img

流程:

  1. 主线程获取 socket 放入等待列表
  2. 将 socket 分配给各个 IO 线程(并不会等列表满)
  3. 主线程阻塞等待 IO 线程读取 socket 完毕
  4. 主线程以单线程执行命令 (如果命令没有接收完毕,会等 IO 下次继续)
  5. 主线程阻塞等待 IO 线程将数据回写 socket 完毕(一次没写完,会等下次再写)
  6. 解除绑定,清空等待队列