程序运行的局部性
时间局部性:一个数据访问后,很快被再次访问
空间局部性:一个数据被访问时,其周边数据也有可能被访问到网页
缓存概念
热区
我们一个站点可能20%的页面,承担80%的流量,我们把这20%称为热区
失效性
缓存空间耗尽:LRU,最近最少使用的被清除
过期时间:缓存清理(即空间没有耗尽,缓存到了过期时间也要清理。)
命中率
衡量缓存的指标,是缓存命中率
页面命中率:基于页面数量进行衡量
字节命中率:基于页面体积进行衡量
命中率低的原因
缓存空间太小: 导致大量LRU缓存被删除了
缓存时间太短: 数据刚刚缓存,就过期了(原数据更新频繁)
缓存没有预热
我们要缓存读多写少的页面
web缓存
私有数据:用户私有信息,只能为特定用户的缓存(带cookie信息的,但电商里,用户浏览的商品也有可能带有cookie信息),因此我们要区分私有数据和公有数据
公有数据:放在公共区域,能被所有用户缓存命中的
缓存键:如果键带有私有数据,那只能被私有缓存
因此我们要在缓存中,区分有哪些是私有缓存哪些数据可以被公有缓存
缓存分类
代理缓存(递归式缓存)
![](https://img.haomeiwen.com/i18572346/7fc693e54ea16ba7.png)
当用户请求,缓存没有命中,缓存服务器会自动请求后端节点,拿到数据后。返回给客户端
http协议的所有连接都为代理缓存,squid,varnish
旁挂式缓存
![](https://img.haomeiwen.com/i18572346/fb10a59148e3c67e.png)
客户端请求缓存,当缓存不存在时,客户端就会请求服务器,拿到数据,自行决定是否缓存到缓存服务器 memcache
HTTP 缓存概念
HTTP1.1改善了过期缓存机制,和增加了条件缓存机制(当缓存过期了,问后端服务器,我这个缓存要不要更新)
过期缓存
HTTP1.0
Expires:过期时间 定义什么时候缓存失效,但如果浏览器和服务器的时区不一致会出现问题
HTTP1.1
cache-Control:maxage
缓存数据的最大存活时间
cache-Control:s-maxage
公共数据缓存的最大存活时间
条件式请求缓存
Last-Modified/If-Modified-since
基于文件修改时间戳来判断
Etag/If-None-Match
基于Etag标记,基于文件内容校验码进行对比
image.png
基于Etag判断
客户端拿到数据向后端请求,我缓存中的数据是否和后端服务器的数据内容一致,如果一致,后端服务器返回304,如果不一致返回200
基于时间戳判断
客户端缓存中的数据,和后端服务器的数据修改时间戳进行对比,是否比我更新,如果比我更新服务器返回200,如果一致返回304
过期缓存和条件式缓存一起工作
当客户端请求数据缓存到了本地,当过期的缓存时间过期了,缓存就会向服务器问,我这个缓存是否有变动,如果有变动服务器返回200,如果没有变动返回304,之后缓存继续过期缓存
HTTP 请求报文中缓存
Cache-Control:no-cache
不用缓存响应报文,强制刷新
HTTP 响应报文
Cache-Control:
public 公有缓存
private 私有缓存
no-cache:告诉缓存系统,内容可以缓存。但过期缓存没用,必须每次向服务端请求缓存的有效性(条件式缓存)
no-store: 不能缓存
must-relvalidate: 必须重新效验缓存,no-cache一样
proxy-revailddate:由代理服务器进行重新效验
max-age: 缓存数据的存活时间
s-maxage:公共数据的缓存存活时间
网友评论