文章目录
一、Redis为什么能扛住百万并发?(灵魂拷问)
暴击三连问:单线程怎么处理高并发?多路复用到底复用了个啥?为什么说Redis6.0颠覆了传统认知?
别被"单线程"骗了!!!Redis的IO多路复用才是真核武器(epoll/kqueue黑科技),这个机制能让单个线程同时监控成千上万个socket连接。就像快递驿站老板同时接几十个电话,但实际取件还是得一个个来(单线程执行命令)。
不过注意!!!Redis6.0开始搞了多线程IO(只是网络IO部分哦),执行命令还是单线程——这波操作既保住了线程安全,又把网络吞吐量提升了3倍+!
二、持久化机制:AOF重写暗藏杀机
死亡连环问:RDB和AOF怎么选?AOF重写会阻塞服务吗?混合持久化是啥骚操作?
- RDB快照:就像定时拍照,bgsave时fork子进程(内存翻倍警告!)
- AOF日志:每句操作都记日记(注意fsync策略!always/everysec/no)
- 混合模式(Redis4.0+):RDB快照+AOF增量,鱼和熊掌我都要!
但小心AOF重写的坑!!!当AOF文件过大时,重写过程可能导致内存暴涨(原AOF+新AOF同时存在),记得监控aof_rewrite_buffer_size
!
三、缓存三大恶魔:穿透、击穿、雪崩(必考题)
1. 缓存穿透:请求直插数据库
- 症状:疯狂查不存在的数据(比如id=-1)
- 必杀技:布隆过滤器+空值缓存(设置短过期时间)
2. 缓存击穿:热点数据突然暴毙
- 高危场景:明星离婚新闻的缓存key刚好过期
- 神操作:互斥锁(Redis分布式锁)+永不过期+异步更新
3. 缓存雪崩:集体去世惨案
- 诱因:大量key同时过期 or Redis宕机
- 保命符:随机过期时间+集群部署+熔断降级
四、集群模式:从主从到Cluster的进化论
1. 主从复制(青铜段位)
- 全量复制风暴:第一次同步时可能把网卡打爆!
- 增量复制:基于repl_backlog_buffer的环形缓冲区
2. Sentinel哨兵(黄金段位)
- 监控+选主+通知三件套
- 脑裂风险:网络分区时可能出现双主(min-slaves配置是救命稻草)
3. Cluster集群(王者段位)
- 数据分片:16384个slot,每个节点负责部分槽位
- 迁移黑科技:
MOVED
和ASK
重定向的区别要分清!
五、源码级优化:内存管理玄学
夺命连环call:为什么字符串要叫SDS?ziplist和quicklist什么关系?跳跃表为什么不用红黑树?
-
SDS魔法:
struct sdshdr { int len; // 已用长度 int free; // 剩余空间 char buf[]; // 柔性数组 };
预分配+惰性释放,O(1)时间复杂度获取长度!
-
ziplist:
压缩列表是内存刺客(查询O(n)),适合小数据存储。当元素超过配置大小时,自动转成hashtable! -
跳跃表:
在zset实现中,跳表平均查询效率O(logN),且范围查询吊打红黑树!
六、Redis秒杀设计(实战核弹)
假设你要设计一个秒杀10台PS5的活动,Redis如何扛住10w并发?
- 库存预热:提前把库存扣到Redis(原子操作decr)
- 请求拦截:
- 令牌桶限流(别让请求直接打到Redis)
- 用户维度频率控制(1人1次机会)
- 最终一致性:
- 异步消息队列同步数据库
- 失败补偿机制(库存回滚)
注意!!!千万不要用keys *
查数据(会引发生产事故),用scan
命令慢慢游标遍历。大Key问题用memory usage
命令检测,记得拆分成多个小Key!
七、Redis7.0隐藏彩蛋
2024年面试官可能挖的新坑:
- Function特性:像存储过程一样玩Lua脚本
- Multi-part AOF:AOF文件拆分管理
- ACL权限控制加强版:精细到命令级别的权限
- 新的过期算法:从主动+被动到自适应过期
最后送大家一个避坑口诀:
集群模式防脑裂,持久化要注意内存
缓存问题三板斧,源码底层要摸透
管道事务分得清,安全性能两手抓
记住,Redis玩得6,Offer拿到手软!遇到不会的问题,就把面试官往你熟悉的领域带(比如多说说你处理过的大规模缓存架构实战)~