redis网络模型

news2024/11/20 11:46:23

    • 用户空间和内核空间
    • 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.coloradmin.cn/o/418695.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

thanos prometheus 的高可用、长期存储二进制部署

1.简介 http://thanos.io/ thanos 是具有长期存储功能的开源、高可用性 Prometheus的集群组件。 全局查询视图 跨多个 Prometheus 服务器和集群查询指标 无限保留 使用对象存储扩展系统,不限时间保留指标。 Prometheus兼容 兼容 Prometheus api,用于…

我在windows10下,使用msys64 mingw64终端

系列文章目录 文章目录系列文章目录前言一、MSYS2是什么?前言 msys2官网 MSYS2 (Minimal SYStem 2) 是一个MSYS的独立改写版本,主要用于 shell 命令行开发环境。 同时它也是一个在Cygwin (POSIX 兼容性层&#xff09…

软件测试简历如何编写?还在乱写?精细优化让自己脱颖而出......

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 简历是我们向面试官…

教育大数据总体解决方案(6)

触控录播主机集成视频编码、实时导播、音频处理、图像跟踪、电子云台等功能,无需额外的辅助跟踪设备。支持5路视频信号的采集录制、画面自动跟踪及全自动/半自动导播切换,让教师免于分心调控,专注于课堂教学。 整机采取一体化设计及三合一按键…

【数据结构与算法】栈和队列(StackQueue)

TOC 数据结构—栈 栈的概念 要想学习一个东西,概念是一定要看并且理解的,那么栈是个什么玩意呢? 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#x…

v851s g2d 模块 sample 深究

1. g2d 模块概述 g2d 主要功能: 1)旋转:支持90、180、270旋转; 2)镜像反转:H / V; 3) scale:放缩 4)格式转换:yuv 转 rgb 等,多种格式相互间转换; 5)透明叠加功能:实现两个rgb图片叠加; 6)矩形填充,等诸多功能; 2. g2d 配置 1)源码目录:tina-v853-docker/…

Zabbix自定义监控mysql数据库、自动注册服务器及部署代理服务器

目录 一、zabbix自定义监控数据库 1、编写监控脚本 2、服务端测试 3、web页面配置 ①创建自定义监控项 ②创建触发器 ③创建图形 ④测试自定义监控是否成功 二、zabbix自动注册 1、什么是自动注册 2、环境准备 3、 zabbix客户端配置 4、web页面配置自动注册 5、…

Windows系统生产力工具介绍

介绍 本文主要介绍在windows系统上如何安装一些常用的生产力软件,这些软件大多数都是开源免费使用的,包括markdown编辑器、知识管理软件、图片和视频工具、系统工具等,以及程序员专用的开发工具。根据本人的使用经验,将会不定期更…

OpenGL之深入解析屏幕成像和渲染原理

一、CPU 与 GPU CPU 内部组成:GPU 内部组成(ALU:算术逻辑单元,是能实现多组算术运算和逻辑运算的组合逻辑电路):CPU 和 GPU 因为设计之初需求就不一样,所以它们的组成不同,在计算机中的分工也不同。可以看到,GPU 有更多的 ALU,而 CPU 有 Control 单元和 Cache 单元,…

TensorFlow 深度学习第二版:6~10

原文:Deep Learning with TensorFlow Second Edition 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 深度学习 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 不要担心自己的形象,只…

金融风险计量:数据平滑方法及逆平滑分析

摘要及声明 1:本文从风险分析的角度简单介绍数据平滑方式,重点介绍低频数据的逆平滑分析; 2:本文主要数据通过爬虫获取; 3:模型实现基于python3.8; 处理金融数据时我们经常会遇到有噪音的数…

规模化敏捷框架:Spotify

Spotify 是全球最大、最受欢迎的流媒体音乐服务平台,预估用户总量已达2.86亿。Spotify 取得成功的一个关键因素就在于公司采用了一个独特方法: 围绕工作任务进行组织构建以提高团队敏捷性。Spotify 工程团队把提高团队敏捷性的经验记录了下来,并把经验分…

Java web学习记录(二)数据库的使用

学习Java web的前置条件就是数据库,只有学了数据库才能更好的处理网站应用产生的数据。 初识数据库 数据库(Database)顾名思义就是一个存储数据的仓库,通过它就可以直接查找到你想要的数据,举个简单的例子&#xff0…

IPSEC实验(IPSECVPN点到点,DSVPN,IPSECVPN旁挂)

目录一、复现实验1、防火墙的IPSECVPN点到点实验-1,拓扑图的搭建-2,配置IP,开通ping,并且设置策略-3,在网络中的IPSEC进行配置第一阶段:发出的UDP500流量第二阶段 发出的ESP流量二台防火墙建立策略禁用其它策略,在IPSEC上配置策略…

系统应满足的性能指标计算及系统性能衡量

根据运营数据计算系统应该满足的性能指标 计算正常业务操作(稳定性测试)的并发量 计算峰值业务操作(压力测试)的并发量 如何进行并发数计算(稳定性测试和压力测试) 使用阶梯线程组自定义模拟用户数量。 …

前端开发工具-Visual Studio Code-插件下载-迁移到新电脑

背景 前端使用的开发工具一般是Visual Studio Code,很多辅助功能,比如字体高亮、单词拼写检查、预览图片等需要安装插件。但是插件在原来的电脑,不想下载或者自己是新人,想迁移同事的插件,或者新电脑没有外网。 以下…

手把手教学在windows系统上将pytorch模型转为onnx,再转为ncnn的全过程

前言 最近呢,在忙一个项目,需要将pytorch训练的模型部署在移动端。然后遇到也遇到了一些坑,简单的记录一下整个过程,转换的模型就使用经典的分类网络模型mobilenet_v2。 将pytorch模型转换为onnx模型 环境准备 这个步骤比较简…

U+平台和华为软开平台怎么拉取远程项目作为新项目

这是根据聊天记录改的帖子,这样应该算得上是一篇技术博客了吧,又完成一个指标【狗头】 用idea作为开发工具 首先连接校园网,然后进入U网址http://10.5.1.21:30080/student/group 从这进去 修改https密码,选择修改,不…

Ubuntu20.04 安装QGIS

qgis的git: GitHub - qgis/QGIS: QGIS is a free, open source, cross platform (lin/win/mac) geographical information system (GIS) qgis的官网:Welcome to the QGIS project! qgis插件包下载地址:https://plugins.qgis.org/plugins/ 1.Prerequisi…

前 K 个高频元素(力扣刷题代码随想录刷题)

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 思路: 要统计元素出现频率对频率排序找出前K个高频元素首先统计元素出现的频率,这一类的问题可以使用map来进行统计。 然后是对频率…