了解redis的单线程模型工作原理?一篇文章就够了

2023-11-08

1、首先redis是单线程的,为什么redis会是单线程的呢?

  1. 从redis的性能上进行考虑,单线程避免了上下文频繁切换问题,效率高;
  2. 从redis的内部结构设计原理进行考虑,redis是基于Reactor模式开发了自己的网络事件处理器: 这个处理器被称为文件事件处理器(file event handler)。而这个文件事件处理器是单线程的,所以才叫redis的单线程模型,这也决定了redis是单线程的。

2、聊一聊redis的单线程模型构造部分?

redis单线程模型中最为核心的就是文件事件处理器

而文件事件处理器结构包含5个部分,其实真正包含为4个部分(不包含socket队列,加上主要方便后面理解):多个socket、IO多路复用程序、socket队列、文件事件分派器、以及事件处理器。而事件处理器又分为3个部分为:连接应答处理器、命令请求处理器、命令回复处理器。如图:
在这里插入图片描述

3、redis单线程模型的大致工作流程及原理

客户端与redis进行通信大致流程:
1、首先在redis启动初始化的时候,redis会先将事件处理器中的连接应答处理器和AE_READABLE事件关联起来;
2、如果客户端向redis发起连接,会产生AE_READABLE事件(步骤A),产生该事件后会被IO多路复用程序监听到(步骤B),然后IO多路复用程序会把监听到的socket信息放入到队列中(步骤C),事件分配器每次从队列中取出一个socket(步骤D),然后事件分派器把socket给对应的事件处理器(步骤E)。由于连接应答处理器和AE_READABLE事件在redis初始化的时候已经关联起来,所以由连接应答处理器来处理跟客户端建立连接,然后通过ServerSocket创建一个与客户端一对一对应的socket,如叫socket01,同时将这个socket01的AE_READABLE事件和命令请求处理器关联起来。
在这里插入图片描述
4、当客户端向redis发生请求时(读、写操作),首先就会在对应的socket如socket01上会产生AE_READABLE事件(步骤A),产生该事件后会被IO多路复用程序监听到(步骤B),然后IO多路复用程序会把监听到的socket信息放入到队列中(步骤C),事件分配器每次从队列中取出一个socket(步骤D),然后事件分派器把socket给对应的事件处理器(步骤E)。由于命令处理器和socket01的AE_READABLE事件关联起来了,然后对应的命令请求处理器来处理。这个命令请求处理器会从事件分配器传递过来的socket01上读取相关的数据,如何执行相应的读写处理。操作执行完之后,redis就会将准备好相应的响应数据(如你在redis客户端输入 set a 123回车时会看到响应ok),并将socket01的AE_WRITABLE事件和命令回复处理器关联起来。
在这里插入图片描述
5、当客户端会查询redis是否完成相应的操作,就会在socket01上产生一个AE_WRITABLE事件,会由对应的命令回复处理器来处理,就是将准备好的相应数据写入socket01(由于socket连接是双向的),返回给客户端,如读操作,客户端会显示ok。
在这里插入图片描述
6、如果命令回复处理器执行完成后,就会删除这个socket01的AE_WRITABLE事件和命令回复处理器的关联。
7、这样客户端就和redis进行了一次通信。由于连接应答处理器执行一次就够了,如果客户端在次进行操作就会由命令请求处理器来处理,反复执行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解redis的单线程模型工作原理?一篇文章就够了 的相关文章

随机推荐

  • java 实现TCP和UDP的底层

    JAVA Socket 底层是怎样基于TCP IP 实现的 图片 2012 08 09 22 54 35 标签 java socket连接分类 JavaSE 首先必须明确 TCP IP模型中有四层结构 应用层 Application Lay
  • 在CentOS8中安装PHP8.0

    我的系统版本 cat etc redhat release 1 下载PHP安装文件 网址 https downloads php net pollita wget https downloads php net pollita php 8
  • 论文笔记:Temporal Regularized Matrix Factorization forHigh-dimensional Time Series Prediction

    0 摘要 时间序列预测问题在现代应用中变得越来越高维 如气候学和需求预测 例如 在需求预测中 项目数量可能高达50 000个 此外 数据通常是嘈杂的 充满缺失值 因此 现代应用程序需要高度可伸缩的方法 并且能够处理损坏或丢失值的噪声数据 然
  • 小程序下拉加载更多数据

    1 功能介绍 1 1 简单列表分页 功能描述 拖动下拉条 可以加载更多内容 1 1 1 实现步骤 1 1 1 1 配置 json文件 1 在app json页面配置 enablePullDownRefresh true 这会让下拉刷新效果适
  • STL 中查找算法使用总结

    顺序查找元素 find 头文件 包含在头文件 include 中 算法作用 使用 操作符 从给定的区间中查找和指定元素值相等的第一个元素 返回其迭代器 适用容器 适用于所有的序列容器 代码示例 vector
  • java 使用RabbitMQ示例

    RabbitMQ简介 RabbitMQ是一个受欢迎的消息代理 通常用于应用程序之间或者程序的不同组件之间通过消息来进行集成 具有高可用高并发的优点 适合集群服务器 采用 Erlang实现 对主要的编程语言都有客户端支持 RabbitMQ环境
  • java的JVM与垃圾回收机制

    核心机制 Java虚拟机 JVM是一个虚拟的计算机 具有指令集并使用不同的存储区域 负责执行指 令 管理数据 内存 寄存器 对于不同的平台 有不同的虚拟机 只有某平台提供了对应的java虚拟机 java程序才可在此平台运行 Java虚拟机机
  • python web自动化实现登录多次 利用ddt数据驱动读取账号信息

    web自动化实现多个用户登录某系统 使用python代码实现 首先创建读取测试数据的方法 代码如下 import unittest from time import sleep from ddt import ddt data 引入ddt驱
  • 【笔记】对称密码之分组密码的工作模式

    目录 一 前言 二 分组密码概述 2 1分组密码的设计原则 2 2混淆和扩散 三 分组加密法的模式 3 1电码本ECB Electronic Code Book 模式 3 2密码分组链接CBC Cipher Block Chaining 模
  • HTTP3

    当我对HTTP的认知还停留在HTTP2 0时 HTTP协议已经发展3 0了 参考下知乎 HTTP 3 原理实战 知乎 大厂对于新技术的追求总是处于行业前列 HTTP3就是其中之一 既然大厂都逐渐在使用了 那说明它经过了一系列的实践的考验 具
  • 二分搜索——分治思想

    二分查找 二分查找是一种在每次比较之后将查找空间一分为二的算法 每次需要查找集合中的索引或元素时 都应该考虑二分查找 如果集合是无序的 我们可以总是在应用二分查找之前先对其进行排序 时间复杂度是 log N 因为 二分查找是通过将现有数组一
  • 数据结构C语言 单链表(插入、删除、查找)

    数据结构C语言 单链表 插入 删除 查找 1 插入 假设 A 的临时指针为 p C 的临时指针为 q 步骤1 删除这条连接线 步骤2 将p gt next给q gt next 步骤3 将q给p gt next 插入代码 q gt next
  • ubuntu18.04+cuda10.2+cudnn7.6.5,并使用CUDA自动安装NVIDIA驱动而非手动。

    一 CUDA和NVIDIA显卡驱动安装 cuda的安装选项中其实包含了nvidia驱动的安装选项 不过网上好多资料都说不要再cuda中勾选nvidia驱动 而要自己去nvidia官网自己查好型号下载安装文件 手动安装nvidia驱动 其实主
  • 字体格式:ttf,woff,eot

    生成网页字体 https onlinefontconverter com eot IE onetype是微软和Adobe共同开发的字体 IE浏览器全部采用这种字体 woff 其它浏览器 woff web开发字体格式 是一种专门为web而设计
  • 信号延迟仿真的 Matlab 源码实现

    信号延迟仿真的 Matlab 源码实现 信号的延迟是数字信号处理中的一个重要概念 本文将介绍如何使用 Matlab 实现信号的延迟仿真 并给出相应的源代码实现 首先 我们需要定义一个信号并进行时域分析 在 Matlab 中 我们可以使用 t
  • Ubuntu下卸载Qt

    卸载有2种办法 1 进入qt的安装目录下卸载 一般ubuntu软件是安装在opt目录下 如果不在就需要找找了 进入安装目录下 sudo MaintenanceTool 选择remove all 就可以完全删除qt了 2 命令行安装的卸载 s
  • OVS datapath流表结构及匹配过程

    datapath流表的查找函数是ovs flow tbl lookup stats 在此之前 先看下datapath组织流表的方式 最新2 6的ovs流表 已经不是最早单纯的精确匹配了 而是一种精确匹配 带掩码匹配合并在一起的方式 叫做me
  • halcon像素统计_Halcon(八)亚像素轮廓XLD

    fast threshold Image Region 0 120 7 boundary Region RegionBorder inner dilation circle RegionClipped RegionDilation 2 5
  • Cox-Box变换

    在 回归分析的基本假设 中提到了回归分析中的基本假设 这里的Box Cox变换方法能够解决回归模型中的误差项不服从高斯分布的违例问题 通常这种违例情况出现在 误差 epsilon与预测变量相关的时候 会影响模型结果的精确度 简单的方法就是通
  • 了解redis的单线程模型工作原理?一篇文章就够了

    1 首先redis是单线程的 为什么redis会是单线程的呢 从redis的性能上进行考虑 单线程避免了上下文频繁切换问题 效率高 从redis的内部结构设计原理进行考虑 redis是基于Reactor模式开发了自己的网络事件处理器 这个处