反向代理缓存

一、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.现有服务器带宽有限;

  

原文地址:https://www.cnblogs.com/cqq-20151202/p/6371328.html