我特意查询了一下百度,首页上的有关缓存架构的博客,一半都只是在围绕着缓存中间件阐述缓存架构,剩下的一般也往往在大分类上有所遗漏(如浏览器缓存,数据库缓存)。当然也有一些博客在专门的领域阐述得较为深入,或者层次的划分比较不错。故本博客只是在阐述现阶段我对缓存架构的认识(也借鉴了一些书籍,课程的缓存体系)。
浏览器缓存浏览器缓存,也是很多时候被后端所遗忘的部分。因为这已经不属于后端的工作了,但这一定属于架构师或者相关技术负责的职责。当然还有一个原因是我做过专门的前端开发。
说白了,就是在浏览器保存一部分数据,当然这需要前端进行开发。
这里直接上图,大家可以看一下Cookie,LocalStorage,SessionStorage:
PS:图片来自网络
优势由于是浏览器缓存,位于整个web请求相应框架的client端,所以对业务提供方没有任何负载压力与影响。只是客户端的浏览器存在些许的存储占据与计算负载。
注意Cookie等的存储容量是有限的,需要注意分配。
Cookie等的存储是明文的,不可以存储敏感数据,否则会存在安全隐患。
Cookie等需要注意存储时间时间的有效设置。
Cookie等存在一定的学习成本,与相关特性(如Cookie的域名设置问题,父域名无法读子域名的Cookie数据)。
Cookie等需要明确业务中有哪些数据适合放在这里,如域名等。
实际应用在我之前负责的IOT项目中,页面往往存在大量的数据,如终端列表,传感器列表,监测点列表等。并且数据间存在一定数据关系,如需要通过现存的终端列表来获取对应传感器列表,又如通过传感器列表来获取对应报警列表等。
为了避免页面切换时,为了获取一个列表而需要多次请求(如为了获得已选定的终端列表的传感器列表,需要先请求终端列表),所以通过LocalStorage来存储终端列表。
CDN缓存CDN,Content Delivery Network,即内容分发网络。
CDN是构建网络上的内容分发网络
CDN可以使得用户就近获取所需内容,避免网络拥塞,提高用户访问速度
CDN依靠部署在各地的服务器,通过镜像服务器实现内容同步,其包括负载均衡,内容分发,调度等模块。
优势降低访问延迟。使得用户就近获取所需内容,避免过多路由造成用户访问延迟问题。
降低服务器压力。毕竟放在CDN服务器的内容,就不用到应用服务器获取了。
消除运营商差别。消除运营商之家互联的瓶颈造成的影响,使得所有用户获得同样的访问质量
集群抗攻击。广泛分布的CDN节点,可有有效避免DDOS等攻击。
缺点同步缓慢。由于CDN是大量且分层的节点分布,所以数据的下发与同步会比较缓慢。
如果是使用收费服务,则需要一定支出。如果是自建CDN,则需要技术付出。个人推荐,不必要的话,还是直接采用CDN收费服务吧,性价比更高一些。
自身Web体系需要进行相应的调整。如CDN文件更新与服务器文件更新(版本号等手段)等问题。
关键技术该部分内容,引自网易云课堂。
缓存
缓存代理软件:Squid
缓存算法决定命中率,源服务器压力,FTP节点存储能力
分发能力
分发能力取决于IDC(网络数据中西)能力和IDC策略性分布
负载均衡
负载均衡软件:Nginx
负载均衡(智能调度)决定最佳路由,响应时间,可用性,服务质量
基于DNS
DNS服务器软件:BIND
基于DNS的负载均衡以CNAME实现域名中专,智取最优节点服务
缓存点有客户端浏览器缓存,本地DNS服务器缓存
缓存内哦让那个有DNS地址缓存,客户请求内容缓存,动态内容缓存
支持协议
静动态加速(图片加速,https带证书加速)
下载加速
流媒体加速
企业应用加速
手机应用加速
就当扩展一下见识吧(囧)
实际应用如果写过前端代码,会知道有的时候,我们采用的jQuery等通用JS,CSS等大多是使用公共的cdn地址。
有的公司,会将公司的一些公共JS,图片等静态资源(尤其是公司Logo等),放在CDN上。进行网页开发时,直接引用对应的CDN地址。
负载层缓存负载层缓存一般是与负载均衡器相关的缓存,这里我就拿Nginx举例。
Nginx可以通过以下三种手段,实现缓存:
本身的缓存模块
转发请求至对应缓存服务器
可以通过lua模块,直接从外部缓存(如Redis等)获取缓存数据
接下来一一阐述
Nginx缓存模块Nginx的http_proxy模块,可以实现类似于Squid的缓存功能.
Nginx对客户端已经访问的内容在Nginx服务器本地建立缓存副本,那么在一定时间内再次访问这些内容时,就不需要请求后面的应用服务器了。