1. Redis单线程单Reactor网络模型
1.1 redis单线程里不能执行十分耗时的流程,不然会客户端响应不及时
解决方法一:
beforesleep里删除过期键操作若存在大量过期键时,会耗费大量时间,redis采用的策略之一就是采用timelimit方案超过阈值就退出下次循环再来处理
解决方法二:
beforesleep里待发给客户端数据太多未发完时不会阻塞在这会创建写文件时间在文件事件流程里发送
解决方法三:
开启TCP_NODELAY提高tcp响应速度,否则发送小包数据时得等200ms超时才会发送
解决方法四:
可开启SO_KEEPALIVE长连接减少不必要的连接建立和销毁过程增加响应速度
1.2 redis单线程里不能执行十分耗时的流程,不然会定时任务执行不及时
解决方法:
在处理文件事件前会查找最近时间事件作为epoll_wait超时依据来确保下一个循环能在定时事件时间到达时及时执行
2. memcached多reactor多线程网络模型
2.1 工作线程分发策略
主线程接收到新client时,会均匀分发到每个线程,算法比较简单,每次记录上次使用的线程,下一次放到此线程下个线程来保证一定的公平性。
我在其他源码也看到过一种分发策略:根据每个线程里的的活跃连接数并且给每个线程设定一个上限连接数,达到80%时就不在接收新连接;优先将连接分给其他活跃连接更少的线程。
2.2 管道–主线程唤醒工作线程的桥梁
主线程接收到新连接后,通过策略计算出工作线程号后,会向该线程里的管道写段写入’c’,工作线程使用的libevent一直在关注管道读端的事件,一旦主线程写入后工作线程管道读端的事件就会就绪,这时工作线程被唤醒,由工作线程去处理读写任务
3. Nginx多进程网络模型
待完善