后端开发【干货知识】—Redis,Memcached,Nginx 网络组件
reator 网络编程
epoll 被称为事件管理器,利用管理器去管理多个连接。
关闭读端 read = 0
关闭写端 write = -1 && errno =EPIPE
![](https://static001.geekbang.org/infoq/79/79ee1e5dd7b020f8f1c7a0f71aa9bc2e.png)
![](https://static001.geekbang.org/infoq/7e/7e882bcf031190c3832858fdf0d1ff72.png)
![](https://static001.geekbang.org/infoq/37/37fda56406d18cbbbca3643a61796e15.png)
io 函数像 read 只能检测一个 fd 对应的状态,可以检测具体的状态。
io 多路复用可以检测多个 fd 对应的状态,只能检测可读,可写,错误,断开笼统等信息。
getsockopt 也可以检测错误。
阻塞 IO 和 非阻塞 IO
阻塞在网络线程
连接的 fd 阻塞属性决定了 io 函数是否阻塞
具体差异在:io 函数在数据未到达时是否立刻返回。
![](https://static001.geekbang.org/infoq/2c/2cca1e42f2bc166755771449ea7bcc79.png)
![](https://static001.geekbang.org/infoq/0e/0efa9e563f043b135e7c679c6f9b1f6d.png)
![](https://static001.geekbang.org/infoq/bb/bb737cfbb9b596414e74167f002176fc.png)
timeout == 0 是非阻塞效果,检测一下立即返回。
timeout == -1 是永久阻塞
timeout == 1000
![](https://static001.geekbang.org/infoq/c1/c1034940c99e61e649b12dbdb0f9b046.png)
![](https://static001.geekbang.org/infoq/e5/e54b18db1625aa8a66136195e4f95792.png)
C++开发学习地址:C/C++Linux服务器开发高级架构师/Linux后台架构师
想学习 C++工程化、高性能及分布式、深入浅出。性能调优、TCP,协程,Nginx 源码分析 Nginx,ZeroMQ,MySQL,Redis,MongoDB,ZK,Linux 内核,P2P,K8S,Docker,TCP/IP,协程,DPDK 以下视频学习资料有需要的可以点击:C++架构师学习资料 进去自取
![](https://static001.geekbang.org/infoq/2f/2f39b0e4fc71c07b718facc4fc0b23a2.png)
epoll_create 会去创建红黑树和就绪队列。
epoll_ctl 会去注册事件,会建立回调关系。当事件被触发,epoll_ctl 会将 fd 从红黑树中放到就绪队列。
![](https://static001.geekbang.org/infoq/26/26f1e2e982c19e96cf2eabec4cc591dd.png)
![](https://static001.geekbang.org/infoq/f6/f63667763dacf921e0b34b569c293031.png)
问:代码第 9 行能不能监听写事件?
答:不能,因为刚开始的时候,写缓冲区是空的,会被一直触发可写。
编程细节,返回值以及错误码
![](https://static001.geekbang.org/infoq/8a/8afe02d849bc72aadafeb0604d37e72a.png)
读端关闭了。
![](https://static001.geekbang.org/infoq/6f/6fcda8aa6fe0c242c20d0d7cfa643b7b.png)
建议 read()函数使用非阻塞 io,因为出现错误会立刻返回,不会卡在这里影响别人。
![](https://static001.geekbang.org/infoq/8c/8c1236fe23679ec7c76c0e0a0ef90dbd.png)
将数据写到缓冲区,协议栈会将数据发送到对端。
redis、nginx、memcached reactor 具体使用
![](https://static001.geekbang.org/infoq/79/79ade598b578ce5bebb99a0a56438ec8.png)
![](https://static001.geekbang.org/infoq/ab/ab2f412fe2444b4e2d7b7255c6a72f2b.png)
![](https://static001.geekbang.org/infoq/9c/9c21225f713d2f74e414ab8b80c911f2.png)
redis-6.0 支持 IO 多线程,封装在 networking.cz 中。
![](https://static001.geekbang.org/infoq/41/41a9c59523c6fc20146aac6c38e09ea4.png)
参考资料
推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习
评论