一. 前言
说起缓存,业内有句话,架构师有一半以上的时间是在和缓存打交道。那么缓存到底是什么呢?又有什么作用呢?该系列将揭开缓存神秘的面纱,从零开始,由浅入深,细究各类缓存。
缓存我个人理解,是利用空间换时间最好的体现,将一些耗时操作(复杂的数据库查询、文件内容的读取)、不经常改变的数据(比如商城的商品大类别),放到缓存(内存)里,提高了访问速度。比如我们很常见的一个例子,某某知名网站的某个页面,可能再特殊情况下,该页面1分钟会有100w次访问量,那就意味着访问了100w次数据库,我的天!忽略服务器端是否会挂掉的问题,假设不挂掉,那么也是需要强大的结构来支持(什么分布式部署、数据主从配置之类),成本巨大;这时如果第一个人访问的时候,我把该页面缓存起来,那么后面的999999次访问都是从缓存中获取,实际上相当于1分钟只访问了一次数据库,性能差别可想而知。
从我上面举得例子中,我们很容易能看出来,缓存最大的优势:节约时间、提高性能。
那么你可能会问,缓存有这么大的好处,我们是不是数据都可以放到缓存里,来提高性能呢?答案是肯定的:不能!万物都有两面性,有利必有弊,细心的人,会从从上面的例子中发现,我将商品的类别缓存起来,但是商品的类别是肯定会更新的,更新了怎么办? 这时候引出一个词语“缓存过期时间”,意味着我们可以设置缓存的过期时间,一旦缓存过期,将重新获取数据,进行更新。你可能还会问,缓存过期时间设置为多少合适呢?如果缓存还没过期,商品类别的信息已经更新了,那么怎么办呢? 解决这个问题,需要引出一个新的词语“缓存依赖”,缓存可以依赖:文件、文件夹、数据库,依赖项一旦发生变化了,缓存立即更新。
下面我们总结一下缓存好处和弊端:
好处:访问速度快,提高了并发访问返回速率的时间。
弊端:数据放到内存里,失去了及时性。(可以通过缓存依赖解决)
我们什么情况下适合用缓存呢?
(1). 查询多,修改少的数据。
(2). 信息要求不是很及时,允许适当的延迟。
(3). 复杂的计算、远程接口、长时间的查询。
(4). 高并发,但如果数据量太大,高并发太高,单纯的服务器数据缓存是满足不了的,需要引入分布式缓存(NoSql)。
二. 前端缓存
读了“前言”,你可能对缓存的概念有了一定了解,但是细心的人可能会更疑惑,因为他在生活中发现了这样几个现象,在手机上装了一个应用,比如QQ,初次安装时可能100M左右,但随着使用,一个月后,发现,我的天,竟然1G了,在QQ的设置页面里,有个选项,叫“清空缓存数据”,如下图:
点击进行清空后,发现QQ所占的空间又变小了,这里也称作缓存,但是你可能会发现,在前言中提到,缓存是存在服务器内存中的,那么为什么本地的空间后变大呢,