为什么Redis像极速快递站一样,速度如此之快?
摘要:咱们先从一个真实场景切入:电商大促时,每秒几万用户查商品库存,MySQL(传统数据库)查一次要几百毫秒,甚至卡崩;但Redis查一次只要几微秒,扛住百万请求都不慌。 为啥差距这么大?我把Redis比作一个「开在市中心的极速快递站」,把传统数
咱们先从一个真实场景切入:电商大促时,每秒几万用户查商品库存,MySQL(传统数据库)查一次要几百毫秒,甚至卡崩;但Redis查一次只要几微秒,扛住百万请求都不慌。
为啥差距这么大?我把Redis比作一个「开在市中心的极速快递站」,把传统数据库(比如MySQL)比作「开在郊区的大型仓储超市」,用这个故事把Redis快的本质讲透——它的快,不是靠“堆硬件”,而是从底层设计到每一步操作,都在极致追求“少走路、少等待、少折腾”。
故事开场:用户要查库存,两个地方的不同表现
用户(客户端)喊:“我要查iPhone 16的库存!”
仓储超市(MySQL):得派员工开车去郊区仓库(磁盘)找货,路上堵车、找货翻货架,来回要几十分钟(几百毫秒);
极速快递站(Redis):员工站在市中心柜台(内存)前,伸手就拿到库存单,1秒都不到(几微秒)。
这就是Redis快的第一个核心本质:纯内存操作,彻底绕开磁盘的慢。
一、第一大绝招:全在「内存柜台」干活,绝不跑「磁盘仓库」(最核心)
故事版
快递站的老板很聪明:所有用户高频要查、要改的货(比如库存、用户会话、热点数据),全都摆在市中心的玻璃柜台(内存)上,员工不用跑郊区,伸手就拿、抬手就放。
而且柜台空间虽小,但存取速度极快——员工一秒能处理几百上千个请求,根本不耽误事。
只有极少数时候(比如晚上没人时),才会把柜台的货备份到郊区仓库(磁盘持久化),白天接单时绝不碰仓库。
本质剖析
内存 vs 磁盘的速度差,是天壤之别:
内存(RAM)的读写速度是纳秒/微秒级(1微秒=1000纳秒),磁盘(机械硬盘)是毫秒/秒级(1毫秒=1000微秒)。
简单说:内存比机械硬盘快10万100万倍,比固态硬盘(SSD)也快1001000倍。
Redis 99%的操作都在内存里完成:
它的核心数据(键值对)全存在内存中,读、写、删都是直接操作内存,没有磁盘IO的延迟。
哪怕做持久化(RDB/AOF),也是后台异步执行,绝不阻塞前台处理用户请求的主线程——白天接单、晚上备份,两不误。
这是Redis快的根基,没有这一点,后面所有优化都是白搭。
二、第二大绝招:一个「超级熟练工」单干,绝不搞「多人内耗」(单线程设计)
故事版
快递站只有一个超级熟练的员工(单线程),所有用户请求都由他一个人处理:
不用和其他员工抢柜台(无锁竞争);
不用频繁交接工作(无上下文切换);
不用等别人干完自己再干(无阻塞等待)。
他全程专注,一个请求接一个请求,手速快到飞起。
反观仓储超市,雇了十几个员工(多线程),大家抢货架、抢推车,还要排队等锁,反而越忙越乱,效率极低。
本质剖析
Redis是「单线程处理核心命令」:
注意:这里的单线程,是指处理用户读写命令的主线程是单线程(后台还有线程做持久化、集群同步,但不影响核心流程)。
单线程为什么反而更快?
无锁竞争:多线程操作共享数据(比如库存),必须加锁(比如MySQL的行锁、表锁),加锁、解锁、等待锁释放,全是耗时开销;Redis单线程不用加锁,直接操作数据,零开销。
无上下文切换:多线程切换时,CPU要保存上一个线程的状态、加载下一个线程的状态,每次切换都要耗时;Redis单线程全程不切换,CPU利用率拉满。
逻辑极简:单线程不用处理复杂的线程同步、死锁问题,代码逻辑简单,执行效率极高。
关键误区:单线程不代表“只能处理一个请求”,后面会讲它怎么同时扛百万请求。
三、第三大绝招:同时盯「所有窗口」,绝不「傻等一个客户」(IO多路复用)
故事版
快递站的员工虽然只有一个,但他同时盯着几百个窗口(网络连接):
哪个窗口的客户喊“查库存”,他就立刻处理;
哪个窗口的客户还在磨蹭(网络延迟),他就先不管,继续盯其他窗口;
绝不站在一个窗口前傻等,浪费时间。
比如1000个客户同时来,他一秒内能轮着处理完999个,只有1个在磨蹭的,等他磨完再处理。
本质剖析
解决“网络等待”的痛点:
用户请求不是直接到Redis,要经过网络传输(比如从手机到服务器),这个过程有延迟(IO等待)。如果Redis傻等一个请求的网络数据,其他请求就会卡住。
IO多路复用:一个线程监听成千上万个网络连接:
Redis用了Linux系统的epoll(最先进的IO多路复用技术),单线程就能同时监听成千上万个客户端连接:
系统会告诉Redis:“哪个连接有数据来了,你去处理”;
Redis只处理“有数据的连接”,对“没数据的连接”完全不浪费时间。
结果:单线程+IO多路复用,让Redis能同时处理百万级客户端连接,而且每个请求的处理延迟都极低——这是它扛高并发的关键。
