基于四点
1.内存操作,避免了磁盘io
2.单线程处理网络请求,避免线程切换和竞争
3.多路I/O复用
4.Redis直接自己构建了VM 机制 ,一般的系统调用系统函数的话,会浪费一定的时间去移动和请求
主要说一个I/O模型
多路I/O复用具体的原理见原文链接https://blog.csdn.net/wxy941011/article/details/80274233
依赖的是epoll IO多路复用模型
epoll create的时候会建立一个evevtpoll对象,具体就是一个红黑树,一个双向链表,核心就是这两个数据结构。
epoll_ctl时,如果增加socket句柄,则检查在红黑树中是否存在,存在立即返回,不存在则添加到树干上,然后向内核注册回调函数,如果这个句柄的中断到了,就把它放到准备就绪list链表里。(比较selector模式,每次只需要去就绪链表中处理事件即可,不需要轮询整个集合)
epoll_wait时立刻返回准备就绪链表里的数据即可。
1. epoll 没有最大并发连接的限制,上限是最大可以打开文件的数目,这个数字一般远大于 2048, 一般来说这个数目和系统内存关系很大 ,具体数目可以 cat /proc/sys/fs/file-max 察看。
2. 效率提升, Epoll 最大的优点就在于它只管你“活跃”的连接 ,而跟连接总数无关,因此在实际的网络环境中, Epoll 的效率就会远远高于 select 和 poll 。
3. 内存拷贝, Epoll 在这点上使用了“共享内存 ”,这个内存拷贝也省略了,selector/poll模式需要把fd集合从用户态拷贝到内核态,去检查是否有事件发生