一、Redis为什么这么香?
各位程序员老铁们(敲黑板)!Redis这个神仙中间件现在可是面试必考题,但凡是个互联网公司,没有不问Redis的!它用C语言写的单线程模型,6万+/秒的QPS直接把传统数据库秒成渣(不是夸张)!内存操作+IO多路复用机制,这组合拳打得MySQL直喊顶不住啊!
不过Redis的面试题套路其实很固定,今天我就把压箱底的7大必考问题整理出来,保准你面完试面试官追着你喊"Offer拿来"!
二、灵魂拷问第一弹:数据结构
面试官最爱问:“Redis支持哪些数据结构?各自的应用场景是啥?”
别傻乎乎只背答案!要体现深度可以这么说:
“Redis支持5种基础数据结构:String、List、Hash、Set、SortedSet。但其实还有3个隐藏款:Bitmaps(位图)、HyperLogLog(基数统计)、GEO(地理位置)。像我们的签到功能就是用Bitmaps实现的,每天0.1MB就能存100万用户的签到数据!”
必杀技补充:
- String底层是SDS(简单动态字符串),比C字符串更安全高效
- Zset用了跳跃表+字典的双数据结构,范围查询快到飞起
- Hash的底层有两种编码方式:ziplist(省内存)和hashtable(高性能)
三、死亡问题:持久化机制
这个问题简直是面试官的快乐源泉!RDB和AOF的区别必须门儿清:
| RDB | AOF | |
|---|---|---|
| 持久化方式 | 内存快照 | 追加操作日志 |
| 文件大小 | 小(二进制压缩) | 大(文本格式) |
| 恢复速度 | 快 | 慢 |
| 数据安全 | 可能丢失几分钟数据 | 最多丢失1秒数据 |
| 写性能 | 高(fork子进程处理) | 低(每次都要写磁盘) |
划重点:Redis4.0开始支持混合持久化!先写RDB快照,再把期间的增量命令用AOF记录,重启时先加载RDB再重放AOF,鱼和熊掌我全都要!
四、缓存三连杀:雪崩/穿透/击穿
这三个坑爹问题搞垮过多少系统!说解决方案时一定要有层次:
-
缓存雪崩(大量key同时过期):
- 随机过期时间:比如基础过期时间+随机1-5分钟
- 永不过期+后台更新:有个定时任务悄悄更新缓存
- 熔断降级:Hystrix搞起,数据库顶不住时直接返回默认值
-
缓存穿透(查询不存在的数据):
- 布隆过滤器YYDS!查询前先过一遍过滤器
- 缓存空对象:注意设置较短过期时间,别把垃圾数据堆满内存
- 接口校验:比如ID必须大于0,参数格式校验
-
缓存击穿(热点key突然失效):
- 互斥锁:第一个请求重建缓存时加锁,其他请求等待
- 逻辑过期:缓存不设置过期时间,在value里存过期时间字段
- 永不过期:配合后台更新策略,适合特别热的数据
五、集群模式怎么选?
Redis的集群方案能搞懵新手,记住这三个场景:
- 主从复制:一主多从,读写分离。但主库挂了要手动切换,适合小型系统
- 哨兵模式:自动监控主节点,故障自动转移。但写操作还是单点,容量有限
- Cluster模式:官方推荐!数据分片存储,每个节点保存部分数据,支持水平扩展。用哈希槽(16384个槽)分配数据,节点增减自动迁移数据
避坑指南:集群模式下批量操作(比如mget)的key必须在一个slot,可以用hash tag强制指定,比如把{user1001}.profile和{user1001}.orders分到同一个节点
六、单线程为什么这么快?
这个问题80%的人答不全!除了"内存操作"和"I/O多路复用",还要说这些:
- 纯内存操作:没有磁盘IO瓶颈
- 单线程避免上下文切换:虽然6.0引入了多线程IO,但核心操作还是单线程
- 高效数据结构:比如跳跃表、字典等查询都是O(1)复杂度
- Reactor模式:基于epoll的非阻塞IO,网络处理超高效
- 协议简单:RESP协议解析快如闪电
冷知识:Redis6.0的多线程只是处理网络IO,执行命令还是单线程,所以不存在线程安全问题!
七、实战场景怎么用?
只会理论可不行!举个实际案例镇场子:
"我们电商系统的秒杀功能用Redis做了三件事:
- 库存预扣减:用DECR原子操作防止超卖
- 频控限制:每个用户ID+活动ID作为key,incr统计次数
- 排队机制:用List结构做异步队列,前端轮询排队进度
遇到大流量时,通过Lua脚本保证多个操作的原子性。比如:
local stock = redis.call('get', KEYS[1])
if stock and tonumber(stock) > 0 then
redis.call('decr', KEYS[1])
return 1
end
return 0
这样既保证了原子性,又减少了网络开销。"
八、写在最后
Redis的学问三天三夜都讲不完,但搞定这7个问题绝对能让你在面试中脱颖而出!最后送大家两个锦囊:
- 一定要动手搭集群!用docker起3主3从的Cluster模式,实操一遍增删节点
- 学会用redis-benchmark做压力测试,亲眼看看单线程的威力
记得点赞收藏,下次面试前翻出来看看,保准你底气十足!要是还有其他Redis难题,评论区砸过来,咱们接着唠!
1万+

被折叠的 条评论
为什么被折叠?



