解决微服务缓存常见问题——缓存击穿

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 以简短语言说明缓存击穿概念及应对场景

“缓存”和“击穿”

什么是缓存?

缓存就是数据交换的缓冲区。
我们通常的理解缓存的主要作用是提高查询效率。其实它还有着另一个非常重要的作用,就是上面提到的“缓冲”也就是对下层资源的保护作用。

如何理解击穿

很简单,我们上面提到的缓存的另外一个主要作用是“缓冲”对下层资源的防护,那么“击穿“就是让你的缓冲失效,从而对被保护的资源进行”冲击“。
回到我们所开发的系统中,我们常常用缓存中间件如redis等,作为我们的缓存数据存储。当请求到达服务端时,我们优先查询缓存,缓存如果不存在,再查询数据库,如果查询到将数据写回缓存,使得下一次同样的请求能够命中缓存。如下图所示:
image.png
当大多数正常请求到达服务,大多会命中缓存数据库,也就是左半边红色部分(表示资源忙碌)。当一些攻击性请求,特意查询缓存中不存在的数据时,这时候按照我们上述处理逻辑,会直接透过缓存,到达数据库,进而对数据库进行流量冲击,体现为图中右半部分。

一种有效的解决缓存击穿利器——布隆过滤器

之上部分,我们提到了特意查询缓存数据库中不存在的数据会对数据库造成冲击,而数据库相对缓存,查询效率低很多,当大批量请求到达数据库,数据库因性能问题导致不再能及时响应请求,甚至出现宕机。那么我们如何进行防护?
我们换种思路出发,如果能够判断出,哪些请求一定是系统中不存在的数据时,是不是就可以将请求进行拦截,不让请求到达数据层?答案:YES
在这里,我们介绍一种有效的思路——布隆过滤器

布隆过滤器概念

什么是布隆过滤器?
本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),
特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”。

布隆过滤器数据结构

布隆过滤器是一个bit向量或者说bit数组,如下图:
image.png

布隆过滤器原理分析

如果我们要映射一个值到布隆过滤器中,我们需要使用多个不同的哈希函数生成多个哈希值,并对每个生成的哈希值指向bit位置1,例如针对值”baidu“和三个不同的哈希函数分别生成了哈希值1、4、7,如下图所示:image.png
OK,我们再存一个值”tencent“,如果哈希函数返回3、4、8的话,图则继续变为:
image.png

值得注意的是,4 这个 bit 位由于两个值的哈希函数都返回了这个 bit 位,因此它被覆盖了。现在我们如果想查询 “dianping” 这个值是否存在,哈希函数返回了 1、5、8三个值,结果我们发现 5 这个 bit 位上的值为 0,说明没有任何一个值映射到这个 bit 位上,因此我们可以很确定地说 “dianping” 这个值不存在。而当我们需要查询 “baidu” 这个值是否存在的话,那么哈希函数必然会返回 1、4、7,然后我们检查发现这三个 bit 位上的值均为 1,那么我们可以说 “baidu” 存在了么?答案是不可以,只能是 “baidu” 这个值可能存在。

云顶云(yundingyun.com)是国内首批专注于云计算与大数据服务的提供商,致力于“让云计算更简单”。做为阿里云五星授权服务中心,云顶云致力于为企业和政府提供方案咨询、架构设计、部署实施、系统定制、运维托管、技术培训等全方位“4S”级公有云、私有云定制化服务。

相关文章
|
1天前
|
缓存 数据库
15- 什么是缓存击穿 ? 怎么解决 ?
`# 缓存击穿简介及解决方案` 缓存击穿是指大量请求同时命中已过期的缓存,导致数据库压力骤增。解决方法包括:1) 预热热点数据;2) 设置热点数据永不过期;3) 使用加锁或限流策略。
49 4
|
1天前
|
存储 缓存 NoSQL
redis缓存雪崩、穿透、击穿
redis缓存雪崩、穿透、击穿
|
1天前
|
项目管理 微服务
云效常见问题之将多个微服务应用集成到一次研发流程中发布上线如何解决
云效(CloudEfficiency)是阿里云提供的一套软件研发效能平台,旨在通过工程效能、项目管理、质量保障等工具与服务,帮助企业提高软件研发的效率和质量。本合集是云效使用中可能遇到的一些常见问题及其答案的汇总。
33 0
|
2天前
|
存储 缓存 NoSQL
Redis 布隆过滤器实战「缓存击穿、雪崩效应」
Redis 布隆过滤器实战「缓存击穿、雪崩效应」
98 1
Redis 布隆过滤器实战「缓存击穿、雪崩效应」
|
1天前
|
存储 缓存 NoSQL
【后端面经】【缓存】35|缓存问题:怎么解决缓存穿透、击穿和雪崩问题?---解决缓存穿透
【5月更文挑战第14天】解决缓存穿透问题有两种策略。一是回写特殊值,当数据不存在时,在缓存中存储特殊值以标记,避免下次重复查询数据库。但此方法可能被恶意请求利用,浪费内存。二是使用布隆过滤器,预先判断数据是否存在,减少无效数据库查询。布隆过滤器虽有假阳性可能,但概率低,可接受。此外,可先查缓存再查布隆过滤器,优化正常请求的效率。两种方式各有优劣,实际应用需根据场景选择。
14 3
|
1天前
|
缓存 数据库 NoSQL
【后端面经】【缓存】35|缓存问题:怎么解决缓存穿透、击穿和雪崩问题?---缓存穿透、击穿和雪崩
【5月更文挑战第13天】本文讨论了三种常见的缓存问题:穿透、击穿和雪崩。缓存穿透发生时,请求的数据既不在缓存也不在数据库,可能导致数据库崩溃。缓存击穿指数据仅存在于数据库,热点数据的大量未命中请求会压垮数据库。缓存雪崩则是大量缓存在同一时间过期,引发数据库瞬间压力过大。为应对这些问题,需了解Redis部署(如Cluster或Sentinel)、故障恢复策略,以及公司如何保护数据库。解决缓存问题的经验和预防措施是面试中的重要话题。
9 0
【后端面经】【缓存】35|缓存问题:怎么解决缓存穿透、击穿和雪崩问题?---缓存穿透、击穿和雪崩
|
1天前
|
缓存 NoSQL 安全
Redis经典问题:缓存击穿
本文探讨了高并发系统中Redis缓存击穿的问题及其解决方案。缓存击穿指大量请求同一未缓存数据,导致数据库压力过大。为解决此问题,可以采取以下策略:1) 热点数据永不过期,启动时加载并定期异步刷新;2) 写操作加互斥锁,保证并发安全并设置查询失败返回默认值;3) 预期热点数据直接加缓存,系统启动时加载并设定合理过期时间;4) 手动操作热点数据上下线,通过界面控制缓存刷新。这些方法能有效增强系统稳定性和响应速度。
148 0
|
1天前
|
缓存 NoSQL 中间件
中间件缓存击穿和缓存雪崩
【5月更文挑战第5天】中间件缓存击穿和缓存雪崩
14 3
中间件缓存击穿和缓存雪崩
|
1天前
|
缓存 NoSQL 算法
Redis入门到通过之解决Redis缓存击穿、缓存穿透、缓存雪崩
Redis入门到通过之解决Redis缓存击穿、缓存穿透、缓存雪崩
20 0
|
1天前
|
缓存 NoSQL 算法
Redis 解决缓存雪崩 缓存穿透 缓存击穿(Redis使用必看)
Redis 解决缓存雪崩 缓存穿透 缓存击穿(Redis使用必看)
28 1