高频面试--redis
Reids
1. 常见的数据结构(string, list, hash, set, zset)
答法模板:
Redis 提供五种核心数据结构:
String
:最基本的类型,支持整数、自增、自减、位操作。
List
:双端链表,支持消息队列(如 LPUSH/RPOP)。
Hash
:键值对集合,适合存储对象(如用户信息)。
Set
:无序集合,支持去重、集合运算(如交并差)。
ZSet
(Sorted Set):有序集合,元素按 score 排序,适用于排行榜。
可加一句:
实际开发中我用 ZSet 做过文章点赞排行榜,Set 做签到记录,List 做延迟队列等。
2. ZSet 的底层实现
答法模板:
ZSet 底层是 跳表(SkipList)+ 哈希表(HashMap) 的组合:
哈希表用来快速定位元素(O(1));
跳表用于按 score 排序,支持范围查询(O(log n))。
可补一句:
跳表在性能上接近平衡树,但实现简单,Redis 源码中使用跳表而非红黑树。
3. Redis 分布式锁实现(原子性、死锁问题)
答法模板:
Redis 分布式锁常用
SET key value NX PX timeout
保证原子性(一次性设置键和过期时间)。
使用唯一标识避免误删;
删除时用 Lua 脚本保证检查和删除是原子操作;
避免死锁要设置过期时间;
复杂业务推荐用 Redisson,它实现了可重入锁、看门狗续约等机制。
4. AOF 重写机制
答法模板:
AOF(Append Only File)是 Redis 的持久化方式之一。
AOF 重写(rewrite)会在文件过大时触发;
并不是清空旧文件,而是重新生成最短命令集合;
AOF 重写过程是后台线程完成,不影响主线程。
可补一句:
Redis 会同时维护新旧 AOF 文件,在 rewrite 成功后再原子性切换。
5. RDB 的写时复制技术(Copy-On-Write)
答法模板:
RDB 是通过
fork()
子进程生成快照。
子进程把内存数据写入磁盘;
主进程继续服务;
Redis 使用写时复制(Copy-On-Write),保证 fork 后内存修改不会影响子进程写入快照。
6. Redis 集群为什么采用 Gossip 协议同步数据
答法模板:
Redis Cluster 中节点通过 Gossip 协议互相传播节点状态,实现故障感知。
每个节点周期性 ping 其他节点;
如果多个节点判断某节点不可达,即认为该节点挂了;
Gossip 协议保证了集群的可扩展性和容错性。
7. Redis 分片解决单机实例压力大问题
答法模板:
Redis Cluster 采用哈希槽分片方案,共 16384 个槽位,每个主节点负责一部分槽。
key 会通过 CRC16 算法映射到槽;
不同槽分布在不同节点,实现负载均衡;
节点可动态扩容或迁移槽。
8. MySQL 与 Redis 数据一致性问题
答法模板:
Redis 是缓存层,MySQL 是持久层,典型一致性问题有:
缓存穿透:查询不存在数据 → 使用布隆过滤器或缓存空值;
缓存击穿:热点 key 过期瞬间高并发访问 → 加互斥锁(互斥更新);
缓存雪崩:大量 key 同时过期 → 设置过期时间随机化;
读写一致性:采用「先写数据库,后删缓存」策略;或使用消息队列异步刷新。
🧠 总结面试技巧:
-
回答时注意层次清晰:“现象 → 原因 → 方案”
-
能举实际项目中的使用更加分
-
不确定的地方坦诚说“我理解的是……”,不要硬编