上网遇到某些网络问题,经常会有人提醒我们清一下缓存,这里的缓存,包括浏览器缓存和DNS缓存。写代码时,遇到高并发、高性能的场景,我们也会引入一些缓存策略。

那,究竟什么是缓存?

缓存,是将常用的数据存储到离使用者更近的地方。

例如,我正写一篇论文,需要从图书馆查阅一本专业书籍,每次看书,我都跑去图书馆,这样效率很低,更好的做法是,将这本书带回家,放在书桌,以便随时查阅。

这个例子中,书桌就是一个缓存。我可以直接从书桌拿起书进行查阅,而不用频繁往返图书馆,大大提升了效率。

通过借书,很容易理解为什么缓存能提升效率。当然,局限性也很明显,书桌空间有限,只能存放少量书籍。

那缓存在计算机中如何工作?

以浏览器缓存为例,当我们第一次访问微博时,浏览器内不存在任何微博数据,它要下载构成微博的所有资源,例如:HTML、CSS、JavaScript、图标、图片等,下载完成浏览器会将这些资源缓存在电脑上。当我们再次访问微博,多数资源可以从缓存中直接获取。只有少量未被缓存的资源需要从互联网获取。

这也是清除缓存可以解决某些问题的原因。因为网站数据会随时更新,如果缓存更新不及时,浏览器会继续使用缓存中的旧版本数据,从而导致数据一致性的问题。

1111.png

当然,缓存不仅存在于浏览器中,在硬件方面,例如:CPU、内存、SSD、HDD都有缓存。这些硬件会创建一个有层次的缓存结构,在最顶部的CPU缓存,速度快,存储量小。在最底部的HDD硬盘,存储量大,但与CPU缓存相比,速度非常慢。

hard.gif

这跟图书馆的策略类似,借阅频繁的书放在前台书架,取书速度最快。普通书放在图书馆书架,与前台相比,存储空间大很多,但需要一定时间才能找到。最后,将几乎不被借阅的书放到归档室进行异地存储,这里空间最大,查找速度也最慢。

在软件方面,缓存更是无处不在,操作系统、浏览器、DNS、数据库、WEB服务器都会使用。并且所有使用缓存的地方目标都一致,就是以更快的速度获取数据。

了解了缓存原理,再来看缓存策略。

还以借书为例,当我们拿回家的书足够多时,书桌放满,意味着缓存已满。这个时候,当需要借阅新的书时会怎么做?当然是将一部分书还回图书馆。

那,如何确定还回哪些,保留哪些?

常见做法是,将近期没看过的书还回,近期常看的保留。对应到计算机缓存也是一样。

当缓存空间已满,且又有新的数据需要缓存时,通常会将最近最少使用的缓存数据删除(LRU),这是一种有效且易于实现的策略,也是目前使用最多的策略。

虽然这种策略足够简单,但仍需要计算缓存数据的使用时间,无形中增加了计算量,减慢了缓存更新的速度。

面对这种情况,还有一种简单粗暴的策略较为常用,叫随机替换。顾名思义,当缓存已满,且有新的数据需要缓存,系统会随机删除一些缓存,保证有足够空间缓存新的数据。

虽然听起来这是一个笨方法,但在某些场景,它的效果并不比LRU差多少,且实现起来要简单许多。最近很火的ARM处理器,就采用随机替换的缓存策略。

文章结束。

苦李

祝好。

扫码关注李苦李公众号

李苦李公众号

标签: 缓存

添加新评论