知识卡片

缓存热点:用多副本分散压力,且过期时间要错峰随机化

普通读书笔记卡

内容

缓存热点指的是即使缓存系统整体性能很高,一旦大部分甚至全部业务请求都集中命中同一份缓存数据,这份数据所在的那台缓存服务器依然会承受巨大压力——典型场景是某明星发一条爆款微博,短时间内千万级用户同时来围观同一条内容。解决思路是给热点数据复制多份缓存副本,把原本集中打向一台服务器的请求分散到多台缓存服务器上:比如对粉丝数超过100万的账号,每条微博生成100份内容完全相同的缓存副本,通过在缓存key里加编号区分不同副本,业务读缓存时随机挑一份读取,从而把原本集中的压力摊薄到多台服务器。这个方案有一个容易被忽略但很关键的细节:多份缓存副本不能设置成统一的过期时间,否则会出现所有副本同时生成、又同时过期失效的情况——这等于把单点的缓存热点问题,变成了[[缓存雪崩的连锁反应机制及更新锁与后台更新两种方案]]描述的那种集中失效引发的连锁反应,本质上是把热点问题转换成了雪崩问题。正确的做法是给过期时间设定一个范围,每份缓存副本的具体过期时间在这个范围内取随机值,让各副本的失效时间点错开,避免所有副本在同一时刻集体失效。

参考来源

- 位置:《从零开始学架构》第17讲《高性能缓存架构》"缓存热点"(源文件:_epub-src/OEBPS/text00001.html) - 结论依据:原文说明"缓存热点的解决方案就是复制多份缓存副本,将请求分散到多个缓存服务器上……对于粉丝数超过 100 万的明星,每条微博都可以生成 100 份缓存……每次读缓存时都随机读取其中某份缓存",并提醒"不同的缓存副本不要设置统一的过期时间,否则就会出现所有缓存副本同时生成同时失效的情况,从而引发缓存雪崩效应。正确的做法是设定一个过期时间范围,不同的缓存副本的过期时间是指定范围内的随机值",直接支撑本卡片结论。 - 原始内容:缓存热点的解决方案就是复制多份缓存副本,将请求分散到多个缓存服务器上,减轻缓存热点导致的单台缓存服务器压力……不同的缓存副本不要设置统一的过期时间,否则就会出现所有缓存副本同时生成同时失效的情况,从而引发缓存雪崩效应。