redis网络模型

    • 用户空间和内核空间
    • IO
      • 五种IO模型
        • 阻塞IO
        • 非阻塞IO
        • IO多路复用
          • select
          • poll
          • epoll
          • web服务流程
        • 信号驱动IO
        • 异步IO
      • IO模型比较
    • redis网络模型
      • redis为什么是单线程
      • redis单线程网络模型流程

用户空间和内核空间

为安全,将用户应用和系统应用分隔开,产生用户空间和内核空间
32位操作系统,内存大小为2^32(4G)
在这里插入图片描述

IO

用户空间和内核空间各有一个缓冲区

  • 写数据:数据->用户缓冲区->内核缓冲区->写入设备
  • 读数据:设备->内核缓冲区->用户缓冲区->读出数据
    读数据时,首先要等待数据到达内核缓冲区,其次从内核缓冲区拷贝数据到用户缓冲区

五种IO模型

阻塞IO

进程阻塞,等待数据到达内核缓冲区(数据就绪)
在这里插入图片描述

非阻塞IO

多次查询数据是否就绪,立即返回结果,不阻塞线程。
多次查询并未提高进程性能,反而使得cpu使用率增加
在这里插入图片描述

IO多路复用

利用单个线程同时监听多个文件描述符FD,在某个文件就绪时得到通知,充分利用CPU,避免无效等待

select
  • 用户空间创建要监听的FD集合,将要监听的FD的对应bit位设为1。拷贝到内核空间。
  • 内核空间遍历FD集合,监听FD,阻塞等待,直到FD集合中有就绪数据,遍历FD集合,已就绪的不处理,未就绪的设为0,然后将FD集合拷贝到用户空间,覆盖原来的。此时FD集合中为1的是已就绪的,并告知共有几个问就绪。
  • 用户空间遍历集合,找到已就绪的数据
    在这里插入图片描述
poll

在这里插入图片描述

epoll
  • 用户空间epoll_create生成eventpoll,拷贝到内核空间
  • 用户空间epoll_ctl添加FD到内核空间的eventpoll的rbr中
  • FD就绪则触发callback函数,将FD添加到rdlist中
  • epoll_wait阻塞等待一段时间,检查rdlist是否有就绪数据,如果rdlist不为空,则返回rdlist的大小(就绪的文件数量)并将rdlist拷贝到用户空间,如果为空则再次epoll_wait
    在这里插入图片描述
    在这里插入图片描述
    事件通知机制:调用epoll_wait,当FD就绪,得到通知
  • LT,数据可读时,多次通知(每调用epoll_wait一次,得到一次通知)直到数据处理完成。epoll的默认模式。重复通知,效率↓。
  • ET,一次通知(第一次调用epoll_wait,得到一次通知,之后不再通知)
    eg:将rdlist拷贝到用户空间
    先将rdlist的链表指针断开,判断事件通知机制模式
    如果是ET,则开始拷贝,拷贝后删除内核空间数据,因指针断开之后rdlist为空,则下一次epoll_wait时不会通知
    如果是LT,则开始拷贝,当没有拷贝完时,恢复指针将数据连在rdlist中,下一次epoll_wait时,rdlist仍有数据,继续通知,继续读
    • ET可以手动添加回rdlist
    • LT 可以while循环,一次将数据拷贝完,无需再添加回rdlist。
      读取FD集合时,当读不到了进程会阻塞等待,直到有新的数据,所以while循环无法结束。应当采用非阻塞方式,每次读取立即返回无论是否有值
    • LT惊群现象: 数据一直存在rdlist中,每一次检查调用epoll_wait,都会显示有数据就绪,会唤醒等待的进程,多个进程都被唤醒,而然在最初的进程接收并处理完数据后,其他进程获取不到数据,所以根本无需唤醒。
web服务流程

在这里插入图片描述

信号驱动IO

当内核有FD就绪时,发出SIGIO信号通知用户。无需阻塞等待也无需轮询
在这里插入图片描述

  • 大量IO,SIGIO信号放在队列,可能导致队列溢出
  • 用户空间和内核空间频繁信号交互,效率低

异步IO

在这里插入图片描述

  • 高并发时,内核空间需要处理的数据过多,内存占用过大,系统崩溃

IO模型比较

同步异步看内核和用户空间拷贝过程
在这里插入图片描述

redis网络模型

redis为什么是单线程

核心业务部分(命令处理):单线程
核心网络模型:多线程,提高cpu利用率

  • redis,纯内存操作,快
  • 性能瓶颈为网络延迟,多线程没有帮助
  • 多线程上下文切换有开销
  • 多线程存在线程安全问题,需要引入锁,复杂度提高,性能降低

redis单线程网络模型流程

  • serverSocket注册到aeEventLoop中监听,通过aeApiPoll(epoll_wait)检查serverSocket是否可读
  • serverSocket可读,则由tcpAccpetHandler处理。得到clientSocket连接
  • clientSocket注册到eventLoop中监听,通过aeApiPoll(epoll_wait)检查clientSocket是否可读,由readQueryFromClient处理
  • 将clientSocket包装为一个client,读取数据放到client的buffer中,将buffer转为redis命令
  • 将redis命令执行结果存储在client中(需要写回client客户端),放在队列里
  • clientSocket可写时,将队列中的数据写入
    在这里插入图片描述
  • aeEventLoop到aeApiPoll == IO多路复用+事件派发
  • 从clientSocket读写数据,受网络影响——>增加多线程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/10447.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenTex 企业内容管理平台

OpenText 企业内容管理平台 将内容服务与领先应用程序集成,弥合内容孤岛、加快信息流并扩大治理 什么是内容服务集成? 内容服务集成通过将内容管理平台与处于流程核心的独立应用程序和系统连接起来,支持并扩展了 ECM 的传统优势。 最好的内…

Flutter Web 开发实践与优化

一,Flutter Web架构 目前,除了可以支持Android、iOS移动跨平台开发之外,Flutter还支持macOS、Windows、Linux和Web等多个跨平台的开发。可以说,作为一款先进的跨平台开发框架,Flutter已经真正意义上实现了“一次编写,处处运行”的美好愿景。 众所周知,Dart 语言存在之…

事件触发模式 LT ET ?EPOLLIN EPOLLOUT 各种情况总结。【面试复盘】【学习笔记】

麻了,对 epoll 的触发机制理解不深刻…面试又被拷打了… 下面总结一下各种情况,并不涉及底层原理,底层原理看这里。 文章结构可以看左下角目录、 有什么理解的不对的,请大佬们指点。 先说结论,下面再验证&#xff…

package-cli-service,为构建发布npm包提供完整的工作流

package-cli-service 介绍 package-cli-service 是一个开发环境依赖。它是一个 npm 包,局部安装在每个 create-package-tools 创建的项目中。 package-cli-service 是构建于 rollup 和 webpack 之上的。它包含了: 一个针对绝大部分 package 优化过的内…

013 - C++引用

本期我们要讲的是 C 中的引用。 上期我们讨论了指针,如果你没有看过那期内容,你一定要回去看看,因为引用实际上只是指针的扩展,你至少需要在基本层面上理解指针是如何工作的,然后才能继续学习本期的内容,本…

MySQL索引数据结构入门

之前松哥写过一个 MySQL 系列,但是当时是基于 MySQL5.7 的,最近有空在看 MySQL8 的文档,发现和 MySQL5.7 相比还是有不少变化,同时 MySQL 又是小伙伴们在面试时一个非常重要的知识点,因此松哥打算最近再抽空和小伙伴们…

Golang数据类型比较

直接使用比较的情况 分类说明是否能比较说明基本类型整型( int/uint/int8/uint8/int16/uint16/int32/uint32/int64/uint64/byte/rune等)浮点数( float32/float64)复数类型( complex64/complex128)字符串&a…

Linux查看端口

目录 1.查看已知端口的使用情况 2.查看所有端口的占用情况 3.查看占用端口的程序的进程号 4.杀死进程号 1.查看已知端口的使用情况 #例:8080 可使用命令: netstat -anp | grep 8080 结果如下: 还可以使用这条命令: netstat -tln | grep 8080 结果如下: 区别:第一条命令后面显示…

NumPy 秘籍中文第二版:十二、使用 NumPy 进行探索性和预测性数据分析

原文:NumPy Cookbook - Second Edition 协议:CC BY-NC-SA 4.0 译者:飞龙 在本章中,我们涵盖以下秘籍: 探索气压探索日常气压范围研究年度气压平均值分析最大可见度用自回归模型预测气压使用移动平均模型预测气压研究年…

爱智EdgerOS之深入解析离线下载任务

一、需求分析 在日常使用计算机的过程中,看到喜欢的资源不可避免地想把它下载到我们的设备上保存下来,比如图片,音视频资源,文档资源等,基于这种应用场景,现在来看看在爱智设备上可以如何实现呢&#xff1…

76-TCP协议,UDP协议以及区别

TCP协议,UDP协议,SCTP协议一.TCP协议1.什么是TCP协议2.TCP协议的特点3.TCP头部结构4.TCP状态转移5.TCP超时重传二.UDP协议1.什么是UDP协议2.UDP协议的特点三.TCP和UDP的区别一.TCP协议 1.什么是TCP协议 TCP(Transmission Control Protocol)协议即为传输控制协议,是一种面向连…

2023-04-12 面试中常见的数组题目

数组中的问题其实最常见 通过基础问题,掌握写出正确算法的“秘诀”巧妙使用双索引技术,解决复杂问题对撞指针- 滑动窗口 1 从二分查找法看如何写出正确的程序 本节学习重点:处理边界问题! 1.确定边界范围方法,先用区…

微服务架构-服务网关(Gateway)-权限认证(分布式session替代方案)

权限认证-分布式session替代方案 前面我们了解了Gateway组件的过滤器,这一节我们就探讨一下Gateway在分布式环境中的一个具体用例-用户鉴权。 1、传统单应用的用户鉴权 从我们开始学JavaEE的时候,就被洗脑式灌输了一种权限验证的标准做法,…

Elasticsearch:集群管理的一些建议

在之前的文章 “Elasticsearch:集群管理” ,我们对集群管理做了一些介绍。在今天的文章中,我们接着来聊一下有关配置的方面的问题。这在很大程度上取决于你的用例,是索引还是搜索繁重。 我们将在这里讨论在集群设置方面我们需要关…

Leetcode.130 被围绕的区域

题目链接 Leetcode.130 被围绕的区域 mid 题目描述 给你一个 m x n的矩阵 board,由若干字符 X和 O,找到所有被 X围绕的区域,并将这些区域里所有的 O用 X填充。 示例 1: 输入:board [[“X”,“X”,“X”,“X”],[“X…

「Cpolar」使用Typecho搭建个人博客网站【内网穿透实现公网访问】

💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后端的开发语言A…

在 Python 中计算两个数字之间的百分比

要计算两个数字之间的百分比,请将一个数字除以另一个数字,然后将结果乘以 100,例如 (30 / 75) * 100。这显示第一个数字占第二个数字的百分比。 在示例中,30 是 75 的 40%。 def is_what_percent_of(num_a, num_b):return (num_a…

基于SVG的HMI组件

人机界面是自动化领域不可或缺重要组成部分。人机界面系统的设计看上去并没有太大的技术门槛,但是设计一个HMI系统的工作量是巨大的,如果你没有足够的耐心和精力是难以完成一个通用HMI系统的。构建UI控件库就是一个似乎永远完不成的事情,用户…

Halo博客建站实战以及问题汇总

目录 简介 特性 快速开始 安装步骤 环境准备 Docker-compose方式部署 问题汇总 mac端无法访问页面 页面登录提示账号密码错误 重装注意点 资料 官方文档 简介 Halo 强大易用的开源建站工具 特性 代码开源 我们的所有代码开源在 GitHub 上且处于积极维护状态&…

《分解因数》:质因数分解

目录 一、题目&#xff1a; 二、思路&#xff1a; 三、代码&#xff1a; 一、题目&#xff1a; 分解因数 《分解因数》题目链接 所谓因子分解&#xff0c;就是把给定的正整数a&#xff0c;分解成若干个素数的乘积&#xff0c;即 a a1 a2 a3 ... an,并且 1 < a1…
最新文章