Redis 生产实践:高可用与热点治理全攻略

高可用架构

  • 单实例仅限开发;生产至少哨兵模式,业务访问虚拟主机/主节点。
  • 高写/大容量选 Cluster 分片,客户端需支持 cluster。
  • 跨 AZ/机房:使用 Proxy/SDK 支持的多副本读取,主从延迟监控。

持久化与数据安全

  • RDB + AOF 混合:appendonly yesappendfsync everysec,AOF 重写定期执行。
  • 大键/大列表:限制最大长度;使用流式结构替代一次性大值。
  • 过期与淘汰:为缓存键设置 TTL;策略 allkeys-lruvolatile-lru 视场景。

缓存一致性与双写

  • 读写模式:更新 DB 后删除缓存(延迟双删防并发),或写透/写回需队列保障。
  • 防击穿:热点键加互斥锁或本地缓存;永不过期键定期异步刷新。
  • 防雪崩:TTL 加随机抖动;分批重建,避免同一时刻失效。

热点治理

  • 本地缓存 + Redis 二级缓存;对热点 key 加单航班锁。
  • 压力测试识别热点;对高频写入的 hash/list 做分桶或拆 key。
  • 热点检测:采集慢查询、hotkeys 采样、命中率与 QPS 指标。

限流与令牌桶示例(Lua)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-- key: rate_limit:{user}
-- ARGV: max_permits, window_ms
local key = KEYS[1]
local max_permits = tonumber(ARGV[1])
local window = tonumber(ARGV[2])
local now = redis.call("ptime")
local bucket = redis.call("hmget", key, "permits", "ts")
local permits = tonumber(bucket[1]) or max_permits
local ts = tonumber(bucket[2]) or now
local delta = math.max(0, now - ts)
local add = delta * (max_permits / window)
permits = math.min(max_permits, permits + add)
local allowed = permits >= 1
if allowed then permits = permits - 1 end
redis.call("hmset", key, "permits", permits, "ts", now)
redis.call("pexpire", key, window)
return allowed and 1 or 0

监控与告警

  • CPU/内存/连接数、主从延迟、命中率、Evicted/Expired、慢查询。
  • AOF/RDB 耗时与失败,磁盘空间阈值。
  • 请求延迟分布(P95/99),限流命中率,热点键指标。

安全与配置

  • 绑定内网地址,启用 ACL;禁用 FLUSHALLKEYS * 等危险操作在生产使用。
  • Netfilter/安全组限制来源;若暴露公网,必须有认证 + TLS。
  • 升级/迁移:先灰度从库,切主前确保复制追平。

总结

Redis 生产稳定性 = 高可用 + 持久化 + 缓存策略 + 热点治理 + 观测告警。按上述要点自查,并通过压测与演练验证,才能让缓存成为可靠加速层而非单点风险。***