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

Redis——线程模型·

为什么Redis是单线程却仍能有10w/秒的吞吐量?

  • 内存操作:Redis大部分操作都在内存中完成,并且采用了高效的数据结构,因此Redis的性能瓶颈可能是机器的内存或者带宽而非CPU,既然CPU不是瓶颈,自然就采用单线程解决方案了。
  • 避免多线程竞争:省去了多线程切换带来的性能开销,且不会导致死锁问题。
  • I/O多路复用机制:使用select/epoll机制。在操作系统内核中同时监听所有socket事件的发生。

Redis哪些地方使用了多线程?

Redis单线程指的是:
  1. 接收客户端请求
  2. 解析请求
  3. 进行数据读写等操作
  4. 返回数据给客户端
但Redis程序并不是单线程,Redis在启动时会启动后台线程(BIO模型)
  • 2.6版本后,启动两个后台线程,分别处理关闭文件AOF刷盘
  • 4.0版本后,新增一个后台线程,用来异步释放Redis内存,也就是lazyfree线程。例如执行unlink line/flushdb async等命令,会将这些删除操作交给后台线程来执行,好处是不会导致Redis主线程卡顿。我们应该使用unlink命令来异步删除大Key,因为del在主线程中执行,删除大Key是会导致阻塞
  • 总而言之,多线程体现在后台线程中,如关闭文件、AOF刷盘、释放内存等耗时任务都是通过后台线程来处理的,后台线程相当于消费者,生产者将耗时任务丢到任务队列中即可,消费者则不断轮询该队列处理任务

  • 6.0版本后,Redis采用了多个I/O线程来处理网络请求,因为随着网络硬件的性能提升,Redis的性能瓶颈可能会出现在网络I/O(连接建立、请求读取、写入)上。但多线程仅仅用于网络I/O,执行命令依然使用单线程进行
  • 网络I/O多线程:只针对发送响应数据(write client socket),并不会以多线程的方式处理读请求(read client socket),除非在配置文件中更改。

单线程网络模型的缺陷:

  1. 无法利用多核CPU的性能。
  2. 业务处理时,整个进程时无法处理其他socket事件的,若业务(包括网络I/O)耗时较长就会导致阻塞。

http://www.xdnf.cn/news/5782.html

相关文章:

  • Ubuntu 18.04.6下OpenSSL与OpenSSH版本升级
  • OptiStruct的转子临界转速分析
  • 解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs- GPT源代码解析
  • [Java实战]Spring Boot 3 整合 Apache Shiro(二十一)
  • ubuntu----100,常用命令2
  • Python 字典键 “三变一” 之谜
  • 理解 C# 中的各类指针
  • OCR:开启财务数字化变革的魔法钥匙
  • Leetcode 3547. Maximum Sum of Edge Values in a Graph
  • swift flask python ipad当电脑键盘 实现osu x键和z键 长按逻辑有问题 quart 11毫秒
  • Spark 缓存(Caching)
  • 2025年PMP 学习十一 第8章 项目质量管理(8.3)
  • 运行Spark程序-在Idea中
  • 基于智能家居项目 实现DHT11驱动源代码
  • Linux目录和文件
  • idea Maven 打包SpringBoot可执行的jar包
  • C语言 ——— 函数栈帧的创建和销毁
  • Qt6.5.3 windows下安装教程
  • c++STL-list的使用和迭代器
  • 【AIGC 温柔档案】:镂空蕾丝与柔和线条的唯美算法融合
  • PostgreSQL 配置设置函数
  • MySQL 8.0 OCP 英文题库解析(四)
  • STM32 修炼手册
  • PostgreSQL 服务器信号函数
  • 设计模式深度解析:AI大模型下的策略模式与模板方法模式对比解析
  • 力扣HOT100之二叉树:543. 二叉树的直径
  • web 自动化之 KDT 关键字驱动详解
  • 什么是Git?
  • 性能优化--无分支编程的实际应用场景
  • 基于动态规划的强化学习方法