缓存雪崩就是在某一个时刻,大量的缓存同时失效,造成数据库访问压力倍增。小明的爸爸最近压力比较大,因为收入减少了,他爸爸做的一个工程因为种种原因,货款只能分期付清,为了防止小明和妹妹同时申请生活费,造成资金周转困难;爸爸规定妹妹 1 号领取生活费,而小明在 5 号才能领取,小明心里的苦啊!
缓存穿透缓存穿透就是客户端总是尝试访问某个不存在的缓存,造成了每次都要取请求数据库读取数据。就好像小明吧,本来生活挺平静的,这刚上大二,就交了个女朋友,每个月的 1000 元生活费有点捉襟见肘,然后他又不能让爸爸知道,就在申请生活费的时候,每次都多要一点;这样就搞得爸爸很被动,本来计划得好好的,每个月都是 1000 块,这没次都不够,老是要跑银行取现金,终于在3个月后,爸爸发现了这个问题,想着儿子也大了,为了早日抱上孙子,就提高了小明的生活费,解决了每次都要跑银行的问题。
缓存击穿缓存击穿和缓存雪崩有点类似,其中不同的是;缓存雪崩是大量缓存 key 同时过期,而缓存击穿是大量的请求指向同一个缓存key,在这个 key 过期的时候,大量的请求涌入数据库中,造成了瞬间巨大的压力。举个栗子,因为小明交了女朋友的原因,他的生活费总是很快用完了;这种情况下,他也必须在 1 号的时候拿到生活费,不然就要吃土了,但是妈妈不允许他们一起取打扰爸爸,妈妈就指定了妹妹去问,在妹妹没有回来之前,小明只能等着,这就是为了解决缓存击穿而采用的策略:互斥锁(mutex key)
运维级别缓存除了在应用程序中可以接入缓存以外,部分运维工具也集成了缓存服务,比如 Nginx、IIS。
代理缓存Nginx 就是反向代理缓存,通过配置 Nginx 的缓存功能,在客户端请求到来到时候去加载缓存内容,用以提高响应能力,IIS 缓存又分为用户缓存和内核缓存。IIS 的输出缓存设置中,内核模式缓存不会对验证等用户信息进行检查,就好像小明等爸爸因为太赶时间,把钱放门卫大妈那里了,结果随便来了个学生就把小明等生活费给领走了,但是加上用户模式缓存后,就可以添加对身份的检查(请求标头),这样大妈就会知道谁是小明而不会随便把生活费交给别人了。
网页静态化这种技术,在 Web1.0 时代非常的流行,我还记得那些个年头的网站开发项目中的要求,大部分项目的需求分析文档里面就明晃晃的写着:网页静态化!,而静态化常见于各种企业型、论坛帖子,在发表这些信息后就将其生成静态网页,客户端访问的时候,直接重定向到该静态网页,基本无需访问数据库。
CDN 缓存CDN 缓存类似于上面提到的分布式缓存,但是实际上 CDN 缓存服务目前来说,主要说针对静态资源的,比如图片、视频、文件等等;大家经常可以看到,很多站点都号称提供了 CDN 加速服务,这些站点就像一个个代办信用卡的销售中介,实际上拿的都是银行的资源。
更形象一些的说法,就是大家的钱都是中国人民银行发行的,我们可以通过各个不同的银行(CDN节点)查询我们的银行卡余额(我怎么可能有余额),在以前没有手机银行的时候,大家就可以到附近的银行去查询,然后取款(CDN缓存),如果附近的银行的柜员机没有现金,那么可能就需要到总行去取了(回源),如果发生了太多回源的事件,就会造成 CDN 的拥堵,所以 CDN 服务商也不敢打包票自己的基础服务没有问题,反正我是没见到哪家 CDN 服务商敢注明服务稳定性 100%,基本上都是 99.99%
结束语缓存的理论知识,其实是非常宏大的,我这里只是抛砖引玉,希望能给入门的朋友带来一点帮助,如果你喜欢这篇文章,请给我点赞,让更多同学可以看到。