Redis 经典问题
Redis 除了三大缓存问题,还有哪些常见问题?
按 开发问题 / 运维问题 / 架构问题 分类。
问题
- Redis 和数据库数据不一致
- 更新顺序错误导致脏数据
典型场景
更新 DB 成功
更新 Redis 失败
-> 缓存是旧值
常见方案
| 方案 | 说明 |
|---|---|
| 先删缓存再写 DB | ❌ 并发下可能回写旧值 |
| 先写 DB 再删缓存 | ✅ 最常用 |
| 延迟双删 | ✅ |
| MQ / Binlog | ✅ 高阶方案 |
问题
- 某一个 key QPS 极高
- 单个 Redis 节点被打爆
解决方案
- 本地缓存
- key 拆分
- 多副本缓存
- 读写分离
问题
- 单个 key 数据量过大
- 阻塞 Redis 主线程
影响
- QPS 下降
- 主从同步延迟
- AOF / RDB 卡顿
解决方案
- 拆分 key
- 使用 Hash/List 分片
- 避免大集合
问题
- 内存满了怎么办?
- key 没过期但被淘汰?
关键配置
maxmemory
maxmemory-policy
常见策略
- allkeys-lru(最常用)
- volatile-ttl
问题
- Redis 事务(MULTI/EXEC)不支持回滚
- 只能保证命令顺序
问题
- 单线程处理命令
- CPU 可能成为瓶颈
优化
- Pipeline
- I/O 多线程(Redis 6+)
- 拆分实例
问题
- 从节点数据落后
- 读到旧数据
原因
- 网络延迟
- 大 Key
- RDB 复制
问题
- 主节点宕机
- 最新数据尚未同步到从节点
解决
min-replicas-to-write
min-replicas-max-lag
问题
- RDB fork 阻塞
- AOF rewrite 卡顿
优化
- off-peak 执行
- 混合持久化(RDB+AOF)
问题
- 内存用满
- 碎片率过高
排查
INFO memory
- slot 迁移导致性能抖动
- 网络不稳定导致迁移失败
- 多 key 必须同 slot
- 事务、Lua 限制
- 长 Lua 会阻塞 Redis
- 导致整个实例不可用
- 网络抖动
- 主节点被误下线
- 未设置密码
- 绑定 0.0.0.0
- 被写 crontab / SSH key
| 分类 | 问题 |
|---|---|
| 缓存层 | 穿透 / 击穿 / 雪崩 |
| 一致性 | 双写不一致 |
| 性能 | 热 key / 大 key |
| 数据安全 | 主从丢数据 |
| 运维 | OOM / 碎片 |
| 架构 | Cluster 限制 |
| 安全 | 未授权访问 |
Redis 除了缓存三大问题外,还常见缓存一致性、热点 key、大 key、内存淘汰、主从延迟、持久化抖动、Cluster 跨槽限制和安全问题。
在开发侧主要关注一致性和热点问题,在运维侧重点是内存、复制和持久化,在架构层面要注意 Cluster 和高可用设计。