一、缓存分类
宏观上可分为共享缓存和私有缓存,共享缓存指能被各级代理服务器缓存的缓存,私有缓存指只能被客户端缓存的缓存,各级代理均不能缓存。微观上可分为以下四类:
1、数据库数据缓存
为了减小数据库压力,提高数据库查询性能,将查询后的数据放在内存中进行缓存,下次查询时直接从内存中返回,提高查询响应效率。
2 、服务器端缓存
[1]、代理服务器缓存
代理服务器是浏览器和源服务器之间的中间服务器,浏览器先向这个中间服务器发起Web请求,经过处理后(比如权限验证,缓存匹配等),再将请求转发到源服务器。
代理服务器缓存的运作原理跟浏览器的运作原理差不多,只是规模更大。可以把它理解为一个共享缓存,不只为一个用户服务,一般为大量用户提供服务,
因此在减少相应时间和带宽使用方面很有效,同一个副本会被重用多次。常见代理服务器缓存解决方案有Squid,Nginx,Apache等。
[2]、CDN缓存(网关缓存/反向代理缓存)
CDN缓存一般是由网站管理员自己部署,为了让他们的网站更容易扩展并获得更好的性能。
3、web应用层缓存
应用层缓存指的是从代码层面上,通过代码逻辑和缓存策略,实现对数据,页面,图片等资源的缓存,可以根据实际情况选择将数据存在文件系统或者内存中,减少数据库查询或者读写瓶颈,提高响应效率。
4、浏览器缓存
将数据缓存到磁盘或内存中,再次请求时判断是否命中缓存。命中缓存则返回缓存数据,否则重新从服务器获取数据并更新缓存。
二、缓存的优势?
- 缓解服务器压力(不用每次都去请求资源)
- 提升性能(从本地获取资源速度自然比请求获取速度快)
- 减少带宽消耗l
三、浏览器的缓存策略
浏览器缓存分强缓存和协商缓存两种。
如果命中强缓存(在缓存时间内),则直接在内存或本地磁盘中读取缓存数据,不再需要向服务器发送请求。强缓存可以通过设置请求头header值为Expires或Cache-Control 实现。
如果未命中强缓,浏览器则将缓存标识发送给服务器,服务器判断当前标识资源是否有更新,无更新则返回304状态码(此时即命中协商缓存)。资源有更新则返回状态码200和更新资源,并更新缓存内容。协商缓存可以通过设置请求头header值为 ETag或Last-Modified 实现。
1、Expires / Cache-Control
Expiers是HTTP/1.0控制网页缓存的字段,它规定了缓存过期的一个绝对时间。Cache-Control: max-age=2592000是HTTP/1.1定义的关于缓存的字段,它规定了缓存过期的一个相对时间。优先级 max-age > Expires
2、Last-modified / ETag
Last-modified表示文件最后一次修改的时间,ETag是对文件的一个标识。发现缓存过期,于是会在本次请求的请求头里携带If-Moified-Since
和If-None-Match
这两个字段,服务器通过这两个字段来判断资源是否有修改,如果有修改则返回状态码200和新的内容,如果没有修改返回状态码304,浏览器收到200状态码,该咋处理就咋处理(相当于首次访问这个文件了),发现返回304,于是知道了本地缓存虽然过期但仍然可以用,于是加载本地缓存。然后根据新的返回的响应头来设置缓存。