Redis 线程模型面试题汇总! 📅 发布时间:2026/7/9 9:22:28 👁️ 浏览次数: 这次主要分享Redis 线程模型篇的面试题。Redis 是单线程吗Redis 单线程模式是怎样的Redis 采用单线程为什么还这么快Redis 6.0 之前为什么使用单线程Redis 6.0 之后为什么引入了多线程Redis 是单线程吗Redis 单线程指的是「接收客户端请求-解析请求 -进行数据读写等操作-发生数据给客户端」这个过程是由一个线程主线程来完成的这也是我们常说 Redis 是单线程的原因。但是Redis 程序并不是单线程的Redis 在启动的时候是会启动后台线程BIO的Redis 在 2.6 版本会启动 2 个后台线程分别处理关闭文件、AOF 刷盘这两个任务Redis 在 4.0 版本之后新增了一个新的后台线程用来异步释放 Redis 内存也就是 lazyfree 线程。例如执行 unlink key / flushdb async / flushall async 等命令会把这些删除操作交给后台线程来执行好处是不会导致 Redis 主线程卡顿。因此当我们要删除一个大 key 的时候不要使用 del 命令删除因为 del 是在主线程处理的这样会导致 Redis 主线程卡顿因此我们应该使用 unlink 命令来异步删除大key。之所以 Redis 为「关闭文件、AOF 刷盘、释放内存」这些任务创建单独的线程来处理是因为这些任务的操作都是很耗时的如果把这些任务都放在主线程来处理那么 Redis 主线程就很容易发生阻塞这样就无法处理后续的请求了。后台线程相当于一个消费者生产者把耗时任务丢到任务队列中消费者BIO不停轮询这个队列拿出任务就去执行对应的方法即可。关闭文件、AOF 刷盘、释放内存这三个任务都有各自的任务队列BIO_CLOSE_FILE关闭文件任务队列当队列有任务后后台线程会调用 close(fd) 将文件关闭BIO_AOF_FSYNCAOF刷盘任务队列当 AOF 日志配置成 everysec 选项后主线程会把 AOF 写日志操作封装成一个任务也放到队列中。当发现队列有任务后后台线程会调用 fsync(fd)将 AOF 文件刷盘BIO_LAZY_FREElazy free 任务队列当队列有任务后后台线程会 free(obj) 释放对象 / free(dict) 删除数据库所有对象 / free(skiplist) 释放跳表对象Redis 单线程模式是怎样的Redis 6.0 版本之前的单线模式如下图图中的蓝色部分是一个事件循环是由主线程负责的可以看到网络 I/O 和命令处理都是单线程。 Redis 初始化的时候会做下面这几年事情首先调用 epoll_create() 创建一个 epoll 对象和调用 socket() 一个服务端 socket然后调用 bind() 绑定端口和调用 listen() 监听该 socket然后将调用 epoll_crt() 将 listen socket 加入到 epoll同时注册「连接事件」处理函数。初始化完后主线程就进入到一个事件循环函数主要会做以下事情首先先调用处理发送队列函数看是发送队列里是否有任务如果有发送任务则通过 write 函数将客户端发送缓存区里的数据发送出去如果这一轮数据没有发生完就会注册写事件处理函数等待 epoll_wait 发现可写后再处理 。接着调用 epoll_wait 函数等待事件的到来如果是连接事件到来则会调用连接事件处理函数该函数会做这些事情调用 accpet 获取已连接的 socket - 调用 epoll_ctr 将已连接的 socket 加入到 epoll - 注册「读事件」处理函数如果是读事件到来则会调用读事件处理函数该函数会做这些事情调用 read 获取客户端发送的数据 - 解析命令 - 处理命令 - 将客户端对象添加到发送队列 - 将执行结果写到发送缓存区等待发送如果是写事件到来则会调用写事件处理函数该函数会做这些事情通过 write 函数将客户端发送缓存区里的数据发送出去如果这一轮数据没有发生完就会继续注册写事件处理函数等待 epoll_wait 发现可写后再处理 。以上就是 Redis 单线模式的工作方式Redis 采用单线程为什么还这么快官方使用基准测试的结果是单线程的 Redis 吞吐量可以达到 10W/每秒如下图所示之所以 Redis 采用单线程网络 I/O 和执行命令那么快有如下几个原因Redis 的大部分操作都在内存中完成并且采用了高效的数据结构因此 Redis 瓶颈可能是机器的内存或者网络带宽而并非 CPU既然 CPU 不是瓶颈那么自然就采用单线程的解决方案了Redis 采用单线程模型可以避免了多线程之间的竞争省去了多线程切换带来的时间和性能上的开销而且也不会导致死锁问题。Redis 采用了I/O 多路复用机制处理大量的客户端 Socket 请求IO 多路复用机制是指一个线程处理多个 IO 流就是我们经常听到的 select/epoll 机制。简单来说在 Redis 只运行单线程的情况下该机制允许内核中同时存在多个监听 Socket 和已连接 Socket。内核会一直监听这些 Socket 上的连接请求或数据请求。一旦有请求到达就会交给 Redis 线程处理这就实现了一个 Redis 线程处理多个 IO 流的效果。Redis 6.0 之前为什么使用单线程我们都知道单线程的程序是无法利用服务器的多核 CPU 的那么早期 Redis 版本的主要工作网络 I/O 和执行命令为什么还要使用单线程呢我们不妨先看一下Redis官方给出的FAQ。核心意思是CPU 并不是制约 Redis 性能表现的瓶颈所在更多情况下是受到内存大小和网络I/O的限制所以 Redis 核心网络模型使用单线程并没有什么问题如果你想要使用服务的多核CPU可以在一台服务器上启动多个节点或者采用分片集群的方式。除了上面的官方回答选择单线程的原因也有下面的考虑。使用了单线程后可维护性高多线程模型虽然在某些方面表现优异但是它却引入了程序执行顺序的不确定性带来了并发读写的一系列问题增加了系统复杂度、同时可能存在线程切换、甚至加锁解锁、死锁造成的性能损耗。Redis 6.0 之后为什么引入了多线程虽然 Redis 的主要工作网络 I/O 和执行命令一直是单线程模型但是在 Redis 6.0 版本之后也采用了多个 I/O 线程来处理网络请求这是因为随着网络硬件的性能提升Redis 的性能瓶颈有时会出现在网络 I/O 的处理上。所以为了提高网络请求处理的并行度Redis 6.0 对于网络请求采用多线程来处理。但是对于读写命令Redis 仍然使用单线程来处理所以大家不要误解Redis 有多线程同时执行命令。Redis 官方表示Redis 6.0 版本引入的多线程 I/O 特性对性能提升至少是一倍以上。Redis 6.0 版本支持的 I/O 多线程特性默认是 I/O 多线程只处理写操作write client socket并不会以多线程的方式处理读操作read client socket。要想开启多线程处理客户端读请求就需要把 Redis.conf 配置文件中的 io-threads-do-reads 配置项设为 yes。//读请求也使用io多线程 io-threads-do-reads yes同时 Redis.conf 配置文件中提供了 IO 多线程个数的配置项。// io-threads N表示启用 N-1 个 I/O 多线程主线程也算一个 I/O 线程 io-threads 4关于线程数的设置官方的建议是如果为 4 核的 CPU建议线程数设置为 2 或 3如果为 8 核 CPU 建议线程数设置为 6线程数一定要小于机器核数线程数并不是越大越好。 因此Redis 6.0 版本之后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 线程io-threads 默认是 4 所以会启动 34-1个 I/O 多线程用来分担 Redis 网络 I/O 的压力。
无人机升级不用改!Deepoc 开发板即插即享智能飞行 在无人机应用愈发广泛的今天,从电力巡检、农林植保到园区安防、地形测绘,各行各业都想靠无人机提效降本,但传统无人机的智能化短板却成了最大阻碍——全程靠人遥控、复杂环境易失控、升级改造成本高,让不少用户直呼“用着费劲、升… 2026/7/9 10:34:24
2025 权威推荐!7 大 CRM 解决方案核心竞争力对比:聚焦供应链 - 客户生态绑定 内外链路贯通与供应链-客户生命周期绑定能力横评:七大品牌核心竞争力拆解在数字化转型浪潮中,内外链路贯通(打通企业内部业务与外部生态数据)与供应链-客户生命周期深度绑定(让供应链按需响应客户全周期需求࿰… 2026/7/7 22:46:37
智慧交通驾驶员有无系安全带检测数据集VOC+YOLO格式1313张2类别 数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数):1313标注数量(xml文件个数):1313标注数量(txt文件个数):1313标注类别… 2026/5/17 6:48:32
3分钟快速上手:AcFunDown让A站视频永久保存在本地 3分钟快速上手:AcFunDown让A站视频永久保存在本地 【免费下载链接】AcFunDown 包含PC端UI界面的A站 视频下载器。支持收藏夹、UP主视频批量下载 😳仅供交流学习使用喔 项目地址: https://gitcode.com/gh_mirrors/ac/AcFunDown 还在担心喜欢的A站视… 2026/7/9 10:33:57
AMD MI355X与NVIDIA B200在GLM5.2大模型推理性能与成本对比分析 🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 在 AI 推理硬件选型中,成本与性能的平衡一直是技术决策的核心难点。AMD 最新发布的 CDNA 4 架构 MI355X 加速卡与 NVIDIA … 2026/7/9 10:33:57
AD74412R与PIC32MX460F512L的硬件协同设计与优化 1. AD74412R与PIC32MX460F512L的硬件协同设计1.1 AD74412R的接口特性解析AD74412R这颗四通道软件可配置I/O芯片在工业控制领域堪称"瑞士军刀"。我在最近一个智能温控系统项目中实测发现,其每个通道都能通过寄存器配置实现四种工作模式切换:0-1… 2026/7/9 10:31:53
终极指南:如何用SharpKeys轻松定制你的Windows键盘布局 终极指南:如何用SharpKeys轻松定制你的Windows键盘布局 【免费下载链接】sharpkeys SharpKeys is a utility that manages a Registry key that allows Windows to remap one key to any other key. 项目地址: https://gitcode.com/gh_mirrors/sh/sharpkeys … 2026/7/9 10:29:51
九大网盘文件直链下载工具:打破下载速度限制的浏览器脚本解决方案 九大网盘文件直链下载工具:打破下载速度限制的浏览器脚本解决方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动… 2026/7/9 10:27:48
企业GEO投入评估技术框架:四维决策模型与诊断实施指南 以下模型用于企业做 GEO 投入前的初步评估,不代表行业统一标准,也不构成效果承诺。 摘要企业在判断是否投入GEO(生成式引擎优化)时,常见的问题是缺乏可量化的评估标准。本文提出一个四维决策模型——客户搜索行为、行业… 2026/7/9 10:25:47
机器视觉与PLC集成:轮毂缺陷检测与字符识别误差控制在0.2mm内 机器视觉与PLC集成:轮毂缺陷检测与字符识别误差控制在0.2mm内的技术实现轮毂作为汽车关键零部件,其表面质量直接影响行车安全与美观。传统人工检测效率低且易漏检,而采用机器视觉与PLC集成方案可实现微米级精度检测。本文将深入解析高精度视觉… 2026/7/9 0:01:04
GBase 8a vs MySQL 8.0:ALTER TABLE语法与限制的5点关键差异对比 GBase 8a与MySQL 8.0:ALTER TABLE语法差异深度解析与实战指南1. 两种数据库的ALTER TABLE能力全景对比在数据库架构设计和运维过程中,表结构变更(DDL操作)是不可避免的需求。GBase 8a作为国产分析型数据库代表,与开源M… 2026/7/9 0:03:06
【大数据毕业设计】基于多源旅游数据的景区热度分析与推荐系统的设计与实现 基于 Django 的旅游偏好挖掘与景区推荐系统(源码+文档+远程调试,全bao定制等) 博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am… 2026/7/9 0:05:09
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/7 11:26:57
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/8 20:15:17
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/8 14:25:08