在学习计算的时候,相信缓存大家一定都不会感到陌生,但是大家可以回忆一下,学习缓存之初是否有将缓存和内存划等号的想法?相信现在的你一定知道缓存不完全等于内存,那么到底什么是缓存?缓存有哪些策略?使用缓存的时候需要注意什么呢?这篇文章就带你走进缓存的世界一探究竟!
1. 缓存是什么
学习之初,我一度认为缓存和内存是一致的,随着学习的深入发现缓存和内存完全不是一码事!我对缓存的理解是:由于计算机中不同硬件之间存在显著的速度差异,所以根据木桶短板效应,速度慢的一方变成了瓶颈,所以人们为了充分利用速度快的一方,开发了缓存这种结构,用来协调两者速度的差异。
那实际生活中有哪些地方都有使用到缓存呢?以流行的某音为代表的短视频app,刷短视频的过程中丝滑的切换就是使用到了缓存,应用会提前缓存部分视频数据,这样不需要每划动一次都需要等待视频的下载。同时在这里区分一些缓存和缓存区的概念,缓存区是一块临时存储数据的区域,后续数据会传输给其他设备,例如写入磁盘中等等。
缓存主要分为三类:静态缓存、动态缓存、本地缓存。静态缓存例如掘金社区用户会写很多技术分享文章,此时可以把文件作为静态文件缓存在前端服务器上,这样减小了数据库的访问压力。动态缓存中大家比较熟悉的就是Redis作为分布式缓存。本地缓存常用来处理热点数据,可以使用HashMap写入到程序中缓存微博的热点话题。
2. 缓存策略
上面介绍了缓存的一些基本概念,接下来介绍三种缓存读写的策略,都是以缓存+数据库的方式为例介绍。
2.1 旁路策略
旁路缓存策略可以理解为以数据库的数据为标准。
- 读请求的逻辑是:请求首先到缓存中查询,缓存命中则直接返回数据,没有命中则去数据库中查询,将查询到的数据写入缓存中,再返回数据。
- 写请求的逻辑是:第一步直接在数据库中执行请求,第二步删除缓存中旧数据。
2.2 写穿/读穿策略
写穿/读穿策略中请求和缓存交互,缓存和数据库交互。
- 读请求:请求首先查询缓存是否命中,命中则直接返回结果;没有命中时,缓存组件会将数据库中数据同步到缓存中,再返回结果。
- 写请求:首先查询缓存中是否存在,如果存在直接写入缓存,同时由缓存组件同步写入到数据库中;如果缓存中没有,则直接写入到数据库中。
2.3 写回策略
写回策略是计算机底层常用的策略,我们看看他的读写请求是怎么执行的。
- 读请求:首先查看缓存是否命中,命中则直接返回结果,没有命中则申请可用的缓存块,查看缓存是否为脏,如果为脏,则将数据刷新到数据库中,然后从数据库中加载目标数据到缓存块中,返回结果,将缓存块标记为干净。
- 写请求:首先查看缓存中是否命中,如果命中,直接写入缓存中,并且将缓存标记为脏;如果缓存没有命中,则需要查看缓存是否为脏,如果为脏则需要将数据刷新到数据库中,然后将数据库中需要的数据加载到缓存中,然后写入缓存,将缓存标记为脏。
3. 使用缓存的注意点
缓存使用非常普遍,但是缓存也让系统复杂度提高,同时缓存一般使用的是内存,需要在设计的时候合理使用缓存,注意内存的使用大小。