Skip to content

Redis 面试总览:高频题速查 ​

刷题入口。完整分区地图见 Redis 总览。


一、Redis 高频面试题总表 ​

  1. 能简单介绍一下 Redis 吗?它为什么这么快?

  2. Redis 和 Memcached 有什么区别?为什么现在基本都用 Redis?

    • 关键词:类型更丰富、持久化、高可用、Lua 等。
  3. 常用数据类型有哪些?分别适合什么场景?

  4. 缓存雪崩、击穿、穿透?怎么防护?

  5. RDB 和 AOF?混合持久化?

  6. 单线程遇到耗时操作会怎样?怎么避免?

  7. 分布式锁怎么做?续期与误删?

  8. 主从 / Sentinel / Cluster?

  9. Lua、库存扣减、限流?

  10. BigKey / HotKey / Pipeline?


二、核心高频问答示例 ​

下面保留几个典型问答,作为上面题单的“展开示例”,方便你理解怎么组织答案。

❓ 面试官:能简单介绍一下 Redis 吗?它为什么这么快? ​

频率:🔥🔥🔥🔥🔥

💡 一句话总结(先抛结论): Redis 是一个基于内存的 C 语言编写的键值对数据库。它之所以快,主要是因为:纯内存操作、单线程模型避免了上下文切换和锁竞争、以及使用了 I/O 多路复用模型。

📝 详细原理解析:

  1. 纯内存操作:内存的读写速度远超磁盘,这是 Redis 达到微秒级响应的根本原因。
  2. 单线程模型(核心机制):
    • Redis 6.0 之前,其网络 I/O 和键值对读写都是由一个线程来完成的。
    • 优点:避免了多线程频繁的上下文切换开销;不需要考虑各种复杂的锁机制(没有死锁问题)。
  3. I/O 多路复用:采用了 epoll 机制,允许单线程同时监听多个 Socket 连接。当某个 Socket 有读写事件就绪时,才将其交给单线程处理,极大提高了网络并发能力。
  4. 高效的数据结构:Redis 底层设计了诸如全局哈希表、跳表(SkipList)、压缩列表(Ziplist)等专门为内存和速度优化的数据结构。

❓ 面试官:Redis 单线程执行命令,如果遇到耗时操作会怎样?【中级】 ​

频率:🔥🔥🔥🔥

💡 一句话总结(先抛结论): 如果执行耗时操作,会阻塞整个 Redis 服务,导致后续所有请求排队等待,引发线上雪崩。这就是为什么在生产环境严禁使用 KEYS * 等命令的原因。

📝 详细原理解析: 因为 Redis 操作数据是单线程的,就像去食堂打饭只有一个窗口。如果前面的同学点菜磨磨蹭蹭花了 5 分钟,后面排队的所有人都得等 5 分钟。

常见的阻塞元凶(生产环境禁忌):

  1. KEYS * 命令:会遍历整个当前库的所有 Key,如果 Key 有几百万个,会严重阻塞。替代方案:使用 SCAN 命令,它可以分批次迭代扫描,不阻塞主线程。
  2. 大 Key(BigKey)的删除或全量获取:
    • 比如一个 Hash 结构里存了 100 万个字段,执行 HGETALL 瞬间阻塞。
    • 删除大 Key:在 Redis 4.0 之前,执行 DEL 删除几十 MB 的 Key 会阻塞;4.0 之后引入了 UNLINK 命令,可以将大 Key 的内存回收交给后台异步线程处理,解决阻塞问题。
  3. 复杂度过高的命令:如针对极长集合的 SORT、对两个大 Set 执行 SINTER(求交集)等。

🌟 实战经验提示: 在线上环境排查 Redis 变慢的问题时,可以先查看 Redis 的慢查询日志,再结合业务日志定位到具体接口和命令。