2026/8/21 20:23:08

小米二面真题:Redis 为什么能支撑 10 万\+ QPS?

小米二面真题:Redis 为什么能支撑 10 万\+ QPS? 我们是由枫哥组建的IT技术团队成立于2017年致力于帮助IT从业者提供实力成功入职理想企业我们提供一对一学习辅导由知名大厂导师指导分享Java技术、参与项目实战等服务并为学员定制职业规划全面提升竞争力过去8年我们已成功帮助数千名求职者拿到满意的OfferIT枫斗者、IT枫斗者-Java面试突击、Java AI Agent面试题库 RAG MCP 260题 3项目源码 Spring AI 实战。小米二面真题Redis 为什么能支撑 10 万 QPS前段时间有小伙伴面试小米被问到一道经典高频题Redis 为什么能支撑 10 万 QPS他只答了一句“因为 Redis 是内存数据库”。面试官立刻追问Memcached 也是内存数据库为什么 Redis 数据结构更复杂、功能更多速度却还能持平甚至更快当场语塞直接挂科。很多人只知“内存快”却不懂 Redis高并发、高吞吐的整套底层设计。今天这篇文章带你系统性吃透这道面试原题一次性搞定 Redis 高性能核心原理面试直接满分作答。一、先搞懂10万 QPS 是什么水平先看 Redis 官方基准测试普通笔记本环境直观感受它的性能天花板GET 请求约 103,504 QPSSET 请求约 100,894 QPSINCR 请求约 99,662 QPS开启 Pipeline 批量操作INCR 直接飙升至106万 QPS面试官真正想听的从来不是“存在内存里”。Redis 的十万 QPS 是内存架构 极致数据结构 优秀 IO 模型 多核优化四大核心支柱共同实现的结果。二、支柱一内存存储从根源碾压磁盘数据库Redis 所有数据默认常驻内存彻底规避了磁盘 IO 的致命瓶颈。速度量级差距肉眼可见内存单次访问0.1 微秒磁盘随机 IO10 毫秒内存比磁盘快整整 10 万倍。举个真实场景对比从 1000 万用户数据中查询单条信息MySQL带索引至少 2~3 次磁盘 IO耗时约2000msRedis内存哈希直接寻址耗时约0.1ms这是维度级的性能碾压也是 Redis 高吞吐的基础前提。三、支柱二极致定制化数据结构零冗余高性能这是 Redis 吊打普通内存 KV 数据库Memcached的关键。Redis 五大基础结构String、Hash、List、Set、ZSet全部是自研优化结构不是简单封装每一种都为高性能、低内存、低耗时设计。3.1 SDS 简单动态字符串String 底层C 语言原生字符串存在两大痛点获取长度 O(N)、易缓冲区溢出、频繁内存重分配。Redis 自研 SDS 结构彻底解决问题structsdshdr{intlen;// 已使用长度 O(1) 获取intfree;// 未使用空闲长度charbuf[];// 实际字节数组};核心优势获取字符串长度 O(1)直接读取 len 字段无需遍历杜绝缓冲区溢出修改前校验空闲空间自动扩容空间预分配扩容时预留空闲空间减少频繁 realloc 开销惰性释放缩容不立即回收内存复用空闲空间3.2 Ziplist 压缩列表Hash/List 底层优化当 Hash、List 元素少、值较小时Redis 自动启用 Ziplist。它是一段连续内存块无指针冗余、内存极度紧凑能完美命中 CPU 缓存。启用条件元素数量 512 且 单个值长度 64 字节核心优势极致节省内存、CPU 缓存命中率极高遍历速度远超普通链表3.3 SkipList 跳表ZSet 底层有序集合没有使用实现复杂、自旋开销大的红黑树而是选用跳表。特性多层索引链表查找、插入、删除时间复杂度O(logN)优势实现简单、无锁复杂逻辑、范围查询极强完美适配排行榜、延时队列场景3.4 哈希表渐进式 rehash普通哈希表扩容会一次性迁移所有数据瞬间卡顿、阻塞服务。Redis 采用渐进式 rehash扩容后同时保留新旧两张哈希表每次读写操作顺带迁移少量数据分批平摊开销全程无卡顿、无阻塞彻底避免了大字典扩容导致的服务抖动保障高并发稳定性。四、支柱三单线程 IO多路复用极致并发模型很多人疑惑单线程为什么能支撑 10万 高并发核心答案Redis 瓶颈不在 CPU而在网络 IO。4.1 单线程命令执行的优势无锁竞争不需要线程同步、锁等待、CAS 自旋节省大量开销执行串行安全天然保证命令原子性无需额外事务锁逻辑简单高效避免多线程上下文切换损耗4.2 IO 多路复用epollRedis 基于 Linux epoll 实现 IO 多路复用一个线程监听上万客户端连接只处理有事件就绪的连接。不会空轮询、不会阻塞用极小线程资源支撑海量并发连接这是高吞吐的核心关键。五、支柱四Redis6.0 多核 IO 线程优化6.0 版本之前Redis 全程单线程高流量下网络读写会成为瓶颈。6.0 引入IO 多线程模型做到各司其职、兼顾性能与稳定性IO 读多线程并行批量读取客户端请求、解析协议命令执行依然单线程保证命令串行、原子性、无并发问题IO 写多线程并行批量回写响应数据到客户端既利用了多核 CPU 提升网络吞吐又保留了单线程执行的简单可靠完美解决高并发网络瓶颈。六、额外性能助推器面试加分项6.1 Pipeline 批量命令普通命令每次都会产生一次网络往返Pipeline 可一次性打包多条命令发送大幅减少网络 RT 开销吞吐直接翻倍。JedisjedisnewJedis(localhost);Pipelinepjedis.pipelined();for(inti0;i1000;i){p.incr(counter);}p.sync();6.2 规避大 Key 阻塞单线程执行最怕大 Key读取、删除大 Key 会阻塞主线程拖垮整体 QPS。可通过redis-cli --bigkeys检测优化保障服务平稳运行。6.3 压测场景关闭持久化RDB、AOF 持久化会带来磁盘 IO 开销纯缓存、压测场景可关闭持久化性能拉满。七、Redis 优缺点与适用场景总结优点缺点适用场景性能极高10万 QPS内存存储成本更高业务缓存加速数据结构丰富灵活单线程易被大Key阻塞实时计数器、限流支持持久化、高可用集群单节点存储容量有限分布式锁、排行榜原子性命令、并发安全存在缓存穿透/击穿/雪崩风险社交Feed、热点数据全文总结面试标准满分答案Redis 能支撑 10万 QPS是四大核心能力共同作用的结果内存存储彻底规避磁盘 IO 瓶颈从底层拉开性能差距极致数据结构SDS、Ziplist、跳表、渐进式 rehash 全方位优化耗时与内存单线程IO多路复用无锁竞争、无上下文切换高效处理海量并发连接6.0 IO多线程利用多核提升网络吞吐保留核心执行逻辑简单可靠。Redis 的高性能不是单一优势是整套架构设计的完胜。⭐️推荐:Offer训练营介绍Java 面试 后端通用面试八股文Java后端企业级实战面试Java后端校招算法学习