Redis服务器如何发送回复内容给客户端
2017-08-15 16:50
495 查看
Redis采用了事件驱动框架,根据文件事件及时间事件来处理逻辑。
读事件的逻辑好理解:客户端连接上服务器后,服务器调用accepttcphandle创建一个client,同时使用该client注册一个将该fd的可读事件与readQuery处理器绑定起来。当客户端发布命令后通过网络传输到redis-server后,内核向用户空间抛出可读事件,readQuery被调用。
问题来了,readQuery执行后,可能会有需要返回给客户端的数据,这个数据如何返回呢?即server如何发送数据给客户端。根据redis的设计,我原本以为redis-server注册了一个可写事件,再绑定一个类似于writeHandler之类的处理器来写缓冲,看了源码,发现并不是这样。
redis-server针对每个已经连接上的client维护了一个输出缓冲,用于缓存需要回复给client的内容。每次执行一个命令,如果产生了需要回复给客户端的内容就调用AddReply*相关的接口写到client的buf当中,然后在后续调用handleClientsWithPendingWrites()集中处理所有客户端的回复。在这个接口里面实际执行了write来将buf当中的内容写到网卡里,发给客户端,中间调用的是writeToClient,这个函数持续写数据,直到数据写完。
读事件的逻辑好理解:客户端连接上服务器后,服务器调用accepttcphandle创建一个client,同时使用该client注册一个将该fd的可读事件与readQuery处理器绑定起来。当客户端发布命令后通过网络传输到redis-server后,内核向用户空间抛出可读事件,readQuery被调用。
问题来了,readQuery执行后,可能会有需要返回给客户端的数据,这个数据如何返回呢?即server如何发送数据给客户端。根据redis的设计,我原本以为redis-server注册了一个可写事件,再绑定一个类似于writeHandler之类的处理器来写缓冲,看了源码,发现并不是这样。
redis-server针对每个已经连接上的client维护了一个输出缓冲,用于缓存需要回复给client的内容。每次执行一个命令,如果产生了需要回复给客户端的内容就调用AddReply*相关的接口写到client的buf当中,然后在后续调用handleClientsWithPendingWrites()集中处理所有客户端的回复。在这个接口里面实际执行了write来将buf当中的内容写到网卡里,发给客户端,中间调用的是writeToClient,这个函数持续写数据,直到数据写完。
相关文章推荐
- 服务器或者客户端异常退出,其相应的客户端或者服务器如何来判断是在等待发送还是退出?
- 客户端如何向https服务器发送数据
- RTSP 测试,模拟客户端收到服务器发送过来的RTP流,自动回复了ICMP消息,谁知道这个消息是干啥的???能不能不回复ICMP消息呢
- 人生苦短,我学python之服务器如何返回一个文件内容到客户端
- .net服务器向j2me客户端发送字节流,在穿过cmwap网­关时字节流的内容发生变化,为什么?
- 客户端程序利用数据输出流out,将文本框中的内容发送给服务器
- .net服务器向j2me客户端发送字节流,在穿过cmwap网-关时字节流的内容发生变化,为什么?
- oracle客户端如何连接服务器(第三次上机)
- HTTP协议语意 客户端如何请求服务器资源,HTTP方法列表(读RESTful webApi笔记)
- 微信公众平台开发[10]-开发模式-高级功能-将图片、视频、音频I内容上传到微信服务器并发送给用户
- log4j通过SocketAppender将日志内容发送到远程服务器
- 如何使用HttpClient来发送带客户端证书的请求,以及如何忽略掉对服务器端证书的校验
- Delphi中如何进行HTTP编程,比如:发送一个XML文件给服务器?
- WEB客户端发送给WEB服务器的HTTP请求消息分为三个部分:
- 如何判断本客户端 SOCKET 与服务器 之间的连接状态.
- C#/VB.NET 操作Word批注(二)——如何插入图片、读取、回复Word批注内容
- TCP客户端向路由器发送协议并显示回送内容、附带源码
- 如何使用C#在发送往client的内容上加js代码
- 互联网工作原理(6. 客户端/服务器架构是如何工作的)
- 如何解决阿里云服务器使用phpmail发送邮件超时的问题(针对qq企业邮箱)