图书管理员查完库存,把“5 本”写在手边卡片上。下一次有人问,他先看这张卡,就省去一次查库。
问题出在两次提问之间:库里借走了一本,卡片却没更新。这份合成例子把几个时刻分开列了出来:
| 时刻 | 真实库存 | 卡片值(本步前→后) | 读到的值 | 是否重新查询 |
|---|---|---|---|---|
| t0 | 5 | 空→空 | 不读取 | 否 |
| t1 | 5 | 空→5 | 5 | 是 |
| t2 | 4 | 5→5 | 不读取 | 否 |
| t3 | 4 | 5→5 | 5(旧值) | 否 |
| t4 | 4 | 5已过期→4 | 4 | 是 |
最容易混淆的是 t2 和 t3。t2 只改变真实库存,没有人读取;t3 才有人来问,管理员拿仍可使用的卡片回答,于是说了旧值 5。
到 t4,卡片过期,管理员重新查库,读到 4,并把卡片改成 4。
这就是本例里三个词的意思:命中是手边有可用答案,未命中是需要重新查询,过期是旧记录超过了约定的使用期限。软件还可以采用主动更新等别的做法,这个例子只演示按期限重新查询。
可以用末尾的小题自查一下:其他条件不变,只把 t2 的真实库存改成 3,t3 会读到多少?沿着“这一步有没有刷新卡片”去看。
复用这份示例的完整提示词:
请给完全没学过编程的人解释缓存。变量示例:【概念】缓存;【读者】能理解图书馆借书流程;【类比】管理员把常用查询答案写在手边卡片上;【范围】只讲命中、未命中、过期与旧数据,不讲分布式系统;【演示数据】t0真实库存为5且卡片为空,t1第一次读取库存,t2后台把真实库存改成4但卡片没刷新,t3再次读取,t4卡片过期后再读。先用两句话解释为什么要保存一份结果,再用不超过五行的表展示每个时刻的真实值、卡片值、读到的值和是否重新查询;没有读取的时刻写“不读取”。必须让t3读到旧值5、t4重新取得4,不要假设后台一改卡片就自动更新。之后分别用一句话解释命中、未命中和过期,避免用术语解释术语。明确指出图书卡片类比的一个边界:真实软件的刷新策略并不都靠固定时间。最后提出一道只有一个变量变化的理解题,暂不提供答案。总解释控制在350个汉字左右,不用“像高速公路一样快”这类无法检查的说法。
本次输入(确切变量取值;以上要求保持不变):
概念:缓存;读者从未学过编程;类比:图书管理员把常用查询答案写在手边卡片上;数据序列t0库存5,t1读取,t2后台库存改成4但卡片未刷新,t3再次读取,t4卡片过期后读取;不讨论分布式系统。