redis
缓存三兄弟
- 为什么“击穿”会有危害?(以周杰伦为例)
想象一下,周杰伦要开演唱会,大家都去刷票:
- 正常情况(有缓存):大家先去“公告栏”(Redis)看有没有票。公告栏写着“有票”,大家看了就走,不去骚扰“售票员”(数据库)。售票员很清闲,在喝咖啡。
- 击穿瞬间(缓存过期):突然,公告栏的纸掉地上了(Redis 键过期了)。
- 灾难发生:就在这一秒,10万个粉丝发现公告栏没写票数,于是全部涌向“售票厅”问那个售票员:“还有票吗?”
- 后果:售票员只有两只手,10万个人同时挤过来,售票厅的门被挤烂了,售票员当场晕倒(数据库 CPU 飙升到 100%,连接池爆满,直接挂掉)。
结论: 危害不在于“没票”,而在于瞬间涌入的巨大流量,会把脆弱的数据库直接打瘫痪。
- 为什么“穿透”会有危害?(以“捣乱分子”为例)
你可能会问:查一个不存在的 ID,数据库返回“空”不就行了?
- 场景:有个黑客写了个脚本,每秒钟发 1万个请求查 ID = -999 的用户。
- 危害:
1. 缓存拦不住:Redis 发现没这个 ID,只能放行。
2. 数据库白干活:数据库每次都要去磁盘里搜半天,最后告诉你“查无此人”。
3. 结果:数据库一直在做无用功,正常的业务请求反而进不来了。就像有个骚扰电话一直打,你真正重要的电话就接不进来了。
- 为什么“雪崩”最致命?(以“商场停电”为例)
场景:你给所有的商品缓存都设置了“1小时过期”。
雪崩发生:1小时到了,商场里所有的柜台(所有的 Key)同时撤柜。
危害:
- 原本 Redis 能挡住 99% 的压力,现在 100% 的压力全部转给数据库。
- 数据库就像一个本来只管收银的会计,突然要负责全商场成千上万种商品的导购、理货、收银。
- 连锁反应:数据库一挂,依赖数据库的订单系统、支付系统、物流系统全部跟着挂掉。整个公司的业务停摆。
💡 总结面试“得分点”:
如果面试官问你危害,你就答这三句话:
1. 击穿:会导致热点数据失效瞬间,海量请求冲击数据库,造成单点崩溃。
2. 穿透:会导致数据库被无效请求频繁骚扰,白白消耗资源,影响正常业务。
3. 雪崩:会导致大规模数据同时失效,引发系统级灾难,甚至导致整个后端服务链条瘫痪。
核心逻辑: 缓存的存在是为了保护数据库。任何让保护罩消失的行为,都是在让数据库“裸奔”。
高频夺命3题
- Redis 这么快,除了在内存里,还因为啥?
面试官: “大家都说 Redis 快,是因为它单线程。为啥单线程反而快?”
- 保命话术:
1. 没有上下文切换:多线程就像几个人轮流用一台电脑,切来切去(上下文切换)很费时间。单线程就是一个人从头干到尾,省了切换开销。
2. 没有锁竞争:多线程改同一个数据要加锁、放锁,单线程完全不用担心“抢地盘”,直接改就行。
3. IO 多路复用(重点词汇):就像一个服务员(单线程)同时管 10 桌客人的需求。哪桌菜好了他就去端,而不是死等一桌吃完才管下一桌。
- 万一断电了,Redis 的数据不就全丢了吗?(持久化)
面试官: “Redis 是内存数据库,宕机了怎么办?RDB 和 AOF 有啥区别?”
- 类比理解:
- RDB (快照):就像拍照片。每隔一段时间,给全内存的数据拍张照存磁盘。
- 优点:恢复极快(直接看照片恢复现场)。
- 缺点:会丢数据。如果 10 点拍照,10 点 05 分断电,这 5 分钟的数据就没了。
- AOF (日志):就像记账本。每执行一个写命令,就往本子上记一笔 set name jack。
- 优点:数据最全,基本不丢。
- 缺点:账本(日志文件)会变得超级大,恢复的时候要重演一遍所有命令,慢得要死。
- RDB (快照):就像拍照片。每隔一段时间,给全内存的数据拍张照存磁盘。
- 面试得分点: 现在的主流是混合持久化(照片 + 增量日志),既快又不丢。
- Redis 内存满了怎么办?(过期与淘汰)
面试官: “如果你给 Key 设了过期时间,Redis 是准时准点把它删掉吗?”
- 真相(并不是准时删):
- 定期删除:Redis 每隔一段时间随机抽几个 Key 检查,过期了就删。就像老师抽查作业,没抽到的即便过期了也还在内存里。
- 惰性删除(保命大招):你查哪个 Key,Redis 才检查哪个。如果过期了,当场删掉并告诉你“没了”。
- 追问:如果过期了没被抽到,也没人查,内存爆了怎么办?
- 内存淘汰策略(八股核心词:LRU):Redis 会触发“末位淘汰制”,把最近最少使用的数据给踢出去,给新数据腾位置。
💡 你的“复习小纸条”:
- 单线程快:没锁、没切换、IO多路复用。
- RDB vs AOF:一个是“全家福照片”,一个是“详细账本”。
- 删过期数据:靠“抽查”和“查到才删”,实在不行就按“LRU”踢人。
提问
- Q: 如果我有100w个key同时设置了5分钟后过期,会出现什么问题
A: 第一点是可能会出现缓存雪崩的问题,大量请求冲向数据库,直接把后端瘫痪 可以在这5分钟的过期时间设置随机微调值,第二点是redis的过期扫描删除是抽一些key如果过期比例超过25%就继续抽,会导致一直抽,一直删除,又因为是单线程,会影响redis的读写性能,导致程序变慢
- redis中有哪些数据结构
string hash list set sortedset
string 存简单值 hash 键值对存对象 list存队列 set去重 sortedset做排行榜