当前位置: 首页 > wzjs >正文

上传wordpress到优化教程网

上传wordpress到,优化教程网,企业微信网页版,抖音代运营合作协议书范本Redis线程IO模型 总结:在redis5.0及之前,redis线程io模型是单线程。那么Redis单线程如何处理那么多的并发客户端连接的?原因两点:1)非阻塞io 2)多路复用(事件轮询) 以下&#xff0…

Redis线程IO模型

总结:在redis5.0及之前,redis线程io模型是单线程。那么Redis单线程如何处理那么多的并发客户端连接的?原因两点:1)非阻塞io 2)多路复用(事件轮询)

以下,我就针对上面的总结来展开说说redis线程io模型。

1、客户端与redis服务器的通信过程

当客户端执行redis.set(“key”,“value”)命令时,

  • 客户端通过操作系统创建一个套接字
    • 这个套接字会连接到运行 Redis 服务器的机器地址和端口(通常是 6379)。
    • 一旦连接建立成功,你的程序就可以通过这个套接字向 Redis 服务器发送数据
  • 客户端将命令通过 write() 进入 内核写缓冲区
  • 内核写缓存区的数据会从网卡 → redis服务端的内核读缓冲区。
  • redis服务端通过多路复用(epoll)得知内核读缓存区有命令需要执行。
  • 执行之后的响应数据进入Redis服务器的 内核写缓冲区
  • 接着内核写缓存区的数据又会从网卡 → redis客户端的内核读缓冲区。
  • 客户端通过 read() 获取响应数据。

当客户端执行redis.get(“key”)命令时,

  • 客户端将命令通过 write() 进入 内核写缓冲区
  • 内核写缓存区的数据会从网卡 → redis服务端的内核读缓冲区。
  • redis服务端通过多路复用(epoll)得知内核读缓存区有命令需要执行。
  • 执行之后的响应数据进入Redis服务器的 内核写缓冲区
  • 接着内核写缓存区的数据又会从网卡 → redis客户端的内核读缓冲区。
  • 客户端通过 read() 获取响应数据。

GET 命令全流程:

在这里插入图片描述

客户端详细视角:

在这里插入图片描述

服务端详细视角:

在这里插入图片描述

redis服务端视角就能体现Redis高性能的核心
通过非阻塞IO + 多路复用(epoll/kqueue)单线程监听所有连接的缓冲区状态

  • 当某连接的读缓冲区有数据 → 触发Redis读取命令
  • 当某连接的写缓冲区有空闲 → 触发Redis发送响应

此时你可能还不了解非阻塞IO和多路复用究竟是什么?没事,继续看下去。

这里要特别注意,**这里的非阻塞IO是指redis服务器,而非客户端。**因此下面将对比介绍阻塞IO和非阻塞IO,以及多路复用(事件循环)。

2、非阻塞IO & 阻塞IO

阻塞IO:典型的例子就是Java 的 Jedis(同步阻塞客户端)

jedis.get(“key”) :

  • 触发 write():客户端将 GET key 命令写入内核写缓冲区 → 通常瞬间完成

    • 缓冲区未满:写入数据
    • 缓冲区满了:线程卡在 write() 调用(阻塞)
  • 触发read():客户端尝试从内核读缓冲区读取 Redis 的响应(如 "value"

    • 有数据:立即返回结果 → 线程继续执行

    • 无数据:线程卡在 read() 调用(阻塞)

非阻塞IO:典型的例子就是Redis 服务器内部

Redis 将 socket 设置为 Non_Blocking

  • 调用 read() 时无数据,也会立刻返回 EAGAIN 错误而非阻塞。
  • 调用 write() 时无空间,也会立刻返回 EAGAIN 错误而非阻塞。

这边想要再扩展一个非阻塞IO的例子:

支持非阻塞的客户端库(如 Lettuce

  1. commands.get() 将命令写入内核写缓冲区(非阻塞写)。
  2. 客户端库 注册回调函数 并立即返回。
  3. 库内部用 Selector 轮询 内核读缓冲区 → 数据到达后调用回调。

其实,redis只有在感知到内核读缓冲区有数据时,才会调用 read() 去读取数据。

那么redis是怎么感知到内核读缓冲区有数据的?当缓冲区满了,又是怎么知道要什么时候能继续写入数据?答案就是通过多路复用(epoll)。

3、多路复用(epoll)

// Redis 事件循环伪代码
void eventLoop() {while(server.running) {// 0. 计算超时时间(动态值,假设为200ms)timeout = calculate_timeout(); // 1. 获取待处理事件(核心:epoll_wait 在此等待,最多只会阻塞等待timeout时间,如果在这个超时时间内有数据了就会恢复运行态,如果在这个超时时间内依然没有数据,那么就会去处理其他事件,比如时间事件)events = epoll_wait(epoll_fd, events, MAX_EVENTS, timeout); // 2. 处理文件事件(网络请求,处理命令)for each event in events:if event.is_readable:  // 可读事件 → 执行客户端命令readQueryFromClient()if event.is_writable: // 可写事件 → 发送响应writeReplyToClient()// 3. 处理时间事件(定时任务,如RDB备份、Key过期)processTimeEvents()}
}

流程图如下:

 />

以上代码,基本可以说明redis单线程都在干什么了:

一个永不停止的循环(while(1)),用 单线程 同时监听 所有客户端连接 + 定时任务 + 内部任务,通过事件分发处理请求。

这里具体介绍epoll机制:

// Redis 仅通过 epoll 做一件事:
int num_events = epoll_wait(epoll_fd, events, MAX_EVENTS, timeout);
  • 监听对象:所有客户端连接的 socket
  • 监听事件
    • EPOLLIN内核读缓冲区有数据可读(客户端命令到达)
    • EPOLLOUT内核写缓冲区有空闲空间(可发送响应)

在这里插入图片描述

epoll 感知事件的底层原理是全程无CPU轮询!依赖硬件中断

// 系统调用流程
int epoll_wait() {// 1. 检查就绪队列(快速路径)if (!list_empty(rdllist)) return events; // 立即返回// 2. 无事件时:让出CPUset_current_state(TASK_INTERRUPTIBLE); // 标记为阻塞态schedule(); // 主动让出CPU → 其他进程运行
}

也就是说,进入epoll_wait方法,该redis单线程是处于阻塞态的,不占cpu的任何消耗。

在这里插入图片描述

这里我还想补充一点,就是之前我学的,redis的rdb持久化以及aof重写过程中会fork一个子进程、aof是开启后台线程刷屏、以及redis4.0出现的懒惰删除也是在后台线程进行的。以上三种情况与redis的单线程又是什么关系呢?

可以这样理解:Redis的「单线程」本质上是对命令执行模型的核心描述,但整个系统确实存在多线程/多进程协作。

在这里插入图片描述

BIO后台线程(Background I/O Threads):

  • AOF fsync :将AOF缓冲数据刷盘,因为 fsync() 可能阻塞30ms+
  • lazy free :异步删除大Key,避免主线程阻塞数秒。(BIO线程删除Key时,主线程已将该Key标记为逻辑删除(移除key的指针的指针引用),BIO只是物理释放内存)

在这里插入图片描述

子进程(Child Process):

  • AOF重写 触发 BGREWRITEAOF,fork子进程,父子进程共享内存页,Copy-On-Write 写时复制
  • RDB持久化 执行 SAVE / 定时保存,fork子进程,父子进程共享内存页,Copy-On-Write 写时复制

总结:主线程独占写操作(100%),而子进程是只读数据,而BIO线程只处理非数据操作。

  • AOF重写 触发 BGREWRITEAOF,fork子进程,父子进程共享内存页,Copy-On-Write 写时复制
  • RDB持久化 执行 SAVE / 定时保存,fork子进程,父子进程共享内存页,Copy-On-Write 写时复制

总结:主线程独占写操作(100%),而子进程是只读数据,而BIO线程只处理非数据操作。


文章转载自:

http://QTWJzBG4.ysrtj.cn
http://CCqtzAbl.ysrtj.cn
http://EumuidL6.ysrtj.cn
http://kFo2mVYQ.ysrtj.cn
http://TAcAvtbj.ysrtj.cn
http://YLtRzGst.ysrtj.cn
http://qRfP7Pq0.ysrtj.cn
http://aaxMCQxN.ysrtj.cn
http://J84xGFqJ.ysrtj.cn
http://MmX8MXcZ.ysrtj.cn
http://3Kt43WJU.ysrtj.cn
http://3FMORMow.ysrtj.cn
http://3p14G5p0.ysrtj.cn
http://KfUeFuqr.ysrtj.cn
http://GeP6LNW8.ysrtj.cn
http://q1omHDHJ.ysrtj.cn
http://z8bKD0Q7.ysrtj.cn
http://yLrLqkID.ysrtj.cn
http://jmZ8p6Kz.ysrtj.cn
http://Z8VVjlbO.ysrtj.cn
http://55JWBvu2.ysrtj.cn
http://6Zlz1Gk8.ysrtj.cn
http://ig0COxfo.ysrtj.cn
http://Ty9dnSFy.ysrtj.cn
http://5ObkhBuJ.ysrtj.cn
http://Cq7UOdsP.ysrtj.cn
http://tgwvBh4R.ysrtj.cn
http://Ndx5fZjc.ysrtj.cn
http://5yoPGLrf.ysrtj.cn
http://8OzI1FQT.ysrtj.cn
http://www.dtcms.com/wzjs/758579.html

相关文章:

  • NET网站开发程序员招聘wordpress发微信公众号
  • 2016 网站建设需求网页编辑面试知识
  • 做网站做推广网站建设如何导入音乐
  • 家用电脑和宽带做网站适合发软文的平台
  • 有域名怎么做公司网站公司注册代理注册
  • 多语言 网站综合办公系统
  • 做营销型网站做文字图片的网站
  • php搭建网站软件下载肥东网站建设
  • 重庆网站制作济南西安网站建设公
  • 网站默认主页设置wordpress在文章中加背景
  • 简单网站模板下载网站建设产品图
  • dw网站模板下载地址水利建设公共服务平台网站
  • 企业网站seo点击软件北京最新
  • 用手机制作网站做网站专业术语
  • 网站开发实用技术2.8.5西安商城网站开发
  • 广西金水建设开发有限公司网站wordpress主题jquery
  • 怎么制作公众号封面图滨州seo排名
  • 佛山电商网站建设wordpress远程保存图片
  • 个人网站建设详细教程网站建设主要包括什么
  • 烟台环保网站建设内蒙古网站建设费用
  • 网站开发php有哪些目前做响应式网站最好的cms
  • 博罗网站定制怎么查公司网站有没有中文域名
  • 德阳网站seo有没有类似一起做网店的网站
  • 金坛市政建设有限公司网站网站页面禁止访问
  • 政务咨询投诉举报网站建设平面设计网上接单
  • wordpress 无法注册湖南企业竞价优化公司
  • 厦门 外贸网站定制型网站制作
  • 网站维护与排名网站运营需要学什么
  • 电影网站这么做关键词先进的网站建设
  • 哪个网站可以做视频播放器从事网站开发需要什么