摘要:Redis 凌晨集中过期、MySQL 被打满,传统解法是"加随机 TTL"。用螺旋生成论看,本质是 Key 的过期相位同步塌陷。本文给出按热度分带的螺旋 TTL 算法,可直接用。
标签:螺旋生成论, 螺旋相位, AIGC, Redis, 缓存
分类专栏:数据库(专栏:IT疑难杂症诊疗室:螺旋相位诊断法)
创作话题:AI 原生开发实战
Redis 缓存雪崩?不是 TTL 一样,是过期相位同步塌陷(附打散脚本)
昨天订单服务凌晨 2 点报警:
- 缓存命中率 98% → 31%
- MySQL CPU 95%
- P99 从 80ms 飙到 2.3s
原因很简单:200 万 Key 同时写入,TTL 都是 3600s。
凌晨 2 点一起过期,后端被击穿。
传统说法:"加随机值。"
螺旋说法更准:
缓存雪崩 = 过期相位同步塌陷。
螺旋 TTL:热 Key 内圈、冷 Key 外圈
import math, hashlib
BASE_TTL = 3600
JITTER = 1800
def spiral_ttl(key: str, heat: float) -> int:
h = int(hashlib.md5(key.encode()).hexdigest(), 16)
phi = (h % 100000) / 100000 * 2 * math.pi
base = 1800 + int(heat * 7200) # 热 Key 活更久
jitter = int(math.sin(phi) * 2400 * (1 - heat))
return max(300, base + jitter)
print(spiral_ttl("hot:order:1", 0.95)) # 热 Key:长且稳
print(spiral_ttl("cold:log:9999", 0.05)) # 冷 Key:短且散
效果:
| 指标 | 改前 | 改后 |
|---|---|---|
| 凌晨命中率 | 31% | 92%+ |
| MySQL 峰值 CPU | 95% | 55% |
| 集中过期/秒 | 数万 | 千级 |
别只加随机 TTL,要把 Key 的生存周期铺成一条螺旋。
热 Key 靠内圈、冷 Key 靠外圈、失效时刻沿相位展开。
下一篇:PG 主从延迟跳变,先看 WAL 相位流速差。
参考文献
- 张智明. 螺旋数原理. Zenodo. DOI:10.5281/zenodo.20602099
本文由作者原创,部分代码由 AI 辅助生成。