目标
92% 的命中率可能意味着:增长的键空间上的冷未命中、热键被容量驱逐、或失效间隔比复用间隔还短。三种病各有各的药,笼统调长 TTL 或加容量哪种都不对症。按类别量命中率、把未命中分型、对症修,最后用延迟与源站负载一起闭环。
步骤要点
- 按键类别打点命中率:把总命中率拆到热实体、查询结果、会话等类别,各类未命中成因与价值都不同。
- 给未命中分型:每类内部归因——冷(该键首访)、容量(复用前被驱逐)、失效(两次访问间过期或被清)。
- 修主导型:冷启动用预热或旧值兜底,容量调整配额与驱逐策略,失效改键版本或校准 TTL。
- 显式保住头部键:对最高流量的键做驻留保证——钉住、部署时预热或按正确性允许延长 TTL。
- 延迟与源站负载双验证:命中率提升要落到用户可见延迟与源站请求量下降上才算数。
排错提示
TTL 短于平均复用间隔是自伤,每次二次访问按构造必然未命中,先对齐访问模式与陈旧容忍度;冷流量洪峰把热键挤出去是纯 LRU 的弱点,头部键要显式钉住;命中率涨了延迟没动,多半优化的是低价值类别,按流量权重看结果。
适用边界
命中率的提升要以数据陈旧容忍度为上限,正确性敏感数据不可盲目延长 TTL;驱逐策略调整需重启或逐节点滚动,注意切换期的命中率抖动。
代码示例
hit ratio by class (weighted by traffic):
product_query 94% hit (61% of traffic) dominant
user_session 98% hit
search_results 71% hit <- worst
miss classification (search_results):
cold 9% (novel queries, fine)
capacity 62% <- evicted before reuse
invalidation 29% (TTL 60s < avg reuse 3m)
fixes (matched):
capacity: maxmemory-policy allkeys-lru ->
volatile-lru + size 2GB -> 6GB
(top-keys pinned)
invalidation: TTL 60s -> 180s (staleness ok:
price tolerance 5 min, agreed w/ product)
after: search hit 71% -> 93%
origin search load: -58% p99: 610 -> 240ms