从查一次通讯录说起

假设你每天都要查询同一个办公室电话。每次翻完整本通讯录很慢,于是把查到的号码记在便签上,下次先看便签。这张便签就像缓存。

网站也会做类似的事:把频繁查询的分类列表或处理好的页面片段放到更快读取的位置。命中缓存时,可以少查数据库、少计算,访问就可能更快。

一眼看懂 / 示意图

缓存命中时,走更短的路

缓存命中时,走更短的路本次请求找对应的可用缓存命中直接返回现成结果未命中读原数据或重新计算有可用结果无可用结果返回新结果按规则保存供下次复用
  1. 01命中路径

    直接复用适用的结果

  2. 02未命中路径

    重新取数,再按规则保存

服务器业务缓存的简化流程,不替代各类缓存的一致性设计。

命中与没命中,实际走两条路

假设网站首页要显示分类列表。第一次打开时,缓存里还没有,于是程序从数据库查出列表,交给页面,同时留一份缓存。第二个人很快访问,如果这份结果仍可用,就直接取缓存,不必重复走数据库查询。

这里的“命中”,指找到适合这次请求的可用结果,不是缓存里随便有点东西就算。中文列表不能误拿英文列表顶替,用户甲的私人页面更不能交给用户乙。管理员修改分类后,也需要按设计让旧列表失效或更新。图中把命中的短路和未命中的取数路分开,避免让人误以为每次都必须先用缓存、再完整查一遍原始数据。

缓存最麻烦的是“已经变了”

办公室换了号码,便签却还留着旧号码,就会出错。系统需要决定什么时候过期、哪些修改会使缓存失效,以及找不到缓存时如何重新获取。

常见方法有设置有效期、数据修改后主动失效、用版本号区分新旧结果。有效期越短通常越新鲜,但重复读取或计算也可能越多,选择取决于业务。

缓存和备份,不是同一件事

缓存主要服务于访问效率,很多缓存可以在丢失后从原始数据重新生成。备份则用于恢复数据,不应仅靠一份可能自动过期的缓存承担。

浏览器和网站服务器都可能留缓存,位置和更新规则各不相同。清掉自己浏览器的缓存,不等于网站服务器保存的旧结果也一起消失。