Redis 常用场景与面试题
1. 为什么用 Redis?
- 极高性能:单节点读写性能可达 10W+ QPS。
- 丰富的数据类型:String, List, Set, Hash, ZSet (Sorted Set), Bitmap, HyperLogLog, Geo。
- 丰富的特性:发布订阅、主从复制、Sentinel 哨兵、Cluster 集群。
2. Redis 的 5 种基本数据类型
- String (字符串):
- 场景:缓存对象、计数器、共享 Session、分布式锁。
- Hash (哈希):
- 场景:存储用户信息、购物车列表。
- List (列表):
- 场景:消息队列(简单的消息队列)、朋友圈点赞列表。
- Set (集合):
- 场景:去重统计(共同关注的人、共同喜好)、UV 统计。
- ZSet (有序集合):
- 场景:排行榜(积分榜、贡献榜)、带权重的任务队列。
3. Redis 持久化:RDB vs AOF
RDB (Redis Database)
- 原理:定时对内存数据进行“快照”并保存到磁盘。
- 优点:启动恢复快,文件体积小,适合全量备份。
- 缺点:可能丢失最近一次快照后的数据。
AOF (Append Only File)
- 原理:将每一条写命令追加到 AOF 文件末尾。
- 优点:数据一致性高(最多丢失 1s 数据),通过 rewrite 压缩文件。
- 缺点:文件体积大,启动恢复慢,性能开销相对较高。
推荐配置:开启 RDB 做全量备份,开启 AOF 做增量恢复(混合持久化)。
4. 缓存三兄弟:穿透、击穿、雪崩
| 问题 | 定义 | 解决方案 |
|---|---|---|
| 缓存穿透 | 查询一个不存在的数据,请求透传到 DB。 | 布隆过滤器 (Bloom Filter)、空值缓存。 |
| 缓存击穿 | 一个热点 Key 过期,瞬间大量并发请求到 DB。 | 设置热点数据永不过期、互斥锁 (SETNX)。 |
| 缓存雪崩 | 大量缓存同时过期,导致 DB 压力过大崩溃。 | 设置随机过期时间、主从集群、限流。 |
5. 分布式锁:SETNX
- 核心指令:
SET key value NX PX 30000NX:仅在键不存在时设置。PX:设置过期时间(防止进程宕机导致死锁)。
- 释放锁:使用 Lua 脚本,确保“谁加锁谁释放”(验证 Value 匹配)。
6. Redis 为什么这么快?
- 基于内存操作:CPU 直接访问内存,省去磁盘 IO 延迟。
- 数据结构高效:各种数据结构专门针对性能进行了优化(如 SkipList)。
- IO 多路复用:单线程处理网络请求,通过
epoll实现高性能网络通信。 - 单线程执行:避免了多线程带来的上下文切换和锁竞争(Redis 6.0 引入多线程处理网络请求,但核心逻辑依然单线程)。