【Redis技术探索】「底层架构原理」探索分析服务系统的网络架构和线程模型

news2024/11/26 21:34:06

Redis网络基础架构

网络编程离不开Socket,网络I/O模型最常用的无非是同步阻塞、同步非阻塞、异步阻塞、异步非阻塞,高性能网络服务器最常见的线程模型也就是基于EventLoop模式的单线程模型

Redis基础组建结构

Redis网络层基础组件主要包括四个部分:

EventLoop事件轮训器,这部分实现在AE里面。

  • 提供Socket句柄事件的多路复用器,这部分分别对于不同平台提供了不同的实现,比如epoll和select可以用于linux平台、kqueue可以用于苹果平台、evpoll可以用于Solaris平台,这里并没有看到iocp,也就是Redis对于Windows支持并不是很好

  • 包括网络事件处理器实现的networking,这部分主要包括两个重要的今天要讲的事件处理器:acceptTcpHandleracceptCommonHandler

  • 处理网络比较底层的部分,比如网络句柄创建网络的读写等。

Redis单线程模型

要理解Redis的单线程模型,有多个客户端同时去跟Redis Server建立连接,之后又同时对某个key进行操作。

网络初始化

  • 初始化Redis Server参数,这部分代码通过nitServerConfig实现
  • 初始化Redis Server,这部分代码在initServer里面
  • 启动事件轮训器

Redis的启动部分简化为三步,跟网络操作有关的主要在第二步和第三步里面,来看看initServer里面发生了什么

initServer流程

  1. initServer里面首先创建了一个EventLoop
  2. 然后监听Server的IP对应的端口号,假设我们监听的是127.0.0.1:3333这个IP:端口对,我们得到的一个Server Socket句柄,
  3. 最后通过createFileEvent将我们得到的Server Socket句柄和我们关心的网络事件mask注册到EventLoop上面。

EventLoop是什么呢,我们看看它的定义:

typedef struct aeEventLoop {
    int maxfd;   /* highest file descriptor currently registered */
    int setsize; /* max number of file descriptors tracked */
    long long timeEventNextId;
    time_t lastTime;     /* Used to detect system clock skew */
    aeFileEvent *events; /* Registered events */
    aeFiredEvent *fired; /* Fired events */
    aeTimeEvent *timeEventHead;
    int stop;
    void *apidata; /* This is used for polling API specific data */
    aeBeforeSleepProc *beforesleep;
} aeEventLoop;

上面我们关注的主要是两个东西:events和fired。他们分别是两个数组:

  • events:用于存放被注册的事件以及相应的句柄

  • fired:用于存放当EventLoop线程从多路复用器轮训到有事件的句柄的时候,EventLoop线程会把它放入fired数组里面,然后处理

事件注册示意图

  • 1.上面的示意图描述createFileEvent做的事情,就是将Server Socket句柄和关心的事件mask以及当事件产生的时候的事件处理器acceptHandler生成一个aeFileEvent注册到EventLoop的events的数组里面,当然在这之前会首先将事件注册到多路复用器上,也就是epoll、kqueue等这些组件上
  • 2.事件注册完之后需要对多路复用器进行轮训
  • 3.来分离我们关心切发生的事件,那就是最后一步,启动事件轮询器

接收网络连接

完成了服务端的网络初始化,而且事件轮询器已经开始工作了,事件轮询器做什么事情呢,就是不断轮训多路复用器,看看之前注册的事件有没有发生,如果有发生,则将会将事件分离出来,放入EventLoop的fired数组中,然后处理这些事件

    1. 注册的事件是客户端建立连接这个事件,因此当有两个客户端同时连接Redis服务器的时候,事件轮询器会从多路复用器上面分离出这个事件,同时调用acceptHandler来处理
    1. acceptHandler做的事情主要是accept客户端的连接,创建socket句柄,然后将socket句柄和读事件注册到EventLoop的events数组里面,不一样的是对于客户端的事件处理器是readQueryClient。

accept客户端连接以及注册客户端连接句柄示意图

上面示意图表示了acceptHandler处理客户端连接,得到句柄之后再将这个句柄注册到多路复用器以及EventLoop上的示意图。之后再同样再处理下一个客户端的连接,这些都是串行的。

事件轮训

上面接收客户端这部分其实都发生在事件轮训的主循环里面:

void aeMain(aeEventLoop *eventLoop) {
    eventLoop->stop = 0;
    while (!eventLoop->stop) {
        if (eventLoop->beforesleep != NULL)
            eventLoop->beforesleep(eventLoop);
        aeProcessEvents(eventLoop, AE_ALL_EVENTS);
    }
}

Redis会不断的轮训多路复用器,将网络事件分离出来,如果是accept事件,则新接收客户端连接并将其注册到多路复用器以及EventLoop中,如果是查询事件则通过读取客户端的命令进行相应的处理,这一切都是单线程,顺序的执行的,因此不会发生并发问题

应用分析

Redis官网对Redis的读写性能测试结果达到10左右,这是非常吸引人的。
Redis的单线程的行为主要是对内存的读写这些操作其实用不了多少时间因此瓶颈在网络I/O上面一般提供较好的网络环境就可以提升Redis的吞吐量,比如提高网络带宽,除此之外还可以通过合并命令提交批处理请求来代替单条命令一次次请求从而减少网络开销提高吞吐量

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

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

相关文章

acm是什么?你准备好去打了吗?(未完结)

1.引言2.acm究竟是什么?3.acm的时间安排4.acm该如何准备1.引言 作为一个零基础的小白,acm这条路走的并不顺畅,接触的信息很少,以至于在这条道路上走了不少弯路,浪费了大量的时间,现在也快要退役的阶段&…

Linux基础-软件包管理器RPM与yum

该文章主要为完成实训任务,详细实现过程及结果见【参考文章】 参考文章:https://howard2005.blog.csdn.net/article/details/127131286?spm1001.2014.3001.5502 文章目录一、使用RPM软件包管理器1. RPM安装软件包2. RPM更新与升级软件包3. RPM查询软件包…

Qt-Web混合开发-Qt读写Json数据(5)

Qt-Web混合开发-Qt使用内置json库读写json示例🍏 文章目录Qt-Web混合开发-Qt使用内置json库读写json示例🍏1、概述🍓2、实现效果🍅3、实现功能🥝4、关键代码🌽5、源代码🍆更多精彩内容&#x1f…

面试怎么回答MySQL索引问题,看这里

前言 小A在宿舍里跟哥们开五黑打排位中,突然收到女神小美的消息:“小A,我今天面试碰到索引问题了,我没回答好”。小A顾不上游戏抓紧回复到:“到你宿舍某某咖啡店吧,我帮你一起看下”。 小A抓紧时间换了衣…

物联公司网页设计制作 简单静态HTML网页作品 静态企业网页作业成品 学生网站模板

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

Linux系统部署

Linux系统部署 下载vmware centos7 xshell6 xftp6新建虚拟机,注意设置网络连接,设置登录名:root,密码:root,等待登录,输入用户名和密码(注意密码输入不显示)登录成功,执行命令Ifc…

【网管日记】MySQL主从复制

MySQL主从复制 基本介绍 MySQL 主从复制是一个异步的复制过程,底层是基于 Mysql 数据库自带的 二进制日志 功能。 一台或多台 MySQL 数据库(slave,即 从库 )从另一台 MySQL 数据库( master,即 主库 &…

餐饮后台管理系统

一、项目介绍: 用于每天的菜品数据分析,客户的管理,员工的管理,查看订单信息,菜品的添加或者下架管理 二、项目使用技术栈: vue2全家桶、element-ui、axios、js、es6、echarts 三、主页效果图&#xff…

pytorch深度学习实战一书,tensorboard可视化踩坑

书评&踩坑[TOC](书评&踩坑) 提示:纯个人观点,仅供参考前言一、源码学习,又是版本问题(省略内心独白...)二、步骤1.安装tensorflow2.思考,看代码,看书求证总结提示:纯个人观点…

卧兔CEO胡煜受邀参加2022世界直播电商大会

首届全球数字贸易博览会于12月11日在国际博览中心盛大开幕。在这个国家级、全球性、专业性的舞台上,“2022世界直播电商大会”作为分论坛,精彩启幕。 “2022世界直播电商大会”由浙江省人民政府和商务部联合主办,杭州市人民政府和浙江省商务…

借款久期还款久期 简述

借款久期&还款久期 简述 在工作的时候,在资产使用遇到三个指标,分别是生息资产、借款久期、还款久期,有点不清楚其中的含义,查阅相关资料后做个简短的总结,可能有错,先放这。 1 久期 久期&#xff0…

【STM32】GPIO的工作原理和配置

目录一、GPIO是什么?二、GPIO的8种工作模式1. 浮空输入模式(GPIO_Mode_IN_FLOATING)2. 上拉输入模式(GPIO_Mode_IPU)3. 下拉输入模式(GPIO_Mode_IPD)4. 模拟输入模式(GPIO_Mode_AIN&…

kubernetes学习之路--BadPods(Part2)

在我看来,现在关于k8s的攻击面很小,除了容器逃逸,敏感信息和配置不当,很难有其他有效的横向移动的手段了吧,反正据我了解暂时是这样子的,慢慢积累吧还是。 回顾一下Pod中那几项不安全的配置 : …

原地起飞,华为内部都在强推的435页网络协议文档,附讲解

#为什么要学习网络协议? 相信大家都听过通天塔的故事,上帝为了阻止人类联合起来,让人类说不同的语言,人类没法沟通,达不成“协议”,通天塔的计划就失败了。 但是千年以后,有一种叫“程序猿”的…

基于VBA实现电缆结构自动出图(三) —— 多芯线

大家敢相信吗,原来VBA竟然可以实现电缆结构自动出图,换句话说,只要输入数据,VBA会自动将电缆的结构画出来,同时还可以渲染,结果竟然不输画图软件,真真让我刮目相看。这里我就不过多介绍VBA了&am…

重点| 系统集成项目管理工程师考前50个知识点(5)

本文章总结了系统集成项目管理工程师考试背记50个知识点!!! 帮助大家更好的复习,希望能对大家有所帮助 比较长,放了部分,需要可私信!! 30、活动之间的四种依赖关系: 强…

[附源码]Node.js计算机毕业设计高校互联网班级管理系统Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

Redis 压力测试 服务监控

Redis 压力测试 & 服务监控 Redis 压力测试 Redis 安装成功后,会在 /usr/local/bin/目录下生成redis-benchmark压测工具。该工具模拟N个客户端同时执行Redis指令,默认提供一组默认测试参数,用户可以自定义其属性,更改测试行…

java开发必备技能:mysql

mysql 架构 连接器 mysql的连接器负责处理mysql客户端的连接请求及维护连接。 传输协议 mysql支持多种传输协议,不同的平台可以选择不同的协议: 连接压缩控制 mysql建立的连接可以对客户端和服务器之间的流量进行压缩,以减少通过连接发…

Rock派(基于瑞芯微RK3308B)开发记录-上篇

本文作者:Linux兵工厂,一个嵌入式软件领域的攻城狮。欢迎指教公一众-号:Linux兵工厂,获取硬核Linux资料和文章 前言 根据项目需求并且经过各方面评估最终选择了这款Rock Pi(Rock派)系列中的Rock Pi S产品。正式它的各方面的特性…