下面列出的这些问题是高频 Redis 面试真题,涵盖了性能机制、实战应用、设计原理等多个维度,并且每个问题都配有标准答法 + 项目场景 + 加分点,你可以灵活运用于面试答题,也可以用于备考复习。
1. Redis 是线程安全的吗?
标准回答:
是的,Redis 是线程安全的。它采用单线程模型来处理客户端请求,保证每次只有一个命令在执行,从而避免并发竞争问题。
原理:
- Redis 使用
epoll+ 单线程处理请求; - 不需要加锁,执行快,避免线程切换开销;
- 对于网络 IO 和事件监听,Redis 6 后引入了多线程 IO 模型,但核心命令仍由单线程执行。
加分点:
在项目中,Redis 的单线程反而提升了并发下的稳定性,我们通过监控慢查询命令避免阻塞整个线程。
2. 为什么 Redis 不直接使用多线程?
标准回答:
Redis 最初设计时就是为了做到极致的性能、简洁和可控。使用单线程可以避免加锁、线程切换等系统开销,同时由于 Redis 操作大多是内存级别的,单线程就能达到百万级 QPS。
补充(Redis 6+):
Redis 从 6.0 开始支持了网络 IO 的多线程处理(如读写、解析),但核心命令执行仍是单线程,这种折中方案兼顾了并发与安全性。
3. Redis 如何实现分布式锁?有什么坑?
答题模板:
SET key value NX EX 10
- 使用
SET NX EX命令原子性地获取锁; - 释放锁使用 Lua 脚本,防止误删别人锁;
- 业务执行完立即释放,避免死锁;
- 防止锁续期失败可用 RedLock 方案。
项目中踩过的坑:
- 锁过期时间太短导致业务未完成锁被自动释放;
- 忘记校验 value,误删其他线程的锁;
- 主从同步延迟,锁“假释放”问题(RedLock 针对这个)
4. Redis 支持事务吗?有什么机制?
标准回答:
是的,Redis 支持事务,使用命令:MULTI → 命令列表 → EXEC。
机制特点:
- 事务是命令的批量执行,不是关系型数据库的 ACID;
- 不支持回滚机制,执行失败不会自动回滚;
- 支持
WATCH监听乐观锁机制;
项目使用场景举例:
多步更新缓存时,我们会用
WATCH保证 key 不被其他线程并发修改,配合事务执行更新操作。
5. Redis 的淘汰策略有哪些?
主要策略:
| 策略 | 描述 |
|---|---|
| noeviction | 达到 maxmemory 后拒绝写入 |
| allkeys-lru | 所有 key 按访问时间淘汰最近最少使用 |
| volatile-lru | 只淘汰设置了 TTL 的 key |
| allkeys-random | 所有 key 中随机淘汰 |
| volatile-ttl | TTL 最小的先淘汰 |
项目中应用:
我们使用
allkeys-lru来淘汰热点缓存数据,同时用 Prometheus + 告警阈值监控命中率。
6. Redis 使用过哪些高级数据结构?
项目答法(举例):
| 数据结构 | 场景 |
|---|---|
| Bitmap | 用户签到记录(按位表示每天签到) |
| HyperLogLog | 精确度不高但节省内存的 UV 去重 |
| ZSet | 实现排行榜、任务调度 |
| GEO | 附近商户、LBS 定位功能 |
| Stream | 异步消息流,替代 List 的简易消息队列 |
7. 为什么要使用布隆过滤器?用在什么场景?
标准回答:
布隆过滤器是一种空间效率非常高的数据结构,用于判断一个元素是否可能存在于集合中,可能存在 / 一定不存在。
使用原因:
- 高效节省内存;
- 减少请求穿透到数据库或缓存;
使用场景举例:
我们在内容服务中,用布隆过滤器拦截非法文章 ID 的请求,防止穿透访问数据库。
8. 使用 Redis 遇到过什么问题?怎么解决的?
答题建议:一问一答 + 问题解决 + 改进措施
| 遇到的问题 | 解决方式 | 改进 |
|---|---|---|
| 热 key 高频更新导致 CPU 飙高 | 设置互斥锁 + 异步刷新机制 | 增加过期随机 TTL、缓存预热 |
| 缓存穿透大量请求打穿 | 布隆过滤器 / 缓存空对象 | 统一封装缓存访问层 |
| Redis 重启丢数据 | 使用 AOF everysec 模式 | 搭配持久化 RDB+备份 |
9. Redis 如何实现延迟任务队列?
方式 1:使用 ZSet + 时间戳排序
ZADD delay_queue timestamp task_id
ZRANGEBYSCORE delay_queue 0 now
- ZSet 中的 score 为任务触发时间;
- 后台定时线程轮询取出到期任务执行;
- 执行后从 ZSet 删除;
方式 2:Redis Stream(更现代)
- 使用
XADD添加任务,带时间标签; - 使用消费者组监听;
- 保证消息顺序、消费状态跟踪;
项目实践:
我们在订单系统中,使用 Redis 延迟队列控制 30 分钟未支付订单超时关闭。
✨ Bonus:答题技巧小贴士
| 技巧 | 说明 |
|---|---|
| 强调“结合项目经验” | 面试官更喜欢真实业务场景的运用 |
| 回答后主动“补充一点” | 增强主动性和专业度 |
| 遇到不懂的题目,坦诚 + 思考方向 | 比胡说八道更加分 |