Q1: Redis为什么这么快?
A: Redis的高性能来自四个核心设计:
| 设计特点 | 说明 | 效果 |
|---|---|---|
| 纯内存操作 | 所有数据存储在内存中 | 读写速度是磁盘的10-100倍 |
| 单线程模型 | 避免了多线程的上下文切换和锁竞争 | 无锁编程,简单高效 |
| IO多路复用 | 基于epoll的事件驱动模型 | 单线程可处理数万并发连接 |
| 高效数据结构 | SDS、跳表、压缩列表等 | 专为性能优化的数据结构 |
Q2: Redis持久化方式有哪些?如何选择?
A: Redis提供三种持久化方案:
| 方式 | 原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| RDB | 定时快照 | 文件紧凑、恢复快、适合备份 | 可能丢失数据(最后一次快照后) | 对数据完整性要求不高 |
| AOF | 记录写命令 | 数据安全、最多丢1秒 | 文件大、恢复慢 | 对数据完整性要求高 |
| 混合 | RDB+AOF | 兼顾两者优点 | 配置稍复杂 | 生产环境推荐 |
Q3: 缓存雪崩、穿透、击穿如何解决?
A: 这是缓存架构的三大经典问题:
1. 缓存雪崩 – 大量缓存同时过期
现象: 某一时刻大量缓存key同时过期,请求直接打到数据库,导致数据库压力剧增。
解决方案:
- 过期时间加随机值,避免同时过期
- 热点数据设置永不过期,后台异步更新
- 多级缓存架构,本地缓存+分布式缓存
2. 缓存穿透 – 查询不存在的数据
现象: 查询一个数据库中不存在的数据(如id=-1),每次都要查数据库。
解决方案:
- 布隆过滤器:快速判断数据是否存在
- 空值缓存:将不存在的结果也缓存(短时间)
- 参数校验:拦截非法请求
3. 缓存击穿 – 热点key过期
现象: 某个热点key过期瞬间,大量请求同时打到数据库。
解决方案:
- 互斥锁:只允许一个线程回源
- 逻辑过期:不设置TTL,通过逻辑时间判断是否过期
- 热点key预加载:提前异步刷新
Q4: 如何实现分布式锁?
A: Redis分布式锁的核心是SET key value NX EX原子命令。
分布式锁要求
| 要求 | 说明 | Redis实现 |
|---|---|---|
| 互斥性 | 同一时刻只有一个客户端能持有锁 | SET NX(不存在才设置) |
| 防死锁 | 客户端崩溃后锁能自动释放 | EX设置过期时间 |
| 可重入 | 同一客户端可多次获取锁 | 记录客户端标识和重入次数 |
| 安全性 | 只能释放自己持有的锁 | 释放时验证value |
Q5: Redis集群方案有哪些?
| 方案 | 架构 | 优点 | 缺点 |
|---|---|---|---|
| 主从复制 | 一主多从 | 读写分离、数据备份 | 手动故障转移 |
| 哨兵模式 | 主从+哨兵监控 | 自动故障转移 | 只有一个主节点写 |
| Cluster模式 | 多主多从,数据分片 | 水平扩展、高可用 | 架构复杂、客户端需支持 |
Redis面试的核心是理解其单线程模型、持久化机制、高可用架构以及缓存相关的经典问题。
