[TOC] #### 1. 前言 --- 我有一个朋友:“面了一家公司,简历写了熟悉 Redis,结果第一个问题就把我问懵了,Redis 为什么这么快?” 我说你别慌,这个问题看着简单,90% 的人答不好,不是不知道答案,是答得太散、太像背书。 今天我把这个问题讲透,看完你就有底气了 Redis 快,核心就五个原因,本文一个一个说,每个都会给你打个比方,保证你听完就忘不掉 #### 2. 数据在内存里 --- 很多人被问 “ Redis 为什么这么快” 的问题时,一般都会脱口而出,因为 Redis 数据存在内存里,所以它就快 数据在内存里,这个是快的最根本的原因(但也不仅是这个原因),我举个例子你就懂了: + 你正在写作业,参考书就放在桌上,翻一下就找到了 + 但如果参考书放在客厅的书柜里,你得站起来、走过去、找半天 + 内存就是你的桌面,磁盘就是客厅的书柜,Redis 数据全在桌面上,MySQL 数据在书柜里 速度差了多少 ?几万倍 所以 Redis 快的第一个原因,不是它多聪明,纯粹是它把数据放在了离 CPU 最近的地方 #### 3. 单线程 --- 你肯定觉得奇怪:单线程不是应该更慢吗 ? 我再打个比方,你去奶茶店买奶茶: + 如果店里有 5 个店员,但他们要抢同一个收银台、抢同一台制茶机,还得商量谁先做、谁后做 + 光 “商量” 这件事就浪费了不少时间 Redis 的做法是: + 就一个店员,来了就做,做完下一个,没有抢、没有等、没有商量 + 而且 Redis 做的都是内存操作,一个操作只要纳秒级,一个店员每秒能处理 10 万+ 杯奶茶 瓶颈根本不在 “做” 的速度,在 “顾客进门” 的速度,这就是为什么单线程反而快 #### 4. IO 多路复用 --- Redis 虽然是单线程处理命令,但它能同时盯着上万个连接,靠的是 Linux 的 `epoll` 机制 打个生活中的比方: + 你是一个快递驿站的老板,同时有 200 个快递到了 + 你不是站在门口等第一个快递员来了才签收、再等第二个,而是站在窗口扫一眼,谁到了就签收谁,没到的继续等 `epoll` 就是这个 “站在窗口扫一眼” 的动作,哪个连接有数据来了就处理哪个,不浪费时间干等 #### 5. 底层数据结构专门优化过 --- Redis 不是随便存数据的,每种数据类型底层都用了最合适的结构 + String 用 SDS,获取长度直接 O(1),不用一个个数 + Hash 小数据用 ziplist,紧凑得像压缩包,特别省内存 + ZSet 用跳表,做排行榜、范围查询很快 这些底层细节后面每一讲都会展开,现在你只要知道一件事:Redis 的底层设计很讲究,不是随便写的 #### 6. C 语言编写,无解释器开销 --- Redis 由 C 语言编写,代码经过 gcc 直接编译成 CPU 能识别的二进制机器指令,操作系统直接执行 C 语言直接编译成机器码,无虚拟机/解释器开销: + C:代码经过 gcc 直接编译成 CPU 能识别的二进制机器指令,操作系统直接执行; + Java:先编译 class,运行时 JVM 再解释 / 即时编译,多一层 JVM 中间层; + Python/PHP:纯解释执行,边读代码边翻译,速度差距巨大 #### 7. 本文小结 --- 面试的时候你可以这么答,Redis 快的主要五个原因: + 数据在内存里,省掉了磁盘 IO + 单线程避免了锁竞争和线程切换 + IO 多路复用高效处理大量连接 + 底层数据结构针对不同场景做了专门优化 + 因为是 C 语言编写,直接编译成机器码,无虚拟机/解释器开销 简洁、准确、有逻辑,面试官会觉得你是真理解了