This commit is contained in:
by931
2022-09-06 22:30:37 +08:00
parent 66970f3e38
commit 3d6528675a
796 changed files with 3382 additions and 3382 deletions

View File

@@ -253,7 +253,7 @@ function hide_canvas() {
<p>设计缓存系统不得不考虑的问题是缓存穿透、缓存击穿与失效时的雪崩效应,同时,关于这几种问题场景的认识及解决方案,也是面试中的高频考点。今天的内容,可以说是缓存应用的三板斧,下面我们一起来分析一下缓存应用中的这几个热门问题。</p>
<h3>缓存穿透</h3>
<p>先来看一下缓存穿透,顾名思义,是指业务请求穿过了缓存层,落到持久化存储上。在大多数场景下,我们应用缓存是为了承载前端业务请求,缓存被击穿以后,如果请求量比较大,则会导致数据库出现风险。</p>
<p><img src="assets/Ciqc1F8ihZ-Aff7hAAAp1R6rHNs300.png" alt="2.png" /></p>
<p><img src="assets/Ciqc1F8ihZ-Aff7hAAAp1R6rHNs300.png" alt="png" /></p>
<p>以双十一为例,由于各类促销活动的叠加,整体网站的访问量、商品曝光量会是平时的千倍甚至万倍。巨大的流量暴涨,单靠数据库是不能承载的,如果缓存不能很好的工作,可能会影响数据库的稳定性,继而直接影响整体服务。</p>
<p>那么哪些场景下会发生<strong>缓存穿透</strong>呢?</p>
<ul>
@@ -268,7 +268,7 @@ function hide_canvas() {
<p>缓存穿透还可以通过缓存空数据的方式避免。缓存空数据非常好理解,就是针对数据库不存在的数据,在查询为空时,添加一个对应 null 的值到缓存中,这样在下次请求时,可以通过缓存的结果判断数据库中是否存在,避免反复的请求数据库。不过这种方式,需要考虑空数据的 Key 在新增后的处理,感兴趣的同学可以思考一下。</p>
<p>另外一个方案是使用布隆过滤器。布隆过滤器是应用非常广泛的一种数据结构,我们熟悉的 Bitmap可以看作是一种特殊的布隆过滤器布隆过滤器的实现细节不是本课时关注的重点如果你对布隆过滤器还不熟悉可以抽空查阅数据结构相关的资料学习。</p>
<p>使用布隆过滤器,可在缓存前添加一层过滤,布隆过滤器映射到缓存,在缓存中不存在的数据,会在布隆过滤器这一层拦截,从而保护缓存和数据库的安全。</p>
<p><img src="assets/CgqCHl8ihaqARq0qAAAyh2IYhog754.png" alt="3.png" /></p>
<p><img src="assets/CgqCHl8ihaqARq0qAAAyh2IYhog754.png" alt="png" /></p>
<h3>缓存击穿</h3>
<p>缓存击穿也是缓存应用常见的问题场景,其是一个非常形象的表达。具体表现:前端请求大量的访问某个热点 Key而这个热点 Key 在某个时刻恰好失效,导致请求全部落到数据库上。</p>
<p>不知道你有没有听过二八定律80/20 定律、帕累托法则),百度百科中对二八定律的具体描述是这样的:</p>
@@ -284,7 +284,7 @@ function hide_canvas() {
<p>在业务开发中,出现缓存雪崩非常危险,可能会直接导致大规模服务不可用,因为缓存失效时导致的雪崩,一方面是整体的数据存储链路,另一方面是服务调用链路,最终导致微服务整体的对外服务出现问题。</p>
<p>我们知道,微服务本身就存在雪崩效应,在电商场景中,如果商品服务不可用,最终可能会导致依赖的订单服务、购物车服务、用户浏览等级联出现故障。</p>
<p>你考虑一下,如果商品服务出现缓存雪崩,继而商品服务不可用,关联的周边服务都会受影响。</p>
<p><img src="assets/Ciqc1F8ihbyAf1UxAABgpe_3O54337.png" alt="4.png" /></p>
<p><img src="assets/Ciqc1F8ihbyAf1UxAABgpe_3O54337.png" alt="png" /></p>
<p>那么缓存雪崩在业务中如何避免呢?</p>
<p>首先是明确缓存集群的容量峰值,通过合理的限流和降级,防止大量请求直接拖垮缓存;其次是做好缓存集群的高可用,以 Redis 为例,可以通过部署 RedisCluster、Proxy 等不同的缓存集群,来实现缓存集群高可用。</p>
<h3>缓存稳定性</h3>