1 缓存概述
缓存思想是计算机系统设计中极为重要的解决手段,其本质原则是————局部性原理
在资源有限的情况下,将热点资源、最重要的资源部署到离请求方最近的地方去,以达到性能预期。
1.1 什么是缓存,为什么要用缓存?
缓存就是数据交换的缓冲区(称作Cache),是存贮数据(使用频繁的数据)的临时地方。
当用户查询数据,首先在缓存中寻找,如果找到了则直接执行。如果找不到,则去数据库中查找。
缓存的本质就是用空间换时间,牺牲数据的实时性,以服务器内存中的数据暂时代替从数据库读取最新的数据,减少数据库IO,减轻服务器压力,减少网络延迟,加快页面打开速度。
1.2 有哪些种类的缓存,并分别描述一下它们的应用场景?
文件缓存:文件缓存是把一些需要高速存取的变量缓存在内存中。模板引擎用的就是文件缓存机制,把动态代码编译成静态文件放入硬盘,不用每次访问都编译,直接读出即可。
浏览器缓存:浏览器缓存根据一套与服务器约定的规则进行工作,在同一个会话过程中会检查一次并确定缓存的副本足够新。如果在浏览过程中前进或后退时访问到同一个图片,这些图片可以从浏览器缓存中调出而即时显示。
数据库缓存:常用的缓存方案有memcached、redis等。把经常需要从数据库查询的数据、或经常更新的数据放入到缓存中,这样下次查询时,直接从缓存直接返回,减轻数据库压力,提升数据库性能。
Web应用层缓存:应用层缓存指的是从代码层面上,通过代码逻辑和缓存策略,实现对数据、页面、图片等资源的缓存,可以根据实际情况选择将数据存在文件系统或者内存中,减少数据库查询或者读写瓶颈,提高响应效率。
服务器缓存:包括代理服务器缓存和CDN缓存。
代理服务器缓存:代理服务器是浏览器和源服务器之间的中间服务器,浏览器先向这个中间服务器发起Web请求,经过处理后(比如权限验证,缓存匹配等),再将请求转发到源服务器。
代理服务器缓存的运作原理跟浏览器的运作原理差不多,只是规模更大。可以把它理解为一个共享缓存,不只为一个用户服务,一般为大量用户提供服务,因此在减少响应时间和带宽使用方面很有效,同一个副本会被重用多次。
CDN缓存:也叫网关缓存、反向代理缓存。CDN缓存一般是由网站管理员自己部署,为了让他们的网站更容易扩展并获得更好的性能。
浏览器先向CDN网关发起Web请求,网关服务器后面对应着一台或多台负载均衡源服务器,会根据它们的负载请求,动态将请求转发到合适的源服务器上。
虽然这种架构负载均衡源服务器之间的缓存没法共享,但却拥有更好的处扩展性。从浏览器角度来看,整个CDN就是一个源服务器。
2 经典缓存解决方案
2.1 CDN缓存/CDN加速
2.1.1 CDN的定义与原理
CDN通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。
CDN最大的特色在于加速。
那么,CDN是如何实现各种“加速”,发挥“加速”功用呢?
如下图所示,CDN有很多节点,通过域名实现就近接入。
当用户发起一个请求后,CDN会回源取,然后把文件就近缓存在那个节点的服务器上。
假设北京的用户到北京节点只需4毫秒,后面写了一个90%的请求其实都直接命中到了服务器,那么还有10%的流量回到了二级cache节点。
而二级cache节点也是同样的缓存服务器,假设它的命中率也是90%,那么最终只有1%的流量到源站。
如果纯粹回到源站可能需88毫秒,而通过访问CDN就会大大缩短时间,甚至4毫秒就可以让用户拿到一个文件。
这是CDN实现加速的基本原理。
2.1.2 CDN一般放些什么东西?
一般放静态资源,如视频、音频等不会轻易改动的资源。
这是网站优化的一种手段,网站优化,缓存为王。
CDN支持许多种服务,最常用的服务有:
-
下载:通常是一些终端用户,如网游用户、软件用户、程序开发员及要下载大量文件的用户会使用到。通过使用CDN,人们便无需使用高带宽连接到昂贵的数据中心,并且通过CDN节点,这些文件会放到离终端用户更近的地方。
-
静态文件/图片:CDN最常用的用途是用来给终端用户发布静态文件,如图片、java脚本、css文件等。通常这些类型的文件很少变更,即便有变更,也是少量的,所以,把文件发布并存放到离终端用户比较近的地方会极大地提高网站速度,在地理位置分散或连接性能很差的地方,网站速度提高会显得更加明显。
注意:该服务仅仅用于处理静态文件,如主要的网站页面,所有动态内容,都是由主网站服务器提供。这通常是分开处理的,通过不同的子域名进行处理,如images.mydomain.com,与www是分开的。
- WSA:即整体网站加速。用来加速整个网站,包括所有的静态的东西及动态的东西,如网页、购物车及推荐信息等。终端用户只连接到CDN,CDN连接到网站,然后缓存所有的东西,CDN代表用户向实体的网站后台发送请求,获取动态数据。CDN只能改善一部分内容的访问速度,因为其它的内容,如采购历史、产品库存等必须直接从后台网站获得。对于连接性很差的网络,如移动网络以及复杂的、难以将静态内容从静态CDN分离出来的网站来说,WSA尤为好用。
注意:为确保WSA成功,谨慎的配置及缓存控制头信息是非常重要的,因为CDN需要知道要缓存哪些东西,以及哪些东西是要传递到后台的。
-
流媒体内容:媒体类网站使用越来越多的流媒体内容,如视频,包括来自于其它网站(如Youtube、Youku等)的实际的电视节目、影片等。CDN为这些内容提供特别的下载服务,通常称之为点播或Vod,可以处理并控制所有视频,包括快进/后退视频,可以访问经过授权的内容,提供各种跟踪服务等。对于这些服务而言,视频通常是加载到CDN,并且通过特定的URL直接提供视频。此外,一些CDN还提供现场流体内容,如,体育或其它事件等实时播放,进行现场内容直播。
-
安全服务:例如,许多CDN可提供防DDoS攻击服务,由于它们比任何一个网站的带宽都大,而且分散,所以能够经受住此类攻击。此外,一些专门的CDN,如CloudFlare 及 AnQuanBao 也提供像防火墙一样的应用程序,如防止SQL注入攻击、XSS攻击及其它防攻击手段以保护后台站点。
-
“内容感知”网络服务:这是一种新型服务,是通过CDN系统的更智能化管理的内容,可以给不同用户,如移动或DSL或办公室用户等提供不同的优化过的内容。它可以对内容进行处理,以便提供给不同设备,也可以对内容进行优化,以便将最重要的内容优先下载下来,使用户获得最佳体验。它们还会判断在哪个地方存放哪些内容,总之,该系统能够使网站在复杂的互联网环境下有良好的性能表现。
-
全球服务:有些CDN还提供全球服务,帮助客户开拓新区域或国际区域,如中国、拉美或国外其它地区。对于全球品牌而言,这种服务非常重要,对于想要获得国际客户的中国公司而言,这种服务也非常重要。这种全球或局部CDN帮助人们在无需数据中心及特别带宽等情形下,便可获得庞大的用户群。
-
其它:CDN有许多其它功能及服务,以满足特殊需求,如电商、预加载、网游、动态加速、安全及DRM控制等。此外,还提供特殊的满足地理要求或网络要求(如中国移动或CERNET)的特别服务。
2.2 Redis 缓存 & 共享缓存
- redis的缓存:针对任意服务器系统,均可进行缓存
- redis的共享缓存:主要针对分布式系统而言,与本地缓存(如:Google Guava Cache)相对,重在共享
2.2.1 缓存雪崩:若redis挂了,又未存到MySQL,如何解决?
1、问题描述
-
如果瞬间有大量用户请求数据库,可能会导致查询数据库非常缓慢,甚至会造成数据库挂了的严重后果; 而在redis启动起来后,数据没有提前加载到redis里面,所有用户都是访问mysql。
-
缓存雪崩可能是因为数据未加载到缓存中,或缓存同一时间大面积的失效(宕机、cache服务挂了或者不响应了),从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机。
2、解决思路:缓存预热。
怎么预热呢?
1)规划缓存。 就是哪些东西需要放在缓存中。这个在开发初期就应该想明白。用计数器的方式是一种方式。如果频繁访问,db能抗住,那么cache仅仅是为了提升性能。
2)数据监控分析哪些请求比较频繁,着重优化。
3)缓存预热功能。在高并发访问时候,加入1万请求,同时压到db可能崩溃,那么在应用启动前对缓存预加载内容也是一种措施。
4)其实访问不频繁的数据也需要cache的,但可以把变化不大的数据的cache超时时间设长点。
2.X 其他经典问题
2.X.1 什么叫做缓存预加载?具体该怎么做?
- 定义
所谓的“预加载”技术,就是在打开网站应用之前,就已经通过某些技术把图片、js、css等耗资源的文件加载到客户端生成缓存,等真正打开网站应用时就不需要再次加载这些文件,从而达到提高网站应用性能和加载速度的目的。
比如:我们一打开视频网站,广告就已经加载好了,而视频加载却很慢,这是因为这些网站做了“预加载”,在用户打开网站时就先把广告内容加载到客户端做了缓存,所以打开广告比打开视频快。
缓存预加载就是把热点数据提前加载到redis里面去。当用户访问了某个资源,需要加载数据,这个时候要尽可能把用户历史访问的数据加载到redis中。
用户的历史访问记录存在日志里。用户的每一次请求,都会记录成日志。只要控制好访问频率,把用户近几天的访问的日志再访问一遍,就可以很快地把历史数据加载到redis中,从而还原用户之前的请求数据。