等待连接不再占着线程
连接是否可读由操作系统统一通知。Redis 可以管理大量连接,而不必为每条暂时无事可做的连接保留执行线程。
Redis · Event Loop Lab
把业务连接送进就绪队列,然后逐步观察 Redis 如何读取请求、执行命令、写回响应。让一个命令故意变慢,你会看到后面的请求不是“并行赶工”,而是在队列里继续等。
I/O 多路复用负责同时观察许多连接,只把“有数据可读或可写”的连接交给事件循环;它省掉了“每个等待连接配一条线程”的成本,却没有把命令执行变成并行。
操作系统同时观察这些连接。连接没数据时,Redis 不需要让五条线程各自堵在读取操作上。
连接有数据可读后才进入这里。排在队首的请求获得下一次执行机会。
事件循环一次只推进一个请求。手动运行时,每次点击推进一个阶段。
等待就绪请求
观察:主线程空闲。把连接加入就绪队列后开始运行。
响应写回客户端后,请求离开本轮事件循环。
连接是否可读由操作系统统一通知。Redis 可以管理大量连接,而不必为每条暂时无事可做的连接保留执行线程。
连接进入就绪队列,并不等于命令已经开始。只有拿到唯一执行位,请求才会进入读取、执行和写回阶段。
一条命令长时间占据主线程,后面的请求即使命令本身很快,也只能等待。这正是生产环境要警惕大 Key 和重计算命令的原因。