Redis 是以 socket 方式通信, socket 服务端可同时接受多个客户端请求连接, 也就是说, Redis 服务同时面对多个 Redis 客户端连接请求, 而 Redis 服务本身是单线程运行.
假设, 现在有 A,B,C,D,E 五个客户端同时发起 Redis 请求, A 优先稍微一点点第一个到达, 然后是 B,C,D,E 依次到达, 此时 Redis 服务端开始处理 A 请求, 建立连接需要 30 秒, 获取请求数据需要 10 秒, 然后处理数据需要 0.1 秒, 回送数据给客户端需要 5 秒, 总共大概需要 45 秒. 也就是说, 下一个 B 请求需要等待 45 秒, 这里注意, 也许这五个几乎同时请求, 由于 socket 可以同时处理多个请求, 所以建立网络连接阶段时间差可忽略, 但是在第二阶段, 服务端需要什么事都不干, 坐等 10 秒中, 对于 CPU 和客户端来说是无法忍受的. 所以说单线程效率非常, 非常低, 但是正是因为这些类似问题, Redis 单线程本质上并不是如此运行. 接下来讨论 Redis 真正的单线程运行方式.
客户端与服务端建立连接交由 socket, 可以同时建立多个连接 (这里应该是多线程 / 多进程), 建立的连接 Redis 是知道的 (为什么知道, 去看 socket 编程, 再次强调基础很重要), 然后 Redis 会基于这些建立的连接去探测哪个连接已经接收完了客户端的请求数据 (注意: 不是探测哪个连接建立好了, 而是探测哪个接收完了请求数据), 而且这里的探测动作就是单线程的开始, 一旦探测到则基于接收到的数据开始数据处理阶段, 然后返回数据, 再继续探测下一个已经接收完请求数据的网络连接. 注意, 从探测到数据处理再到数据返回, 全程单线程. 这应该就是所谓的 Redis 单线程. 至于内部有多复杂我们无需关心, 我们追求的是理解流程, 苛求原理, 但不能把内脏都挖出来.
来源: http://www.bubuko.com/infodetail-2971881.html