文章目录
前言
最近帮学弟模拟面试(被虐得真惨啊!!),发现Redis绝对是后端岗必问的"硬骨头"。今天就把那些让面试官眼睛发亮的Redis必考题扒个底朝天,附带超多实战踩坑经验!(文末有绝密避坑指南)
一、Redis持久化连环问(送命题预警!)
1.1 RDB快照到底怎么玩的?
(画外音:面试官绝对会从这里开始挖坑!)
RDB就是给内存数据拍快照。想象你在玩《原神》时突然断电——下次登录时系统问你要不要读档,这个存档就是RDB!(手动保存用SAVE
,后台保存用BGSAVE
)
致命陷阱:bgsave
执行时主线程还能写数据吗?(答案:可以!因为fork了子进程操作)
# 最新配置建议(2024最佳实践):
save 900 1 # 15分钟有1次修改就保存
save 300 10 # 5分钟10次修改
stop-writes-on-bgsave-error no # 重要!防止磁盘满导致Redis罢工
1.2 AOF持久化暗藏杀机
当面试官邪魅一笑:“说说AOF重写吧…” 这时候千万稳住!
AOF就像记日记,但日记本太厚了怎么办?重写机制就是帮你把"给张三转账100"+“给张三转账200"合并成"最终给张三转账300”(突然想起我那混乱的大学账本…)
魔鬼细节:
appendfsync always
性能杀手!(但适合金融场景)- AOF重写时突然断电怎么办?(双重保险:AOF重写缓冲区+新文件原子替换)
二、缓存三连杀:穿透、击穿、雪崩(送分题变送命题!)
2.1 缓存穿透:黑客的快乐源泉
举个栗子:疯狂请求id=-1的数据(数据库根本没有!)
解决方案全家桶:
- 布隆过滤器(注意误判率设置!我曾在电商项目栽过跟头)
- 缓存空值(记得设置短TTL,别问我怎么知道的)
- 接口层校验(比如id<=0直接拦截)
2.2 缓存击穿:热搜的代价
想象大V突然发微博,百万请求瞬间涌向同一个过期key…(某明星离婚公告导致我们系统挂掉的惨痛经历)
双重保险锁:
public Object getData(String key) {
Object val = redis.get(key);
if (val == null) {
if (redis.setnx(key_mutex, 1)) { // 拿到锁
// 查数据库
redis.set(key, value);
redis.del(key_mutex);
} else {
Thread.sleep(50);
return getData(key); // 递归重试
}
}
return val;
}
(注意设置锁超时时间!否则死锁让你哭晕在厕所)
三、分布式锁的修罗场
3.1 SETNX的致命缺陷
新手最爱写法:
SETNX lock_key 1
EXPIRE lock_key 10
(大坑预警!这两个命令不是原子的,中间宕机就死锁)
2024推荐方案:
SET lock_key uuid EX 10 NX # 一条命令搞定
3.2 Redlock算法争议
Redis作者和分布式大佬Martin的世纪撕逼(吃瓜传送门:Redis官网)
建议回答:“根据业务场景选择,对一致性要求极高用Zookeeper,一般场景单Redis实例足够”
四、Redis集群灵魂拷问
4.1 主从复制同步原理
被问到"增量复制"时,一定要抛出这两个关键点:
- 复制偏移量(replication offset)
- 环形缓冲区(repl_backlog)
血泪教训:曾经因为repl-backlog-size
设置太小导致全量同步循环,监控告警炸了…
4.2 Cluster分片玄机
哈希槽(Hash Slot)的设计妙在哪?16384个槽位的秘密:
- CRC16算法最大值是2^16=65536
- 但16384(2^14)足够用且节省心跳包空间(每个节点心跳包携带自己负责的slots信息)
五、实战避坑指南(价值10个年包!)
- BigKey排查:用
redis-cli --bigkeys
扫描时,小心它会改变数据访问模式! - 热key发现:用
redis-cli --hotkeys
(需要开启LFU策略) - 内存暴增急救:突然设置
maxmemory-policy volatile-lru
可能导致数据丢失!(建议提前配置) - 集群运维黑科技:遇到节点故障转移时,记得检查
cluster-node-timeout
配置
最后
最近发现个细思极恐的现象:90%的候选人知道Redis单线程,但只有10%能说清为什么单线程还这么快!(参考答案:基于内存操作+IO多路复用+高效数据结构)
下次面试被问Redis时,记得把本文知识点像机关枪一样抛出来(但要注意节奏!),保证让面试官眼前一亮。祝大家拿到心仪的offer!(要是真拿到了记得回来还愿啊~)