Skip to content

中间件面试题 ​

整理Redis、消息队列、数据库等中间件的面试题,包含详细的答案和解析。

📋 题目分类 ​

🎯 一、Redis ​

1. Redis的数据类型有哪些? ​

答案:

Redis的数据类型:

  1. String:字符串
  2. Hash:哈希表
  3. List:列表
  4. Set:集合
  5. Sorted Set:有序集合
  6. Bitmap:位图
  7. HyperLogLog:基数统计
  8. Stream:流

2. Redis的持久化机制? ​

答案:

Redis持久化机制:

  1. RDB(Redis Database)

    • 快照方式
    • 定期保存数据快照
    • 文件小,恢复快
    • 可能丢失最近一次快照后的数据
  2. AOF(Append Only File)

    • 追加日志方式
    • 记录每个写操作
    • 文件大,恢复慢
    • 数据完整性更好
  3. 混合持久化

    • RDB + AOF
    • 结合两者优点

3. Redis如何实现分布式锁? ​

答案:

Redis分布式锁实现:

基本实现:

java
// 加锁
SET key value NX EX timeout

// 解锁
if (get(key) == value) {
    delete(key);
}

Redisson实现:

  • 使用Lua脚本保证原子性
  • 支持可重入锁
  • 自动续期机制(看门狗)
  • 支持公平锁

4. Redis的缓存穿透、缓存击穿、缓存雪崩? ​

答案:

缓存穿透:

  • 问题:查询不存在的数据,请求直接打到数据库
  • 解决方案:布隆过滤器、缓存空值

缓存击穿:

  • 问题:热点数据过期,大量请求打到数据库
  • 解决方案:热点数据永不过期、互斥锁

缓存雪崩:

  • 问题:大量缓存同时过期,请求全部打到数据库
  • 解决方案:过期时间随机化、多级缓存

🎯 二、消息队列 ​

5. 消息队列的作用? ​

答案:

消息队列的作用:

  1. 解耦:系统间解耦
  2. 异步:异步处理
  3. 削峰:流量削峰
  4. 可靠性:保证消息可靠传递

6. Kafka、RocketMQ、RabbitMQ的区别? ​

答案:

区别对比:

特性KafkaRocketMQRabbitMQ
吞吐量非常高高中等
延迟低低低
可靠性高高高
功能功能简单功能丰富功能丰富
应用场景日志、大数据业务消息业务消息

7. 如何保证消息的可靠性? ​

答案:

消息可靠性保证:

  1. 消息持久化

    • 消息持久化到磁盘
  2. 消息确认机制

    • 生产者确认
    • 消费者确认
  3. 消息重试

    • 消费失败重试
    • 死信队列
  4. 消息幂等性

    • 保证消息消费的幂等性

🎯 三、数据库 ​

8. MySQL索引的原理? ​

答案:

MySQL索引原理:

  1. B+树索引

    • InnoDB使用B+树索引
    • 非叶子节点存储索引键值
    • 叶子节点存储数据
  2. 哈希索引

    • Memory引擎使用哈希索引
    • 等值查询快
    • 不支持范围查询
  3. 全文索引

    • 用于全文搜索
    • MyISAM和InnoDB都支持

9. 如何优化MySQL查询性能? ​

答案:

MySQL查询优化:

  1. 索引优化

    • 创建合适的索引
    • 避免索引失效
  2. SQL优化

    • 避免SELECT *
    • 使用LIMIT
    • 避免子查询
  3. 分库分表

    • 水平分表
    • 垂直分表
  4. 读写分离

    • 主从复制
    • 读写分离

📖 学习资源 ​

视频教程 ​

书籍推荐 ​

  • 《Redis设计与实现》 - 黄健宏
  • 《高性能MySQL》 - Baron Schwartz

网站资源 ​

✅ 学习检查清单 ​

  • [ ] 已理解Redis原理和应用
  • [ ] 已掌握消息队列的原理
  • [ ] 已理解数据库优化方法
  • [ ] 已练习常见中间件面试题
  • [ ] 已总结答题技巧

上一章节:微服务面试题
下一章节:算法数据结构面试题
返回目录:面试题