zoukankan      html  css  js  c++  java
  • Redis中的IO多路复用机制

    引言

    提起Redis,我们经常会说其底层是一个单线程模型,但这是不严谨的。Redis 单线程指的是网络请求模块使用了一个线程,即一个线程处理所有网络请求,其他模块该使用多线程,仍会使用了多个线程。既然是单线程模型,那么CPU不是Redis的瓶颈。Redis的瓶颈最有可能是机器内存或者网络带宽

    Redis中的单线程模型

    Redis基于Reactor模式开发了自己的网络事件处理器,称之为文件事件处理器(File Event Hanlder)。文件事件处理器由SocketIO多路复用程序、文件事件分派器(dispather),事件处理器(handler)四部分组成。关于IO多路复用的相关知识,这方面可以参考我之前的一篇文章,这里就不多解释了。文件事件处理器的模型如下所示:

    image-20200820212146572

    IO多路复用程序会同时监听多个socket,当被监听的socket准备好执行acceptreadwriteclose等操作时,与这些操作相对应的文件事件就会产生。IO多路复用程序会把所有产生事件的socket压入一个队列中,然后有序地每次仅一个socket的方式传送给文件事件分派器,文件事件分派器接收到socket之后会根据socket产生的事件类型调用对应的事件处理器进行处理。

    文件事件处理器分为几种:

    • 连接应答处理器:用于处理客户端的连接请求;
    • 命令请求处理器:用于执行客户端传递过来的命令,比如常见的setlpush等;
    • 命令回复处理器:用于返回客户端命令的执行结果,比如setget等命令的结果;

    事件种类:

    • AE_READABLE:与两个事件处理器结合使用。
      • 当客户端连接服务器端时,服务器端会将连接应答处理器与socketAE_READABLE事件关联起来;
      • 当客户端向服务端发送命令的时候,服务器端将命令请求处理器与AE_READABLE事件关联起来;
    • AE_WRITABLE:当服务端有数据需要回传给客户端时,服务端将命令回复处理器与socketAE_WRITABLE事件关联起来。

    Redis的客户端与服务端的交互过程如下所示:

    image-20210917160156402

    参考

    Redis 为什么这么快?

    Redis为什么是单线程?

  • 相关阅读:
    QOMO Linux 4.0 正式版发布
    LinkChecker 8.1 发布,网页链接检查
    pgBadger 2.1 发布,PG 日志分析
    Aletheia 0.1.1 发布,HTTP 调试工具
    Teiid 8.2 Beta1 发布,数据虚拟化系统
    zLogFabric 2.2 发布,集中式日志存储系统
    开源电子工作套件 Arduino Start Kit 登场
    Piwik 1.9 发布,网站访问统计系统
    Ruby 1.9.3p286 发布,安全修复版本
    toBraille 1.1.2 发布,Java 盲文库
  • 原文地址:https://www.cnblogs.com/reecelin/p/13538382.html
Copyright © 2011-2022 走看看