一、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.现有服务器带宽有限;
来源: http://www.bubuko.com/infodetail-1964172.html