一、Buffer和Cache
网上找不到标准答案;
不同点:
Buffer:一般用于写操作,写缓冲;因为硬盘对于CPU而言是非常慢的,CPU将数据写入磁盘缓冲区之后,就认为写完了,之后由别的进程将数据写入硬盘;
Cache:一般用于读操作,读缓存;--->提高数据的读取效率;
CPU, CPU L1 L2 L3
相同点:
都是设计到IO操作的,都是解决速度不一致的问题;
DMA:直接内存访问;以前比如WIM98的时候,如果直接拷贝的话,其他的事情都没有办法干了;
DMA是的输入输出是并行操作;
NUMA:非统一内存访问;
为什么服务器的内存不能乱插?一块内存对应一个CPU,在极特殊的情况下,CPU才会访问其他的内存;
Cache的重点:
1.存放位置(多级Cache):
客户端(浏览器缓存)
内存(本机内存、远程服务器内存)
硬盘(本地硬盘(SSD、SAS、SATA、IDE),远程服务器硬盘);
2、过期时间
TTL
3、强制(失效)过期
4.Cache的命中率
云备份是不需要缓存的;
面试不能较真;
二、浏览器DNS
比如访问:http://alidns.com
访问过程: 过去html源代码-->自上而下其中需要的所有元素--->浏览器本地计算和渲染;
注意:浏览器是边解析,边下载;(异步的,不会影响HTML加载,除非遇到JS,遇到JS会挂起加载的线程,等待JS执行完毕,继续往下执行);
浏览器的DNS缓存: DNS解析的速度20ms~120ms;
使用谷歌浏览器查看DNS缓存:chrome://net-internals/#dns
将所有的域名加载到同一个页面可以提高访问速度,但是产生的问题是,需要请求的域名非常多,解决办法是:
a、DNS预获取;
b、url预加载;
三、浏览器缓存
缓存协商:浏览器和web服务器进行缓存的一个对话;
浏览器缓存的方法:
方法1:使用Last_Motified(最后修改时间)
在linux服务器(web服务器)上通过调用stat,获取网页的最后修改时间,然后将其附带到页面的头部;
打开crome浏览器-->网络--->全部--->查看响应(头信息)-->Last_Motified(GMT时间);
查看所有浏览器缓存:about:cache,可以看到有些缓存是保存在硬盘中的,有些事保存在内存中的;
打开crome调试:请求完毕之后,再次F5刷新,显示304 (not motified),没有修改;
对比第一次请求,多了IF-Motified-Since:是否在这个时间点修改了,如果没有修改,直接使用本地缓存,给用户呈现;
这种方法的缺陷:如果只是修改时间变了,但是内容没有变化,依然会产生网络传输;
方法2:Etag:打标签
比如使用MD5,每次请求MD5值,如果值没有改变,返回304;
但是http没有规定MD5如何实现,可以自己实现;
但是,上述方法只能使得每次请求不传输,但是并不会减少请求次数;
方法3:过期时间(expires)
转到或者Enter:所有没有过期的直接使用缓存。所有缓存机制均生效;
F5或者刷新按钮: 过期时间要不受影响(不过问),其他的缓存协商都受影响;
ctrl+F5:强制刷新,表示所有的缓存协商的办法失效,从新协商请求;
http1.1:头部增加参数 max-age=...,表示相对本地时间,优先级最高,为了防止本地时间和服务器时间不一致导致的问题;
四、CDN
首先看一个例子:js过期时间 设置为1个小时,js刚上线,但是突然发现有一个bug,导致无法下单,如何解决?
a、ctrl+F5 #强制刷新
b、改名
c、加上参数(加时间戳) 123.js?201601
为什么使用CDN?
1.不同运营商之间互联的问题; BGP(贵)
2.用户到服务器之间网络传输长,节点多,延迟大;
3.现有服务器带宽有限;