中间件面试题
整理Redis、消息队列、数据库等中间件的面试题,包含详细的答案和解析。
📋 题目分类
🎯 一、Redis
1. Redis的数据类型有哪些?
答案:
Redis的数据类型:
- String:字符串
- Hash:哈希表
- List:列表
- Set:集合
- Sorted Set:有序集合
- Bitmap:位图
- HyperLogLog:基数统计
- Stream:流
2. Redis的持久化机制?
答案:
Redis持久化机制:
RDB(Redis Database)
- 快照方式
- 定期保存数据快照
- 文件小,恢复快
- 可能丢失最近一次快照后的数据
AOF(Append Only File)
- 追加日志方式
- 记录每个写操作
- 文件大,恢复慢
- 数据完整性更好
混合持久化
- RDB + AOF
- 结合两者优点
3. Redis如何实现分布式锁?
答案:
Redis分布式锁实现:
基本实现:
java
// 加锁
SET key value NX EX timeout
// 解锁
if (get(key) == value) {
delete(key);
}Redisson实现:
- 使用Lua脚本保证原子性
- 支持可重入锁
- 自动续期机制(看门狗)
- 支持公平锁
4. Redis的缓存穿透、缓存击穿、缓存雪崩?
答案:
缓存穿透:
- 问题:查询不存在的数据,请求直接打到数据库
- 解决方案:布隆过滤器、缓存空值
缓存击穿:
- 问题:热点数据过期,大量请求打到数据库
- 解决方案:热点数据永不过期、互斥锁
缓存雪崩:
- 问题:大量缓存同时过期,请求全部打到数据库
- 解决方案:过期时间随机化、多级缓存
🎯 二、消息队列
5. 消息队列的作用?
答案:
消息队列的作用:
- 解耦:系统间解耦
- 异步:异步处理
- 削峰:流量削峰
- 可靠性:保证消息可靠传递
6. Kafka、RocketMQ、RabbitMQ的区别?
答案:
区别对比:
| 特性 | Kafka | RocketMQ | RabbitMQ |
|---|---|---|---|
| 吞吐量 | 非常高 | 高 | 中等 |
| 延迟 | 低 | 低 | 低 |
| 可靠性 | 高 | 高 | 高 |
| 功能 | 功能简单 | 功能丰富 | 功能丰富 |
| 应用场景 | 日志、大数据 | 业务消息 | 业务消息 |
7. 如何保证消息的可靠性?
答案:
消息可靠性保证:
消息持久化
- 消息持久化到磁盘
消息确认机制
- 生产者确认
- 消费者确认
消息重试
- 消费失败重试
- 死信队列
消息幂等性
- 保证消息消费的幂等性
🎯 三、数据库
8. MySQL索引的原理?
答案:
MySQL索引原理:
B+树索引
- InnoDB使用B+树索引
- 非叶子节点存储索引键值
- 叶子节点存储数据
哈希索引
- Memory引擎使用哈希索引
- 等值查询快
- 不支持范围查询
全文索引
- 用于全文搜索
- MyISAM和InnoDB都支持
9. 如何优化MySQL查询性能?
答案:
MySQL查询优化:
索引优化
- 创建合适的索引
- 避免索引失效
SQL优化
- 避免SELECT *
- 使用LIMIT
- 避免子查询
分库分表
- 水平分表
- 垂直分表
读写分离
- 主从复制
- 读写分离
📖 学习资源
视频教程
书籍推荐
- 《Redis设计与实现》 - 黄健宏
- 《高性能MySQL》 - Baron Schwartz
网站资源
✅ 学习检查清单
- [ ] 已理解Redis原理和应用
- [ ] 已掌握消息队列的原理
- [ ] 已理解数据库优化方法
- [ ] 已练习常见中间件面试题
- [ ] 已总结答题技巧