文章目录
一、Redis为什么能抗住百万并发?(必考题)
老铁们先记住这个公式:单线程+多路复用=性能怪兽!!!(这个组合拳打得MySQL直喊疼)Redis基于内存操作不用说了吧?但最骚的是它的单线程模型,完全避免了线程切换的开销。配合epoll这种IO多路复用技术,一个线程就能处理成千上万的连接请求。这就是为什么Redis单机就能轻松扛住10W+ QPS的秘诀!
二、数据类型全家桶怎么用才专业?
面试官就爱问这个!我当年就被连环追问过:
- String:不只是存字符串!分布式锁(setnx命令)、计数器(incr命令)都是它的骚操作
- Hash:电商购物车场景必备(用户ID+商品ID+数量三层结构)
- List:消息队列(注意不是专业的MQ!)、最新消息排行
- Set:共同好友计算(sinter命令直接起飞)、抽奖去重
- ZSet:实时排行榜(带权重的排序简直不要太爽)
(面试加分项)突然压低声音说:“其实我们项目用HyperLogLog做UV统计,误差不到1%,内存省了20倍!”
三、持久化双雄对决:RDB vs AOF
这是道送命题!搞混了直接凉凉:
RDB | AOF | |
---|---|---|
持久化方式 | 内存快照 | 操作日志追加 |
数据安全 | 可能丢失最后一次保存 | 最多丢失1秒数据(appendfsync配置) |
恢复速度 | 快得一匹 | 慢得像蜗牛 |
文件大小 | 小(二进制压缩) | 巨大(可重写优化) |
(血泪教训)有次线上用RDB每小时保存,结果服务器突然宕机,丢了55分钟数据!现在都是RDB+AOF混合持久化(Redis4.0+新特性),真香!
四、缓存三连击:穿透、雪崩、击穿
这三个坑我全踩过!画个表格说清楚:
现象 | 原因 | 必杀技 | 实战解决方案 |
---|---|---|---|
穿透 | 查不存在的key | 布隆过滤器(记得用redisson的实现) | 缓存空对象+短过期时间 |
雪崩 | 大量key同时过期 | 随机过期时间 | 集群部署+热点数据永不过期 |
击穿 | 热点key突然失效 | 互斥锁(分布式锁要慎用!) | 永不过期+逻辑过期时间双保险 |
(防坑指南)上次用互斥锁解决击穿,结果死锁了!后来改用redisson的看门狗机制才解决,切记锁的过期时间要大于业务执行时间!
五、主从复制暗藏玄机
你以为配个slaveof就完事了?大错特错!
- 全量复制:master生成RDB时,新写入的命令会存到复制缓冲区(太小会触发二次全量复制!)
- 增量复制:基于offset的断点续传(网络闪断救星)
- 星型架构:一主多从建议用树状结构,避免master网络带宽被打满
(骚操作)线上遇到过从节点卡死,后来发现是master的repl-backlog-size设置太小,改成100MB后稳如老狗!
六、哨兵模式真的可靠吗?
用过哨兵的都知道这三个致命问题:
- 选举期间服务不可用(脑裂警告!)
- 故障转移可能丢数据(异步复制惹的祸)
- 集群规模受限(超过5个节点就头大)
所以现在都推荐Redis Cluster!但面试官就爱问这个,记住这三个重点:
- 主观下线和客观下线的区别
- 哨兵之间用gossip协议通信
- 故障转移时的leader选举算法(Raft变种)
七、Redis事务是鸡肋吗?
先说结论:事务不能回滚(惊不惊喜?)但multi/exec命令在以下场景真香:
- 批量操作减少网络开销(比如秒杀扣库存+记录日志)
- watch命令实现乐观锁(比MySQL的for update轻量多了)
- Lua脚本才是真·原子操作(官方推荐玩法)
(血案重现)曾经用事务处理库存,结果发现ABA问题!后来改用Lua脚本才解决,切记事务里的命令要幂等!
八、内存淘汰策略怎么选?
当内存到达maxmemory时,这8种策略让你怀疑人生:
- allkeys-lru:最常用(但要注意冷数据突然变热)
- volatile-lfu:更精准的计数(4.0+版本专属)
- allkeys-random:适合随机访问场景
- noeviction:直接报错(生产环境慎用!)
(调优经验)曾经用allkeys-lru导致最近登录的用户数据被删!后来改用volatile-lru,给常驻数据设置永久过期时间完美解决。
九、Cluster集群的槽位玄学
这是面试终极BOSS!必须掌握:
- 16384个哈希槽(为什么不是65536?因为作者说够用了…)
- 节点通信采用gossip协议(比哨兵更高效)
- 跨槽操作要用hash tag(比如{user1000}.order)
- 迁移数据时的ASK重定向机制
(实战踩坑)迁移槽位时客户端报MOVED错误?这是正常现象!要用asking命令配合重试,记得升级客户端版本!
防挂指南(救命稻草)
最后送大家三个保命锦囊:
- 被问原理时,先画架构图再说细节(面试官就爱看这个)
- 回答场景题要遵循:场景->问题->方案->优化的套路
- 遇到不会的题,就聊类似问题的解决思路(比如把击穿问题解法迁移到雪崩)
记住,Redis面试本质是考系统设计能力!把这些原理和实战经验融会贯通,offer还不是手到擒来?冲就完事了!