DNS 原理:http://www.ruanyifeng.com/blog/2016/06/dns.html
HTTP缓存:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Caching
1.缓存
缓存:为了节约对原始资源重复获取的开销,而将结果数据副本存放起来以供获取的方式。
2.缓存的本质
缓存针对的是资源、缓存数据必须是重复获取的、为了解决开销的问题【延迟和吞吐量】、缓存的存取其实不一定是更快的。
3.缓存是怎么应用的
1.对于地址栏中输入的域名,浏览器需要搞清楚它代表的IP地址,才能访问。具体过程如下:
- 它会先查询浏览器内部的“域名-ip”缓存,如果你曾经使用浏览器访问过这个域名,可能会留有映射缓存。
- 如果没有,会查询操作系统是否存在这个缓存,例如在Mac中,我们可以通过修改/etc/hosts文件来自定义这个域名到IP的映射缓存。
- 如果还没有,就会查询域名服务器(DNS,Domain Name System),得到对应的IP和可缓存时间。
2.当请求抵达服务端,在反向代理中也是可以进行缓存配置的,比如服务端包含SSI的方式来加载母页面上的一些静态内容。
反向代理:服务端的代理。服务器根据客户端的请求,从其关系的一组或多组后端服务器(如web服务器)上获取资源,然后再将这些资源返回给客户端,客户端只会得到反向代理的IP地址,而不知道在代理服务器后面的服务器集群的存在。比如CDN、NGINX、IIS等。
前向代理:客户端的代理 ,将从互联网上获取的资源返回给一个或多个的客户端,服务端(如web服务器)只知道代理的IP地址而不知道客户端的IP地址。
![](https://img.haomeiwen.com/i26045017/8a4debe6965a0a2f.png)
3.请求终于抵达服务端的代码逻辑,MVC各层都是可以应用缓存模式的。
- controller层,拦截过滤器,配置缓存对服务进行过滤。直接通过过滤器返回缓存结果,而不执行后面的逻辑。
- Model层,数据库ORM框架提供了缓存能力。比如对于贫血模式,DAO上方的service层基于其暴露的API应用缓存。
- View层,很多页面模板都支持缓存标签,页面中的部分内容,不需要每次都执行渲染操作,而可以直接从缓存中获取渲染后的数据并返回。
比如:Cache-Control: public, max-age=84600
即表示可以被任意节点缓存最多84600s。
4.缓存应用模式
1、Cache-Aside
最常见的一种缓存应用模式。
数据获取策略:
- 应用先去查看缓存是否有所需数据
- 如果有,应用直接将缓存数据返回给请求发
- 如果没有,应用执行原始逻辑,例如查询数据库得到结果数据
-
应用将结果数据写入缓存
image.png
数据更新策略:
- 应用先更新数据库
- 应用再令缓存失效
2、Read-Through
缓存系统彻底变成了它身后数据库的代理,应用的请求访问只能看到缓存的返回数据,而数据库系统对他是透明的。比如ORM框架,通过Read-Through和Write-Through实现。
数据获取策略:
- 应用向缓存要求数据
- 如果缓存中有数据,返回给应用,应用在将数据返回
- 如果没有,缓存查询数据库,并将结果写入自己
-
缓存将数据返回给应用
image.png
3、Write-Through
和Read-Through类似,图示同上,但Write-Through是用来处理数据更新的场景。缓存系统需要自己内部保证并发场景下,缓存更新的顺序要和数据库更新的顺序一致。
数据更新策略:
- 应用要求缓存更新数据
- 如果缓存中有对应数据,先更新该数据
- 缓存在更新数据库中的数据
- 缓存告知应用更新完成
4、Write-Back
对于Write-Back模式来说,更新操作发生的时候,数据写入缓存之后就立即返回了,而数据库的更新异步完成。
网友评论