seegongsik
我的单词本
数据

放近处快快用,缓存

假设你常看的书每次都得跑到远处的仓库去取。来回一趟得花好久。可要是桌上放一本副本呢? 往后只要一伸手就行。把常用的东西在近处放一份副本,这个办法就是缓存。

01

远处的仓库来回慢

前面我们学过,数据库
靠索引直接跳到答案。
可找到之后,
还得从某处把数据取出来。
要是那个存储在远处呢?
来回的路长,每取一次
都要花不少时间。
而且同样的东西要再看时,
又得走一趟那条远路。

我的座位远处仓库A7
点数据,从远处仓库取出来

点数据,从远处的仓库取出来。路长,来回得花好一会儿。

取一次路就够远了。
一两次还忍得了。
可要是同样的数据
一天要看几百次呢?
那条远路要来回几百趟。
光想想就憋得慌。
常看的东西,
真有必要每次都跑远吗?

02

在近处放一份副本

办法出乎意料地简单。
常看的数据,
从远处仓库取一次之后,
在近处放一份副本。
这个近处的存放箱叫缓存。
下次再找同样的东西,
就不用跑到远处仓库。
从身边的缓存走条短路,
马上就取出来。

我的座位近处的缓存空的远处仓库3
常用项目
点一个项目,在近处的缓存里放份副本

点数据,把副本复制进近处的缓存。空着的缓存就填上了。

近处的缓存里有副本了。
现在再找同样的数据,
就可以忘掉远处仓库。
从缓存走条短路马上取出。
不过有一件事要留意。
要找的东西在缓存里时,
和不在时,做的事不一样。
咱们把这两种情况分开看。

03

命中与未命中

找的时候有两条岔路。
要找的东西缓存里已经有,
就走短路马上取出。
这叫命中。快。
要找的东西缓存里没有,
只好跑到远处仓库。
这叫未命中。慢。
未命中时,趁取回的机会,
把副本留在缓存里。
这样下次就成了命中。

我的座位缓存远处仓库
请求
点一个请求。把同一个点两次就看出区别了

点一个请求。在缓存里就走短路命中,不在就走长路未命中,然后在缓存里留份副本。

起初未命中很慢,
可留下副本之后,
同样的请求命中就快了。
越是常看的东西,
命中越多,平均就越快。
缓存就因此靠得住。
不过有一件头疼事。
远处仓库的原件变了,
缓存里的副本会怎样?

04

缓存变旧的时候

缓存只是个副本。
远处仓库的原件变了,
缓存却不知道,
还拿着以前收到的旧副本。
那命中是快,
可给出的值可能是旧的。
这叫缓存过时。
快是快,却有给出旧值的风险,
这就是缓存的阴影。
怎么挡住它?

原件 (远处仓库)17副本 (缓存)1717 = 17
缓存和原件一样,命中给出正确的值

点原件改它的值。缓存还是旧值。把缓存重新填或扔掉,就又对上了。

一改原件,缓存就对不上了。
挡住的路主要有两条。
一是原件一变,
就把缓存用新值重新填一遍。
二是给副本定个期限,
过一段时间就扔掉。
扔空的位置在下次未命中时,
用新副本再填上。
不管哪种,都是一种平衡:
减少旧值,又留住快速命中。

05

来理一理

归成一句话,是这样。
远处的存储来回路长,慢。
常用的东西在近处放份副本。
那就是缓存。
要找的东西在缓存里就是命中,快;
不在就是未命中,跑到远处。
未命中后留份副本,给下次备着。
原件一变,缓存就变旧,
就重新填或扔掉来挡住。
放近处快快用,这就是缓存。

依次点四个要点
从上往下依次点下面的要点

依次点要点回顾一下。(远处慢 → 近处副本 → 命中与未命中 → 原件一变就旧)

现在你知道了在近处放份副本,
把同样的东西再快快用的办法。
每次跑远路的憋闷,
靠一份副本就痛快地解开了。
为换来的快而顾着旧值,
这种平衡感就是处理数据的力量。
缓存藏在电脑各处。
下回这份副本的智慧还在哪儿
用得上呢? 咱们接着一起看下去。

一句话总结缓存是把常用数据的副本放在近处的办法。远处的存储慢,因为来回的路长。可副本放近处,往后就走一条短路马上取出。要找的东西在缓存里,就叫命中,快快取出。不在,就叫未命中,跑到远处取回来,再把那份副本留在缓存里。所以下次就成了命中。也有短处。原件变了,缓存里还留着旧副本,可能给出旧值。这叫缓存过时。所以时不时把缓存重新填一遍,或过一段时间就扔掉,挡住旧值。一句话,把副本放近处,命中就快,原件一变就把缓存刷新,这就是缓存。
数据
如果有帮助,请支持我们