Redis—线程模型

文件事件:Redis服务器通过套接字和客户端进行连接,文件事件就是服务器对接套接字操作的抽象。服务器和客户端的通信会产生相应的文件事件,服务器通过监听并处理这些事件来完成通信。

Redis基于Reactor模式开发的事件处理机制,被称为文件事件处理器。由套接字、I/O多路复用程序、文件事件分派器(dispatcher),事件处理器组成。

IO多路复用程序同时监听多个socket,当被监听的socket准备好执行accep、read、write、close等操作时,与这些操作对应的文件事件就会产生。

IO多路复用程序会将这些事件的socket压入一个队列中,然后有序地每次仅一个socket的方式传送给文件事件分派器。

文件事件分派器接收到socket之后会根据socket产生的事件类型调用对应的事件处理器(即处理函数)进行处理。

事件的类型

IO多路复用程序监听多个套接字的ae.h/AE_READABLE事件和ae.h/AE_WRITABLE事件。

AE_READABLE事件:当套接字变得可读时(客户端对套接字执行write操作,或者执行close操作),或者有新的可应答套接字出现时(客户端对服务器的监听套接字执行了connect操作)

AE_WRITABLE事件:当套接字变得可写时(客户端对套接字执行read操作)

文件事件处理器

  • 连接应答处理器:用于处理客户端的连接请求,连接处理函数acceptTCPHandler;

当Redis服务器初始化的时候,程序会将这个连接应答处理器和服务器监听套接字的AE_READABLE事件关联,当有客户端连接套接字的时候,服务端套接字就会产生AE_READABLE时间,引发连接应答处理器执行,并执行相应的套接字应答操作。

  • 命令请求处理器:用于执行客户端传递过来的命令,请求处理函数readQueryFromClient;

当客户端成功连接服务器后,服务器会将客户端套接字的AE_READABLE事件和命令请求处理器关联,当客户端向服务器发送命令请求时,套接字就会产生AE_READABLE事件,引发命令请求处理器执行,并执行相应的套接字读入操作。

  • 命令回复处理器:用于返回客户端命令的执行结果,回复处理函数sendReplyToClient;

当服务器有命令回复需要传送给客户端时,服务器会将客户端套接字的AE_WRITABLE事件和命令回复处理器关联,当客户端准备好接收服务器响应时,就会产生AE_WRITABLE事件,引发命令回复处理器执行,并执行相应的套接字写入操作。

客户端和服务器通信过程 

Redis客户端对服务端的每次调用都经历了发送命令,执行命令,返回结果三个过程。由于事件处理机制是单线程进行的,所有的命令都会进入一个队列中,然后逐个被执行。

6.0之后多线程模型

  • 主线程获取 socket 放入等待列表
  • 将 socket 分配给各个 IO 线程(并不会等列表满)

  • 主线程阻塞等待 IO 线程(多线程)读取 socket 完毕

  • 主线程执行命令 - 单线程(如果命令没有接收完毕,会等 IO 下次继续)

  • 主线程阻塞等待 IO 线程(多线程)将数据回写 socket 完毕(一次没写完,会等下次再写)

  • 解除绑定,清空等待队列

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值