zl程序教程

您现在的位置是:首页 >  硬件

当前栏目

Spark IO模型

SparkIO 模型
2023-09-14 09:14:49 时间

Spark IO模型

Redis 是单线程 : 指 Redis 的网络 IO 和键值对读写是由一个线程来完成

  • 持久化、异步删除、集群数据同步 : 由额外的线程执行

线程数/系统吞吐率 :
image.png

多线程同时访问的共享资源,为了保证共享资源的正确性,要额外的机制进行保证 (额外的开销)

多线程并发访问 Redis :

  • 为了保证队列长度的正确性,要让线程 A 和 B的 LPUSH 和 LPOP 串行执行
  • 用多线程会引入同步原语来保护共享资源的并发访问,并降低代码的易调试性/可维护性

image.png

Redis 用单线程模型达到每秒数十万级别的处理能力设计 :

  • Redis 的大部分操作在内存上完成,并采用高效的数据结构,如 : 哈希表 , 跳表
  • 用多路复用机制,在网络 IO 中能并发处理大量的客户端请求,实现高吞吐率

Redis 基本IO模型 :

  • 处理 Get 请求,要监听客户端请求 (bind/listen),和客户端建立连接(accept)
  • 从 socket 中读取请求 (recv) ,解析客户端发送请求 (parse) ,根据请求类型读取键值数据 (get) ,最后给客户端返回结果 (向 socket 中写回数据 (send) )

image.png

Redis 套接字类型/非阻塞设置 :

调用方法返回套接字类型非阻塞模式效果
socket()主动套接字
listen()监听套接字可设置accept() 非阻塞
accept()已连接套接字可设置send()/ recv() 非阻塞

多路复用

Linux 的 IO 多路复用机制 : 一个线程处理多个 IO 流 (select/epoll 机制)

  • 在 Redis 只运行单线程的情况下,该机制允许内核中,同
    时存在多个监听套接字和已连接套接字。内核会一直监听这些套接字上的连接请求或数据请求。一旦有请求到达,就会交给 Redis 线程处理,这就实现了一个 Redis 线程处理多个 IO 流的效果

基于多路复用的 IO 模型 :
image.png

连接请求/读数据请求 :

  • Accept 事件和 Read 事件,分别对两个事件注册 acceptget 回调函数
  • 当 Linux 内核监听到有连接请求或读数据请求时,就会触发 Accept 事件
    和 Read 事件
  • 内核就会回调 Redis 相应的 accept 和 get 函数进行处理