← 中文资源

简体中文版本

缓存命中率优化工作流

按键类别度量命中率,把未命中分为冷启动、容量与失效三类,对症下药。

阅读英文原文

目标

92% 的命中率可能意味着:增长的键空间上的冷未命中、热键被容量驱逐、或失效间隔比复用间隔还短。三种病各有各的药,笼统调长 TTL 或加容量哪种都不对症。按类别量命中率、把未命中分型、对症修,最后用延迟与源站负载一起闭环。

步骤要点

  1. 按键类别打点命中率:把总命中率拆到热实体、查询结果、会话等类别,各类未命中成因与价值都不同。
  2. 给未命中分型:每类内部归因——冷(该键首访)、容量(复用前被驱逐)、失效(两次访问间过期或被清)。
  3. 修主导型:冷启动用预热或旧值兜底,容量调整配额与驱逐策略,失效改键版本或校准 TTL。
  4. 显式保住头部键:对最高流量的键做驻留保证——钉住、部署时预热或按正确性允许延长 TTL。
  5. 延迟与源站负载双验证:命中率提升要落到用户可见延迟与源站请求量下降上才算数。

排错提示

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