Redis 是后端系统的「瑞士军刀」,但用不好也是故障源头。 本文整理我们生产环境踩过的坑。
键设计:好的键能省一半内存
- 用业务前缀:user:profile:12345、order:detail:67890
- 避免过长键名:内部使用的键可短(如 u:p:12345)
- 分隔符统一用 :,方便 KEYS prefix:* 排查
- 避免热 key:单 key 过大(>1MB)或访问过频(>10w QPS)
内存:OOM 前的预警
- 设置 maxmemory + maxmemory-policy allkeys-lru
- 监控 used_memory、used_memory_rss、mem_fragmentation_ratio
- 大 Value 拆开:Hash 字段 / List 切片 / Set 分桶
- 定期扫描大 key: edis-cli --bigkeys
持久化:RDB vs AOF
- RDB:定时快照,恢复快,可能丢最后一次之后的数据
- AOF:每秒 fsync,最多丢 1 秒,写放大
- 生产推荐:AOF everysec + RDB 兜底
- 禁止在主库做 BGSAVE 阻塞操作
集群:什么时候上
- 单实例 > 10w QPS 或 > 10GB 内存再考虑
- Cluster 至少 3 主 3 从,slots 均匀分布
- 多 key 操作(MGET / MSET / Lua)确保在同一 slot
- 客户端用 hash tag:user:{12345}:profile
常见坑
- 缓存穿透:查不存在的 key 打到 DB → 空值缓存 / 布隆过滤器
- 缓存击穿:热点 key 过期瞬间并发打 DB → 永不过期 / 互斥锁重建
- 缓存雪崩:大量 key 同时过期 → 随机过期时间
- 大 Key:KEYS * 阻塞、DEL 大 key 阻塞 → 用 SCAN / UNLINK
- 慢命令:KEYS、HGETALL 大 hash → 改用 HSCAN
运维工具
- 监控:Redis Exporter + Prometheus + Grafana
- 慢日志:CONFIG SET slowlog-log-slower-than 10000
- 分析: edis-cli --latency、INFO commandstats
需要 Redis 调优?查看持续维护服务。