Redis 单线程为什么速度很快 📅 2026/7/4 3:47:44 Redis核心处理网络请求、执行命令的主线程是单线程但它并不是整个程序只有一个线程持久化、异步删除、集群同步等操作都会启用子线程 / 后台线程。 它单线程还能做到高性能核心有下面几点原因1. 纯内存操作读写速度本身天花板很高Redis 所有数据都存放在内存中内存 IO 速度是磁盘的成千上万倍。 数据库需要频繁刷磁盘、做页交换而 Redis 不需要落盘参与常规读写命令执行几乎没有慢速 IO 阻塞单线程完全能扛住海量操作。2. 单线程避免了多线程的开销与竞争多线程并发会带来几个很重的损耗Redis 单线程直接规避不需要频繁创建、销毁线程不用加锁、解锁不存在锁竞争、上下文切换消耗 CPU没有多线程共享资源带来的竞态问题底层数据结构不用复杂同步机制。 单线程串行执行命令天然线程安全省去大量并发同步开销。3. 采用 IO 多路复用模型高性能处理上万连接这是最关键的一点单线程不代表只能处理一个客户端连接。 Redis 底层使用 epollLinux/kqueue/select IO 多路复用一个线程同时监听成千上百个 socket 连接只有当某个客户端有读写事件就绪时才去处理没有事件时完全阻塞等待不消耗 CPU基于事件驱动不会为每个连接开辟线程极低资源占用支撑高并发连接。简单理解一个售票窗口单线程同时监听所有排队的人谁准备好了就处理谁不用一人开一个窗口。4. 高效的数据结构设计Redis 每种数据结构都是针对性优化的高性能实现String简单动态字符串 SDS减少内存拷贝List快速链表、压缩列表Hash/Set/ZSet跳表、哈希表查询、增删时间复杂度大多 O (1)、O (logn) 底层封装了很多内存优化、预分配、缩容策略命令运算本身极快单线程处理毫无压力。5. 避免系统调用与内存拷贝零拷贝思想读取数据回复客户端时使用系统 sendfile内核态直接传输减少用户态、内核态来回拷贝SDS、压缩列表减少多余内存复制降低 CPU 耗时 少量内存操作单线程执行效率极高。6. 耗时操作全部交给后台子线程不阻塞主线程虽然命令执行是单线程但重操作绝不占用主线程RDB 持久化fork 子进程完成AOF 刷盘、AOF 重写后台线程UNLINK 大键异步释放内存、大集合删除后台线程文件同步、集群数据同步独立线程 主线程只负责简单命令处理慢操作全部异步剥离不会阻塞读写。7. Redis6 引入多线程 IO补充加分Redis6 之后新增IO 多线程进一步提升网络读写性能命令解析、执行依旧是单线程网络数据的读缓冲区、写回响应交给多线程并行处理 解决大流量下网络 IO 成为瓶颈的问题进一步拉高 QPS 上限。补充单线程的短板单线程不是万能的如果执行耗时极高的命令会阻塞整个实例 比如 keys *、hgetall、超大集合遍历、长时间 Lua 脚本会卡住主线程所有客户端请求等待。 开发规范线上禁止全量遍历命令拆分大 key精简 Lua 执行逻辑。简短总结Redis 命令执行主线程单线程却很快核心五点全部数据内存存储无磁盘慢速 IOIO 多路复用单线程管理海量客户端连接单线程无锁竞争、无线程切换开销底层高度优化的高效数据结构持久化、大键删除等耗时操作异步子线程执行 Redis6 还增加 IO 多线程优化网络吞吐同时要注意避免慢命令阻塞主线程。