Redis 是面试中高频出现的主题,尤其是后端开发、数据架构、DevOps 等岗位。问题通常覆盖从基础使用、核心特性到高级应用、原理、运维和场景设计的方方面面。以下是一些常见的 Redis 面试题分类和示例:
一、基础概念与数据结构
- Redis 是什么?主要特点是什么?
- (内存数据库、数据结构丰富、高性能、持久化、主从复制、高可用哨兵/集群、单线程模型等)
- Redis 支持哪些主要数据结构?分别列举它们的典型应用场景。
- (String, Hash, List, Set, Sorted Set, Bitmap, HyperLogLog, Geospatial, Streams - 需能对应场景)
- String 类型除了存字符串还能存什么?INCR/DECR 命令有什么用?
- (数字 - 整数/浮点数、二进制数据;原子计数器)
- List 和 Set 的主要区别是什么?Sorted Set 的核心特点是什么?
- (List: 有序、可重复; Set: 无序、唯一; Sorted Set: 唯一、按 Score 排序)
- 如何用 Redis 实现一个简单的消息队列?有什么优缺点?
- (List + LPUSH/BRPOP; 优点:简单快速; 缺点:无消息确认、无广播、无持久化保证(需配置)、无严格顺序保证(多消费者))
- 如何使用 Redis 实现分布式锁?需要考虑哪些关键点?
- (核心:
SET key random_value NX PX timeout
; 关键点:唯一随机值、原子性、超时释放、释放锁时校验值(Lua脚本)、避免锁过期任务未完成(看门狗/续期)、集群模式下的问题(Redlock))
- (核心:
- Bitmap 和 HyperLogLog 分别解决什么问题?各自的优缺点是什么?
- (Bitmap: 存储大量布尔值,精确操作位,节省空间; HyperLogLog: 海量数据基数统计,极省内存,近似结果)
二、持久化
- Redis 有哪几种持久化方式?详细说明 RDB 和 AOF 的工作原理。
- (RDB: 快照,全量备份,fork子进程,二进制文件; AOF: 追加日志,记录写命令,文本文件)
- RDB 和 AOF 各自的优缺点是什么?
- (RDB 优点:文件小、恢复快、适合备份; 缺点:可能丢失最后一次快照后的数据、fork 可能阻塞。 AOF 优点:数据安全性更高(fsync策略决定)、可读; 缺点:文件通常更大、恢复慢、写性能略低)
- AOF 重写 (Rewrite) 是做什么的?为什么要做?
- (解决 AOF 文件膨胀问题; 将内存中的数据用最小命令集重建一个新的 AOF 文件)
- 如何配置 RDB 和 AOF 同时使用?数据恢复时加载顺序是怎样的?
- (都开启; 优先加载 AOF 文件(通常数据更完整))
- 不同的 AOF fsync 策略 (
no
,everysec
,always
) 有什么区别?对性能和安全性有什么影响?
三、高可用与集群
- Redis 如何实现高可用?主从复制 (Replication) 的工作原理是怎样的?
- (哨兵 Sentinel / Redis Cluster; 主从:全量同步 (RDB) + 增量同步 (命令传播))
- 主从复制存在延迟吗?为什么?如何尽量减少延迟?
- (存在,网络延迟、从库负载等; 优化网络、提升从库性能、合理配置
repl-backlog
等)
- (存在,网络延迟、从库负载等; 优化网络、提升从库性能、合理配置
- Redis Sentinel 是做什么的?它的核心功能是什么?
- (监控、通知、自动故障转移(主库挂了选新主)、配置提供者)
- Redis Cluster 是如何实现数据分片 (Sharding) 的?
- (哈希槽 Slot:16384个槽,分配到不同节点; CRC16(key) mod 16384 计算槽位)
- Redis Cluster 的节点间通信 (Gossip 协议) 是什么?
- (P2P 通信方式,节点间交换状态信息(节点上线、下线、故障感知))
- 客户端如何访问 Redis Cluster?MOVED 和 ASK 重定向是什么意思?
- (客户端需支持 Cluster 协议; MOVED:槽已永久迁移到新节点; ASK:槽正在迁移中,临时重定向)
- Redis Cluster 为什么至少需要 3 个主节点?为什么推荐 6 个节点(3主3从)?
- (故障选举需要大多数节点存活(N/2+1),3主节点挂1个还能选举; 6节点(3主3从)提供高可用和负载均衡)
- Redis Cluster 支持跨槽位的事务 (Multi-key operations) 吗?为什么?
- (不支持。事务或Lua脚本中的key必须都在同一个节点(同一个槽位),否则报错。可以用
hash tags
强制 key 分配到同一槽位)
- (不支持。事务或Lua脚本中的key必须都在同一个节点(同一个槽位),否则报错。可以用
四、性能与原理
- Redis 为什么这么快?
- (纯内存操作、单线程避免上下文切换和锁竞争、高效的数据结构(如哈希表、跳表)、IO多路复用(epoll/kqueue)、优化的网络模型)
- Redis 是单线程的吗?为什么设计成单线程?单线程有什么优势和劣势?
- (命令处理核心是单线程; 避免锁、上下文切换开销,简化实现; 优势:简单高效; 劣势:无法利用多核CPU、长命令/大Key会阻塞其他命令)
- 什么是 IO 多路复用?Redis 如何利用它?
- (一种同步IO模型,一个线程监控多个文件描述符状态(可读/可写); Redis 使用 epoll/kqueue/select 监听大量客户端连接)
- 什么是 Pipeline?它为什么能提升性能?使用时需要注意什么?
- (客户端将多个命令打包一次性发送,服务端一次性返回结果; 减少 RTT(往返时间)和 socket I/O 次数; 注意:打包的命令数量不宜过大,避免阻塞)
- 什么是 Big Key(大Key)?它有什么危害?如何发现和处理?
- (Value 过大的 Key(如大 String、元素超多的 Hash/List/Set/ZSet); 危害:阻塞操作、内存不均、网络拥塞、迁移困难; 发现:
redis-cli --bigkeys
、MEMORY USAGE
、SCAN
+ 类型命令; 处理:拆分、压缩、删除、优化数据结构)
- (Value 过大的 Key(如大 String、元素超多的 Hash/List/Set/ZSet); 危害:阻塞操作、内存不均、网络拥塞、迁移困难; 发现:
- 什么是 Hot Key(热Key)?它有什么危害?如何应对?
- (访问频率极高的 Key; 危害:造成单节点/单分片压力过大、可能成为瓶颈; 应对:本地缓存(客户端/代理层)、读写分离、利用 Redis Cluster 分片打散(加随机后缀)、二级缓存)
- Redis 的内存淘汰策略有哪些?
- (
noeviction
(默认, 报错),allkeys-lru
,volatile-lru
,allkeys-lfu
,volatile-lfu
,allkeys-random
,volatile-random
,volatile-ttl
)
- (
- LRU 和 LFU 淘汰策略的区别是什么?
- (LRU: 最近最少使用,看最后一次访问时间; LFU: 最不经常使用,统计访问频率)
五、应用场景与设计
- 设计一个用户点赞/取消点赞的功能,如何保证原子性和防止重复点赞?
- (使用 Set,
SADD user:likes:post_id user_id
/SREM
,SISMEMBER
检查是否已点)
- (使用 Set,
- 如何实现一个排行榜?
- (Sorted Set,
ZADD
分数,ZREVRANGE
取 Top N)
- (Sorted Set,
- 如何实现一个分布式 Session?
- (将 Session 数据存储在 Redis 中,Key 通常为 SessionID)
- 如何防止缓存穿透、缓存雪崩、缓存击穿?
- 穿透: 大量请求不存在的数据(查 DB) -> 布隆过滤器、缓存空对象(短过期)。
- 雪崩: 大量缓存同时失效 -> 设置随机过期时间、永不过期 + 后台更新、高可用架构。
- 击穿: 热点 Key 失效瞬间大量请求 -> 互斥锁(Redis SETNX)、永不过期 + 逻辑过期。
- 如何保证缓存与数据库的双写一致性?
- (复杂问题!常见方案:Cache Aside Pattern(旁路缓存 - 先更DB再删缓存)、延时双删、基于 binlog 的异步更新(如 Canal) - 需权衡一致性要求与复杂度)
- 如何用 Redis 实现一个简单的秒杀系统?需要考虑哪些问题?
- (预减库存(
DECR
)、原子性、防超卖、限流、热点数据(库存 Key)、异步下单、结果轮询/通知)
- (预减库存(
六、运维与监控
- 如何监控 Redis 的性能和状态?
- (
INFO
命令(memory, stats, replication, cpu 等)、redis-cli monitor
(谨慎)、SLOWLOG
、CLIENT LIST
、Prometheus + Grafana + Redis Exporter)
- (
- Redis 的
maxmemory
配置有什么作用?如何选择淘汰策略? - 如何安全地重启 Redis?
- (主从切换、配置
SHUTDOWN SAVE
/SHUTDOWN NOSAVE
、使用CONFIG REWRITE
避免配置丢失)
- (主从切换、配置
- Redis 的常见性能瓶颈有哪些?如何排查?
- (CPU:复杂命令/大Key、阻塞; 内存:不足/OOM; 网络:带宽/延迟; 磁盘:AOF fsync; 排查:
SLOWLOG
,INFO
,top
,iostat
,netstat
等)
- (CPU:复杂命令/大Key、阻塞; 内存:不足/OOM; 网络:带宽/延迟; 磁盘:AOF fsync; 排查:
准备建议
- 理解原理: 不要死记硬背,理解为什么这样设计(如单线程、持久化机制、集群分片)。
- 熟悉数据结构与场景: 这是基础,务必清晰每种结构的特性和最佳适用场景。
- 掌握核心机制: 持久化(RDB/AOF)、复制(主从)、高可用(Sentinel/Cluster)是重中之重。
- 了解常见问题与解决方案: Big Key, Hot Key, 缓存异常(穿透/雪崩/击穿)、一致性问题是高频考点。
- 动手实践: 搭建 Redis 环境,亲自操作命令,配置主从、哨兵或集群,模拟故障转移。
- 关注版本差异: Redis 6 (多线程IO)、7 引入了一些新特性(如 Functions)。
- 结合项目经验: 如果能结合你实际项目中使用 Redis 的经验(解决了什么问题,遇到了什么坑,怎么解决的),会非常加分。