目录
1. Redis 单线程为什么快
1.1 纯内存操作
- 所有数据在内存中,读写速度微秒级,比磁盘快 1000 倍以上。
1.2 IO 多路复用
- 单线程监听多个套接字,非阻塞 IO,能同时处理上万连接。
1.3 无锁、无线程切换
- 单线程避免锁竞争、线程切换、上下文消耗,CPU 利用率极高。
1.4 高效数据结构
- SDS、压缩列表、跳表、哈希表等均为高效设计,读写复杂度低。
1.5 面试总结(必背)
Redis 快 = 内存 + IO多路复用 + 单线程无锁 + 高效数据结构,特别适合高并发读写。
2. Redis 过期策略与内存淘汰机制
2.1 惰性删除
- 访问 key 时才检查是否过期,过期则删除。
- 优点:节省CPU。
- 缺点:大量冷数据过期不删,浪费内存。
2.2 定期删除
- 每隔一段时间随机抽取一批 key 检查并删除过期 key。
- 平衡 CPU 与内存。
2.3 内存淘汰策略(当内存满时)
- volatile-lru:对设置了过期时间的 key 使用 LRU 淘汰。
- allkeys-lru:所有 key 中淘汰最少使用的(企业最常用)。
- volatile-lfu:淘汰使用频率最低。
- allkeys-lfu:全键 LFU。
- volatile-random:随机删除。
- noeviction:不删除,直接报错(默认)。
3. Redis 持久化
3.1 RDB 快照
- 定时把内存数据全量保存到磁盘。
- 优点:文件小、恢复快、适合备份。
- 缺点:两次快照之间宕机会丢数据。
3.2 AOF 日志
- 记录每一条写命令,类似 MySQL binlog。
- 优点:数据安全、最多丢1秒数据。
- 缺点:文件大、恢复慢、阻塞风险。
3.3 混合持久化(企业标准)
- RDB + AOF 结合。
- 恢复时:先加载 RDB,再重放 AOF。
- 优点:速度快 + 数据安全,Redis 4.0+ 推荐。
4. 缓存穿透
4.1 定义
查询根本不存在的数据,缓存不命中,直接打到数据库。
4.2 现象
- 缓存命中率极低。
- 数据库CPU/连接暴增。
- 常见于恶意攻击。
4.3 排查
- 监控缓存命中率。
- 查看请求参数是否为无效ID、负数、不存在值。
- 日志高频出现相同无效查询。
4.4 解决方案
- 参数校验:过滤非法ID。
- 空值缓存:缓存不存在的key,设置短过期。
- 布隆过滤器:预先白名单,不存在直接拒绝。
- 接口限流:防止恶意刷接口。
5. 缓存击穿
5.1 定义
一个极高热点 key 过期,瞬间大量请求打到数据库。
5.2 现象
- 数据库瞬间负载飙升。
- 接口大量超时。
5.3 排查
- 监控热点 key。
- 查看同一 key 集中过期。
5.4 解决方案
- 互斥锁(分布式锁):只让一个请求去更新DB。
- 热点 key 永不过期。
- 后台定时主动刷新。
6. 缓存雪崩
6.1 定义
大量 key 同一时间过期 或 Redis 宕机,所有请求打到DB。
6.2 现象
- 数据库崩溃、服务不可用。
6.3 解决方案
- 过期时间加随机值,避免批量同时过期。
- 多级缓存:本地缓存 + Redis。
- Redis 集群/哨兵,避免单点故障。
- 服务限流、熔断、降级。
- 缓存预热。
7. Redis 分布式锁
7.1 基本命令
SET lock_key unique_value NX PX 30000
- NX:仅不存在时设置(互斥)。
- PX:毫秒级过期,防止死锁。
7.2 防误删(核心)
- 用 Lua 脚本保证“判断+删除”原子性。
- 避免线程A锁过期,被线程B删除。
7.3 锁续期
- 使用 Redisson 自动续期(看门狗机制)。
7.4 适用场景
- 库存扣减、订单提交、支付、并发修改、重复提交。
8. Redis 高频面试扩展知识点
8.1 Redis 线程模型
- 6.0 开始支持 多线程 IO,但执行命令依然单线程。
- 目的:提高网络吞吐量,不破坏原子性。
8.2 缓存与数据库一致性
- 先更新数据库,再删除缓存。
- 不建议更新缓存,避免并发脏数据。
8.3 典型应用场景
- 热点数据缓存
- 分布式锁
- 限流
- 计数器、排行榜
- 会话存储
- 消息队列
8.4 集群方案
- 主从复制
- 哨兵(高可用)
- Redis Cluster(分片集群)
8.5 面试必背总结
Redis 是高并发缓存中间件,核心解决数据库压力; 穿透/击穿/雪崩是三大经典问题; 分布式锁是支付、订单、库存必备; 企业标配:混合持久化 + 集群 + 主从 + 哨兵。
评论区