Redis 面试总览:高频题速查
刷题入口。完整分区地图见 Redis 总览。
一、Redis 高频面试题总表
能简单介绍一下 Redis 吗?它为什么这么快?
- 👉 基础原理
Redis 和 Memcached 有什么区别?为什么现在基本都用 Redis?
- 关键词:类型更丰富、持久化、高可用、Lua 等。
常用数据类型有哪些?分别适合什么场景?
缓存雪崩、击穿、穿透?怎么防护?
- 👉 缓存常见问题
RDB 和 AOF?混合持久化?
- 👉 持久化机制
单线程遇到耗时操作会怎样?怎么避免?
分布式锁怎么做?续期与误删?
- 👉 分布式锁
主从 / Sentinel / Cluster?
- 👉 集群与高可用
Lua、库存扣减、限流?
- 👉 并发
BigKey / HotKey / Pipeline?
- 👉 性能
二、核心高频问答示例
下面保留几个典型问答,作为上面题单的“展开示例”,方便你理解怎么组织答案。
❓ 面试官:能简单介绍一下 Redis 吗?它为什么这么快?
频率:🔥🔥🔥🔥🔥
💡 一句话总结(先抛结论): Redis 是一个基于内存的 C 语言编写的键值对数据库。它之所以快,主要是因为:纯内存操作、单线程模型避免了上下文切换和锁竞争、以及使用了 I/O 多路复用模型。
📝 详细原理解析:
- 纯内存操作:内存的读写速度远超磁盘,这是 Redis 达到微秒级响应的根本原因。
- 单线程模型(核心机制):
- Redis 6.0 之前,其网络 I/O 和键值对读写都是由一个线程来完成的。
- 优点:避免了多线程频繁的上下文切换开销;不需要考虑各种复杂的锁机制(没有死锁问题)。
- I/O 多路复用:采用了
epoll机制,允许单线程同时监听多个 Socket 连接。当某个 Socket 有读写事件就绪时,才将其交给单线程处理,极大提高了网络并发能力。 - 高效的数据结构:Redis 底层设计了诸如全局哈希表、跳表(SkipList)、压缩列表(Ziplist)等专门为内存和速度优化的数据结构。
❓ 面试官:Redis 单线程执行命令,如果遇到耗时操作会怎样?【中级】
频率:🔥🔥🔥🔥
💡 一句话总结(先抛结论): 如果执行耗时操作,会阻塞整个 Redis 服务,导致后续所有请求排队等待,引发线上雪崩。这就是为什么在生产环境严禁使用 KEYS * 等命令的原因。
📝 详细原理解析: 因为 Redis 操作数据是单线程的,就像去食堂打饭只有一个窗口。如果前面的同学点菜磨磨蹭蹭花了 5 分钟,后面排队的所有人都得等 5 分钟。
常见的阻塞元凶(生产环境禁忌):
KEYS *命令:会遍历整个当前库的所有 Key,如果 Key 有几百万个,会严重阻塞。替代方案:使用SCAN命令,它可以分批次迭代扫描,不阻塞主线程。- 大 Key(BigKey)的删除或全量获取:
- 比如一个 Hash 结构里存了 100 万个字段,执行
HGETALL瞬间阻塞。 - 删除大 Key:在 Redis 4.0 之前,执行
DEL删除几十 MB 的 Key 会阻塞;4.0 之后引入了UNLINK命令,可以将大 Key 的内存回收交给后台异步线程处理,解决阻塞问题。
- 比如一个 Hash 结构里存了 100 万个字段,执行
- 复杂度过高的命令:如针对极长集合的
SORT、对两个大 Set 执行SINTER(求交集)等。
🌟 实战经验提示: 在线上环境排查 Redis 变慢的问题时,可以先查看 Redis 的慢查询日志,再结合业务日志定位到具体接口和命令。