Blage's Coding Blage's Coding
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
  • Redis基础

  • 源码分析

    • 数据结构
    • Redis网络模型
      • 阻塞IO(BIO)
      • 非阻塞IO(NIO)
      • IO多路复用
      • 信号驱动IO
      • 异步IO(AIO)
      • Redis网络模型
    • 内存策略
    • 优化
  • 实战应用

  • 单机缓存

  • Redis
  • 源码分析
phan
2023-05-15
目录

Redis网络模型

# Redis网络模型

# 阻塞IO(BIO)

  • 用户进程向内核空间发起系统调用,等待网卡数据
  • 内核空间等待数据,数据到来后写到内核缓冲区,然后再将数据拷贝到用户缓冲区,然后用户处理数据
  • 整个过程用户进程一直在阻塞地等待数据。

image-20230315141539103

# 非阻塞IO(NIO)

  • 用户进程发起系统调用等待数据时,内核态直接向用户进程返回调用失败。然后用户进程反复调用询问数据好了没有,因此等待数据阶段用户进程是非阻塞的。但忙等会导致CPU空转。
  • 内核态中,一旦数据准备好之后会将数据从内核缓冲区拷贝到用户缓冲区中,才会给用户进程返回OK。数据拷贝阶段进程依旧是阻塞的。

image-20230315142339070

# IO多路复用

  • select

①首先创建一个fd集合,以bitmap的形式标记要监听的fd,然后将fd集合从用户态拷贝到内核态。

②内核监听每个fd对应的设备状态,如果有就绪的保留1,未就绪则变成0。然后会把fd集合从内核空间拷贝到用户空间中。

③用户空间需要遍历fd集合,找到对应就绪的fd。

  • poll

fd数组监听的数量没有上限。整个数组拷贝到内核空间后转链表存储。

  • epoll

epoll_ctl:将FD从用户空间拷贝到内核空间的红黑树中,并关联callback,当fd就绪触发callback就会把就绪的fd加入到一个专门的链表集合中。(相比于select每次都要拷贝到内核空间,epoll每个fd只需要执行一次epoll_ctl添加到红黑树中)

epoll_wait:返回就绪链表集合fd数量,并拷贝就绪的fd到用户空间。

ET模式:当FD有数据可读时,进程只会被通知一次。可以避免LT的惊群现象

LT模式:当FD有数据可读时,会重复通知多次,直至数据被处理完成。

image-20230315193330626

# 信号驱动IO

用户进程和内核建立信号关联,用户进程在等待数据期间可以执行其它业务,无需阻塞等待,当数据就绪后内核会通过信号通知用户。

image-20230315160427231

# 异步IO(AIO)

用户只需要发送系统调用后,进程不阻塞,等待内核等待数据、拷贝数据后发给用户处理数据信号。

# Redis网络模型

Redis核心业务部分是单线程。

Redis是纯内存操作,执行速度非常快,性能瓶颈是网络延迟而不是执行速度。多线程会导致上下文切换,带来不必要的开销;并且多线程会面临线程安全问题。

#

编辑 (opens new window)
#Redis
上次更新: 2023/12/15, 15:49:57
数据结构
内存策略

← 数据结构 内存策略→

Theme by Vdoing | Copyright © 2023-2024 blageCoder
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式