缓存入门:为什么第二次打开更快
很多人都有过这样的体验:第一次打开一个网页要等好几秒,关掉再打开却几乎是瞬间完成;第一次打开应用要加载很久,之后再用就顺滑得多。这并不是网络突然变快了,而是缓存起了作用。理解缓存,就等于理解很多软件“越用越快”背后的原因。
缓存说白了就是把算过、拿过的结果先存起来,下次需要时直接取用,不再重新算一遍、重新跑一趟远路。比如浏览器第一次访问一个网站时,会把图片、样式文件这些不太常变的内容存在本地;第二次访问时,如果这些内容没有过期,浏览器就直接用本地的副本,省去了重新下载的时间。服务器和程序内部也有类似的缓存:把经常被查询的数据放在离使用者更近、读取更快的地方,查询就不用每次都去翻最底层的数据库。
为什么缓存能省时间呢?因为很多开销都来自重复劳动和远距离传输。查一次数据库要经过网络、解析查询、扫描数据,步骤不少;如果同一个结果一分钟内被问了一百次,每次都完整走一遍就很浪费。把结果放在内存里,读取速度比查数据库快得多,重复查询的代价就降下来了。同样道理,离用户更近的缓存节点可以少走几段网络,图片和视频加载起来自然更快。
不过缓存也有一个天生的麻烦:存起来的结果可能会过期。原数据变了,缓存里的旧副本如果还被当成新的用,用户看到的就是过时的内容。比如商品价格改了,页面却还显示旧价;头像换了,别的地方却还显示旧头像。解决办法是给缓存定一个有效期,过期就重新去取;或者在原数据变化时主动通知缓存把旧副本删掉。有效期定得太长,内容容易过时;定得太短,缓存又起不到省时间的作用,拿捏这个平衡是缓存设计里最常见的考量。
缓存失效还会带来另一个现象,叫缓存穿透和缓存雪崩。穿透是指查询的东西根本不存在,缓存里没有,请求每次都落到数据库上,等于缓存白设了;办法通常是把“不存在”这个结果也短暂记下来,或者先校验请求的合理性。雪崩是指大量缓存同时过期,所有请求一下子涌向数据库,把数据库压垮;办法是让不同缓存的过期时间错开,或者在过期瞬间只放一个请求去刷新,其余请求先等一等。
用好缓存还有几个日常习惯值得注意。第一,分清什么值得缓存:变化慢、读取多的数据最适合,比如配置、分类列表、热门文章;变化快、每人都不一样的数据就不适合,比如实时余额、个人订单状态。第二,缓存不是越大越好:内存有限,存太多不常用的内容反而会挤走常用的内容,定期清理和设置容量上限很有必要。第三,出了问题先想想是不是缓存:改了配置没生效、换了图片还是旧的,很多时候不是代码错了,而是旧缓存还没过期,手动清一次缓存或者等有效期过去,问题就消失了。
缓存的本质其实很朴素:别重复做已经做过的事,别重复跑已经跑过的路。第一次慢一点没关系,把结果妥善存好,第二次就能快很多。明白了有效期、失效和容量这三个关键点,再看各种“越用越快”的软件,就会发现它们背后大多是同一套思路在起作用。
- 点赞
- 收藏
- 关注作者
评论(0)