整理自b站:【IT老齐004】为什么架构师对多级缓存架构情有独钟?

1、web应用的客户端缓存

        主要是对html中图片、css、js、字体等静态资源进行缓存。

        具体:通过在浏览器设置Expires响应头,在设置的时间段内把静态资源以文件形式把图片保存在本地,减少多次请求静态资源带来的带宽损耗。这在高并发的应用中是基础而重要的设置。

 

2、应用层的静态资源缓存

        上面提到的客户端缓存部分,浏览器只负责读取Expires。Expires需要在CDN(内容分发网络)和Nginx进行设置。对于广域的互联网应用,CDN几乎是基础设置。作为静态资源分发的主要技术手段,有效解决带宽集中占用以及数据分发问题。

        CDN的核心技术:
        将较远服务器的静态资源缓存到就近的服务器,让用户就近访问。

具体:浏览器会通过智能DNS服务提供商提供DNS服务将请求自动转发在就近的CDN服务器(上海CDN节点),上海CDN服务器收到请求后检查资源是否被缓存,若已缓存则返回资源否则回源北京提取到并缓存到上海CDN节点,再由上海CDN节点进行返回。

        因此如果全中国过各地都安排了这类CDN节点,就可以有效将北京CDN服务器的请求分摊到其他CDN节点上,从而降低北京机房带宽压力。在互联网应用中,因为CDN涉及多域多节点的组网,前期投入较高,中小公司可以选用阿里云腾讯云租用。

 

响应头Expires和Cache-control的区别:

* 均为通知浏览器进行文件缓存
* Expires指在这个时间点缓存就到期
* Cache-control指缓存时间有多长。
即:你明天还钱给我Expires,时间是一天Cache-control

        CDN适用于广域的,用户分布全国各地,对资源的响应速度及贷款具有较高要求,这种情况可以用CDN进行内容分发。如果是企业级应用,往往用户是分布在指定的办公区域或相对固定的场所,且并发用户量较少,并不需要额外部署CDN这类重量级的解决方案。在我们的架构中往往仅需部署一台nginx服务器,利用nginx自带的
静态资源缓存的能力以及压缩的功能就可以胜任绝大多数企业级应用场景。

Nginx缓存管理:

        Nginx对Tomcat集群做软负载均衡,提供高可用性。有静态资源缓存和压缩功能(在本地缓存文件),这样请求以后静态资源直接从nginx进行返回。

对nginx.conf中国设置如下,就可以设置静态资源缓存:

 nginx把静态资源是保存在本地,分目录的形式:

3、服务层的多级缓存

进程内缓存和进程外缓存
进程内缓存:即数据运行时载入程序开辟的缓存中JAVA框架的运用(hibernate,mybatis一二级缓存,springmvc页面缓存)
开源实现:ehcache,Caffeine

进程外缓存:即为分布式缓存(redis)
常见的加缓存是直接加redis是不严谨的。缓存设置需要按照:先近到远,先快后慢逐级访问。

场景:商品秒杀,若无本地缓存,都保存在redis
每完成一笔交易,局域网会进行若干网络通信,可能存在网络异常不稳定因素,且redis会承担所有节点的压力,当突发流量若超过容载上限redis会崩溃。因此java的应用端也需要设计多级缓存。一般会通过进程内缓存和进程外缓存(分布式缓存)组合分担压力。ehcache(进程内缓存)可以在缓存不存在时去redis进程外缓存进行读取,redis没有再去读取数据库,数据库再对ehcache,redis进行更新。下次再请求相同数据就直接从进程内的本地内存中提取,性能得到显著提升。

引入多级缓存会面临缓存一致性的问题,如何处理?

场景:修改商品价格为80,如何保证缓存也进行更新?

数据如何推送到其他缓存?

处理方法:引入消息队列(MQ)的主动推送功能,对服务实例推送变更实例
即:修改商品价格为80,向MQ发送变更消息,MQ将消息推送到服务实例服务实例将原缓存数据删除,再创建缓存。

 

什么情况适用多级缓存架构

1、缓存数据稳定。比如邮政编码,地域区号;
2、可能产生高并发场景,12306、股市开盘交易。可以在应用启动时进行预热处理,访问前将热点数据先缓存,减少后端压力;
3、一定程度上允许数据不一致。比如不重要的信息更新处理方式:T+1、ETL日中处理(T+1日间跑批,ETL日中跑批)。

技术
下载桌面版
GitHub
百度网盘(提取码:draw)
Gitee
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:766591547
关注微信