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

常见坑

  1. 缓存穿透:查不存在的 key 打到 DB → 空值缓存 / 布隆过滤器
  2. 缓存击穿:热点 key 过期瞬间并发打 DB → 永不过期 / 互斥锁重建
  3. 缓存雪崩:大量 key 同时过期 → 随机过期时间
  4. 大 Key:KEYS * 阻塞、DEL 大 key 阻塞 → 用 SCAN / UNLINK
  5. 慢命令:KEYS、HGETALL 大 hash → 改用 HSCAN

运维工具

  • 监控:Redis Exporter + Prometheus + Grafana
  • 慢日志:CONFIG SET slowlog-log-slower-than 10000
  • 分析: edis-cli --latency、INFO commandstats

需要 Redis 调优?查看持续维护服务。