Redis 为什么会出现阻塞?

1. 介绍

Redis是基于reactor模式的一种事件驱动框架。

2. 事件分类

文件事件: 读事件,写事件

时间事件: 定时事件,周期性事件 

3. 文件事件

连接事件:客户端连接到服务端,连接关闭等

读写事件:socket读写

4.事件处理器

不同的事件对应不同的事件处理器,由事件分发器分派

digraph {      label = "\n 图 IMAGE_CONSTRUCT_OF_FILE_EVENT_HANDLER    文件事件处理器的四个组成部分";      rankdir = LR;      node [shape = box];      subgraph cluster_sockets {          style = dashed          label = "套接字";          c1 [label = "s1", shape = circle];         c2 [label = "s2", shape = circle];         other_client [label = "...", width = 1.1, shape = plaintext];         c3 [label = "sN", shape = circle];      }      io_multiplexing [label = "I\n/\nO\n多\n路\n复\n用\n程\n序"];      file_event_processor [label = "文\n件\n事\n件\n分\n派\n器"];      subgraph cluster_handlers {          style = dashed          label = "事件处理器";          write_handler [label = "命令请求处理器"];          read_handler [label = "命令回复处理器"];          connect_handler [label = "连接应答处理器"];          other_handlers [label = "...", width = 1.6];      }      c1 -> io_multiplexing;     c2 -> io_multiplexing;     other_client -> io_multiplexing [style = invis];     c3 -> io_multiplexing;      io_multiplexing -> file_event_processor;      file_event_processor -> write_handler;     file_event_processor -> read_handler;     file_event_processor -> connect_handler;     file_event_processor -> other_handlers; }

说明:

IO多路复用一般借助操作系统自带的select或epoll等功能来实现

事件处理器包括请求处理器,回复处理器,应答处理器等

5.文件事件的 源头

文件事件是对套接字操作的抽象, 每当一个套接字准备好执行连接应答(accept)、写入、读取、关闭等操作时, 就会产生一个文件事件。 因为一个服务器通常会连接多个套接字, 所以多个文件事件有可能会并发地出现。 

6. redis出现阻塞的原因

I/O 多路复用程序负责监听多个套接字, 并向文件事件分派器传送那些产生了事件的套接字。

尽管多个文件事件可能会并发地出现, 但 I/O 多路复用程序总是会将所有产生事件的套接字都入队到一个队列里面, 然后通过这个队列, 以有序(sequentially)、同步(synchronously)、每次一个套接字的方式向文件事件分派器传送套接字: 当上一个套接字产生的事件被处理完毕之后(该套接字为事件所关联的事件处理器执行完毕), I/O 多路复用程序才会继续向文件事件分派器传送下一个套接字, 如图 IMAGE_DISPATCH_EVENT_VIA_QUEUE 。

原因

1. redis采用单线程处理请求

2. reactor模型是同步IO,需要等待命令执行完成,才会返回结果,然后进入下一次执行过程 

3. 一旦某个客户端的某个命令执行时间很长,就会阻塞其他客户端

发布了210 篇原创文章 · 获赞 105 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/u010627840/article/details/103879412