为什么有缓存这种机制:
程序具有局部性:
时间局部性:一个数据被访问过,之后也有可能被访问。
空间局部性:一个数据被访问过,离它较近的数据也有可能被访问。
缓存一般为key-value形式:
key:访问路径,URL
value:web content
一般对热点数据做缓存。
命中:在缓存中找到所请求的资源。
命中率:hit/(hit+miss)
文档命中率:按命中的文档个数来衡量
字节命中率:按内容大小来衡量
【注意】
缓存对象;缓存周期;定期清理
缓存空间耗尽:LRU(最近最少使用)
有的数据是不可缓存的,例如部分用户的私有数据
缓存的处理步骤:
接受请求---->解析请求(提取请求的url以及各种首部)---->查询缓存---->新鲜度检测----->创建响应报文---->发送响应报文----->记录日志
新鲜度检测机制:
过期日期:响应报文里告诉你缓存什么时候过期。
HTTP/1.0 Expires
例如:Expires:Thu, 04 Jun 2015 23:38:38 GMT
此时如果客户端节点的时间是 12:00:00则此缓存对于当前客户端来说是不新鲜的。
HTTP/1.1 Cache-Control : max-age,此网页内容可以存活多长时间。
例如:Cache-Control:max-age=600
有效性再验证:revalidate,向服务端发送条件式请求。
如果原始内容未改变,则仅响应首部(不带body部分),响应码未304 Not Modified
如果原始内容发生改变,则正常响应,响应码为200
如果原始内容消失,响应404,则此时缓存中的内容也需要删除。
条件式请求首部:
If-Modified-Since:基于请求的内容的时间做验证
If-Unmodfied-Since:
If-Match:基于内容做验证
Etag:基于校验码,如果资源内容发生改变,则校验码也会发生改变。
If-None-Match:
比较好的做法:将过期日期这种方法于条件式请求结合起来。
常见的缓存服务器开源解决方案:varnish,squid。
nginx与apache自身也具有缓存功能。
分布式缓存:CDN