redis是基于单线程模型但性能却很好的原因:

  1. 纯内存操作
  2. 利用非阻塞IO多路复用机制
  3. 单线程避免了上下文切换

    建立连接

    客户端与服务端交互时必须先建立连接
    连接建立步骤:

  4. 客户端通过客户端Socket发起连接请求socket01

  5. 服务端通过ServerSocket创建AE_READABLE事件
  6. IO多路复用程序将监听到的AE_READABLE事件存入队列
  7. 文件事件分派器将监听到的事件发送给连接应答处理器
  8. 连接应答处理器创建于socket01对应的连接并将该事件与命令请求处理器进行关联

    发送命令

    客户端发送命令给服务端执行。例如set name zhangsan
    发送命令步骤:

  9. 客户端通过建立好的socket连接发送命令给服务端

  10. 服务端接收到后创建AE_READABLE事件
  11. IO多路复用程序将AE_READABLE事件存入队列
  12. 文件事件分派器将该事件发送给命令请求处理器处理(在内存中设置从socket中读取到的key和value)并将该socket的AE_WRITEABLE事件与命令回复处理器进行关联
  13. 当客户端的socket准备好接收响应时,触发AE_WRITEABLE事件
  14. IO多路复用程序将AE_WRITEABLE事件存入队列
  15. 文件事件分派器将监听到的事件发送给命令应答处理器
  16. 命令应答处理器将返回数据发送给客户端

    线程模型

    redis线程模型.png