理解 Redis 不能只背“单线程很快”。命令执行模型、I/O 线程、持久化、复制和集群行为会随版本与配置不同,面试和生产排障都应基于实际指标。
## 数据结构与场景
String 适合缓存、计数和锁值;Hash 适合对象字段;List 适合简单队列但要注意阻塞与内存;Set 用于去重和集合运算;Sorted Set 用于排行榜和延迟队列;Stream 提供消费组和消息持久化语义。
选择结构要考虑命令复杂度、元素数量、编码变化和访问模式,避免大 key 与 hot key。
## 过期与淘汰
Redis 结合惰性删除和定期扫描处理过期键。内存达到 maxmemory 后按策略淘汰;noeviction 会让写命令失败。缓存必须设置合理 TTL,并加入随机抖动避免同一时刻大量失效。
缓存问题:
- 穿透:查询不存在数据,可用空值缓存、布隆过滤和请求校验。
- 击穿:热点键失效,可用互斥重建、逻辑过期或提前刷新。
- 雪崩:大量键同时失效或实例故障,使用 TTL 抖动、限流、降级和多层缓存。
## RDB 与 AOF
RDB 是时间点快照,恢复快但可能丢失快照后的数据。AOF 记录写操作,数据损失窗口由 fsync 策略决定,文件更大且需要 rewrite。生产可组合使用,但必须通过恢复演练确定真实 RPO/RTO。
## 主从、Sentinel 与 Cluster
复制是异步的。Sentinel 适合非分片主从的监控和故障转移;Cluster 同时提供分片和故障转移。两者都不能替代应用幂等、持久备份和网络分区设计。
## 常用诊断
```bash
redis-cli INFO
redis-cli INFO memory
redis-cli INFO replication
redis-cli INFO stats
redis-cli SLOWLOG GET 20
redis-cli LATENCY DOCTOR
redis-cli --bigkeys
redis-cli --memkeys
```
生产使用 scan,避免 keys * 阻塞大实例。bigkeys 会扫描全库,也应在低峰限速执行。
## 延迟排查
1. 检查 CPU、网络、内存、swap 和持久化 I/O。
2. 查看 slowlog、latency、instantaneous_ops 和 blocked_clients。
3. 排查大 key、热 key、Lua、事务和 O(N) 命令。
4. 检查 AOF rewrite、RDB fork 与写时复制内存。
5. 检查复制积压、网络抖动和客户端连接池。
6. 对比应用端超时与 Redis 服务端耗时。
## 分布式锁
基本锁使用 SET key value NX PX,并用唯一 value 标识持有者;释放时通过 Lua 验证 value 后删除。锁需要处理超时、续期、进程暂停和业务幂等。它不是数据库事务替代品,对强一致要求应采用更合适的协调系统或 fencing token。
## 安全与容量
启用 ACL、最小权限、TLS/私网和 protected mode,关闭公网暴露。监控 used_memory、RSS、碎片率、连接数、拒绝连接、keyspace hit rate、evicted_keys、复制延迟和持久化状态。
面试回答建议采用“机制—限制—生产验证”的结构,而不是给出绝对化结论。