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

Redis② —— Redis线程模型

1. Redis是单线程吗?

  • 指 接受客户请求 --> 解析请求 --> 进行数据读写操作 --> 发送数据给客户端 这个过程由一个主线程完成
  • redis程序并不是单线程的,在启动时会启动后台进程
    • 2.6之前启动两个后台线程,分别处理关闭文件、AOF刷盘
    • 4.0后新增一个后台线程,用来异步释放redis内存(lazyfree线程)
    • 这三个任务很耗时不能交给主线程处理

2. redis单线程模式

  • redis 6.0之前是单线程的,6.0之后引入了多线程
  • 单线程处理流程:
    • 初始化:
      • 调用 epoll_create() 创建一个 epoll 对象和调用 socket() 创建一个服务端 socket
      • 调用 bind() 绑定端口和调用 listen() 监听该 socket
      • 将调用 epoll_ctl() 将 listen socket 加入到 epoll,同时注册「连接事件」处理函数。
    • 主线程进入事件循环函数:
      • 先调用处理发送队列函数,看发送队列是否有任务
        • 有 --> write函数发出去,如果这一轮没发送完就会注册写事件处理函数,等待 epoll_wait 发现可写后再处理
      • 调用 epoll_wait 函数等待事件的到来
        • 如果是连接事件,调用连接事件处理函数
          • 调用 accpet 获取已连接的 socket --> 调用 epoll_ctl 将已连接的 socket 加入到 epoll --> 注册「读事件」处理函数
        • 如果是读事件,调用读事件处理函数
          • 调用 read 获取客户端发送的数据 --> 解析命令 --> 处理命令 --> 将客户端对象添加到发送队列 --> 将执行结果写到发送缓存区等待发送
        • 如果是写事件,调用写事件处理函数
          • 通过 write 函数将客户端发送缓存区里的数据发送出去,如果这一轮数据没有发送完,就会继续注册写事件处理函数,等待 epoll_wait 发现可写后再处理

在这里插入图片描述

3. redis采用单线程为什么速度还快?

  • Redis 的大部分操作都在内存中完成,并且采用了高效的数据结构
  • 采用单线程模型可以避免了多线程之间的竞争
  • 采用了 I/O 多路复用机制处理大量的客户端 Socket 请求

4. redis 6.0 之后为什么引入了多线程?

  • 采用了多个 I/O 线程来处理网络请求,这是因为随着网络硬件的性能提升,Redis 的性能瓶颈有时会出现在网络 I/O 的处理上
  • 对于命令的执行,Redis 仍然使用单线程来处理
  • Redis 在启动的时候,默认情况下会额外创建 6 个线程(不包括主线程)
    • Redis-server : Redis的主线程,主要负责执行命令;
    • bio_close_file、bio_aof_fsync、bio_lazy_free:三个后台线程,分别异步处理关闭文件任务、AOF刷盘任务、释放内存任务;
    • io_thd_1、io_thd_2、io_thd_3:三个 I/O 线程,用来分担 Redis 网络 I/O 的压力。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • <数据集>绝缘子缺陷检测数据集<目标检测>
  • 昇思25天学习打卡营第20天|CycleGAN图像风格迁移互换
  • MVC 返回集合方法,以及分页
  • FPGA入门-自用
  • 语音识别HResults统计工具以及字根据关键词进行合并
  • PostgreSQL关闭数据库服务的三种模式
  • Re:从零开始的C++世界——类和对象(上)
  • vscode终端(控制台打印乱码)
  • 【精品资料】模块化数据中心解决方案(33页PPT)
  • LLM——langchain 与阿里 DashScop (通义千问大模型) 和 DashVector(向量数据库) 结合使用总结
  • 2024年是不是闰年?
  • IAR全面支持芯驰科技E3系列车规MCU产品E3119/E3118
  • python+selenium-UI自动框架之[优化]元素查找和BasePage页面
  • 跨域问题出现的原因,怎么解决?
  • 《Windows API每日一练》9.25 系统菜单
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • cookie和session
  • go append函数以及写入
  • golang 发送GET和POST示例
  • iOS 颜色设置看我就够了
  • JavaScript标准库系列——Math对象和Date对象(二)
  • Linux中的硬链接与软链接
  • SpringBoot 实战 (三) | 配置文件详解
  • use Google search engine
  • 规范化安全开发 KOA 手脚架
  • 基于组件的设计工作流与界面抽象
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 小而合理的前端理论:rscss和rsjs
  • C# - 为值类型重定义相等性
  • ​经​纬​恒​润​二​面​​三​七​互​娱​一​面​​元​象​二​面​
  • #includecmath
  • #pragma 指令
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (2)空速传感器
  • (ZT)一个美国文科博士的YardLife
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (四)Controller接口控制器详解(三)
  • (一)utf8mb4_general_ci 和 utf8mb4_unicode_ci 适用排序和比较规则场景
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)ObjectiveC 深浅拷贝学习
  • (转)负载均衡,回话保持,cookie
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .net core 使用js,.net core 使用javascript,在.net core项目中怎么使用javascript
  • .net core控制台应用程序初识
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET delegate 委托 、 Event 事件
  • .net framework 4.8 开发windows系统服务
  • .NET/C#⾯试题汇总系列:⾯向对象
  • .NET处理HTTP请求
  • .net中应用SQL缓存(实例使用)
  • :not(:first-child)和:not(:last-child)的用法