本系列主要是为了对redis的网络模型和集群原理进行学习,我会用golang实现一个reactor网络模型,并实现对redis协议的解析。
系列源码已经上传github
https://github.com/HobbyBear/tinyredis/tree/chapter2
redis 网络模型
在介绍redis网络模型前,我们先来看看redis的一条命令执行涉及到哪些阶段。
从连接读取数据 => 协议解析 => 命令执行 => 将结果返回给客户端
而平时我们说的redis的单线程指的则是 命令执行阶段是单线程的,而redis6.0以后协议解析和返回结果给客户端都可以是多线程去进行处理。
由此衍生出redis6.0的网络模型如下:
主线程通过一个epoll实例负责监听连接和等待数据的到达,并且执行解析好的命令。
举个例子,当主线程执行epoll wait时发现有100个socket可读,并且这100个socket都是已经完成连接建立的socket,然后主线程就会把这100个socket分给子线程去进行读取, 当子线程将这些socket的 字节数据解析成redis命令后,会再把这些命令交再给主线程去执行。主线程执行完以后又将这些命令执行结果交给子线程去进行发送。
整个过程可以看到实际的网络io的读取是交给多个线程去执行了,但是命令的执行还是在一个线程完成的。
再用流程图去表示整个过程将会更加清晰,
可以看见,整个过程中命令执行是在主线程去顺序执行的。而现在我们就是要用golang去实现这样一个模型。