【后端面经】【缓存】35|缓存问题:怎么解决缓存穿透、击穿和雪崩问题?---解决缓存穿透

简介: 【5月更文挑战第14天】解决缓存穿透问题有两种策略。一是回写特殊值,当数据不存在时,在缓存中存储特殊值以标记,避免下次重复查询数据库。但此方法可能被恶意请求利用,浪费内存。二是使用布隆过滤器,预先判断数据是否存在,减少无效数据库查询。布隆过滤器虽有假阳性可能,但概率低,可接受。此外,可先查缓存再查布隆过滤器,优化正常请求的效率。两种方式各有优劣,实际应用需根据场景选择。

解决缓存穿透

缓存穿透是因为数据本身不存在而引起的,所以我们就要想办法在确认数据不存在之后,避免下一次查询再次落到数据库上。这里有两种解决思路。

回写特殊值

第一种思路是在缓存未命中,而且数据库也没有的情况下,往缓存里写入一个特殊的值。这个值就是标记数据不存在。那么下一次查询请求过来的时候,看到这个特殊值,就知道没有必要再去数据库查询了。
2024-05-15-21-43-26-image.png

你可以直接介绍这个方案

第一种思路是回写特殊值,也就是在第一次查询发现数据里都没有数据的时候,直接写入一个特殊值。那么下一次查询过来的时候,看到缓存里的特殊值,就知道没有数据,这时候直接返回就可以了。在这种设计下,数据库只需要支撑住第一次请求就可以。

但是这个方案也是有缺点的。

如果攻击者每次都用不同且不存在的key来请求数据,那么这种措施毫无效果。并且,因为要回写特殊值,那么这些不存在的key都会有特殊值,浪费了Redis的内存。这可能会进一步引起另外一个问题,就是Redis在内存不足,执行淘汰的时候,把其他有用的数据淘汰掉。

这个时候可以引出下一个点了,考虑使用布隆过滤器。

布隆过滤器

既然缓存穿透是因为数据不存在,那么提前用布隆过滤器判断一下不就可以了吗。

正常请求一个key的流程如下:
2024-05-15-21-49-38-image.png

如果请求一个 key 不存在,那么布隆过滤器会直接说数据不存在,那么就没必要继续往下查询了。
2024-05-15-21-49-48-image.png

首先简单介绍这个流程

使用布隆过滤器的流程是业务代码收到请求之后,要先问一下布隆过滤器有没有这个key。如果说没有,就不用继续往后执行了。如果布隆过滤器说有,那么就继续往后执行,去查询缓存和数据库,并且查询到了数据的时候,回写到缓存里面。

然后你要记得介绍假阳性的问题。

但是布隆过滤器本身存在假阳性的问题,所以当攻击者请求一个不存在的key的时候,布隆过滤器可能会返回数据存在的假阳性响应。在这种情况下,业务代码依旧会去查询缓存和数据库。不过因为假阳性的概率很低,如果说概率是万分之一,就算攻击的并发有百万,也只有100个查询请求会落到数据库上。

这个时候可以补充一个变种

也可以考虑先查询缓存,当缓存中没有数据的时候,再去查询布隆过滤器。如果布隆过滤器说有数据,再去查询数据库。
2024-05-15-21-59-29-image.png

然后你对比两者。

这两种模式没有太大的差别。先查询布隆过滤器,保护效果会更好,也就是提前挡住了非法请求。而先查询缓存,对正常请求更加友好,因为正常请求大概率命中缓存,直接返回数据,也就不用查询布隆过滤器了。

不过如果布隆过滤器也是在 Redis 的基础上实现的,两者就基本上没什么区别了。

目录
相关文章
|
29天前
|
缓存 NoSQL Java
避免缓存失效的三大杀手:缓存击穿、穿透与雪崩的解决方案
避免缓存失效的三大杀手:缓存击穿、穿透与雪崩的解决方案
31 0
|
11天前
|
canal 缓存 NoSQL
Redis常见面试题(一):Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;先删除缓存还是先修改数据库,双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
Redis常见面试题(一):Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
|
12天前
|
缓存 算法 API
深入理解后端开发中的缓存策略
【7月更文挑战第15天】缓存是提高后端系统性能和扩展性的关键机制之一。本文将深入探讨后端开发中缓存的应用,包括缓存的基本原理、类型、以及在实际应用中的策略。我们将从缓存的定义开始,逐步介绍缓存在数据库查询、API响应和分布式系统中的优化作用。通过实例分析常见的缓存模式,如LRU、LFU和FIFO,并讨论它们在不同场景下的适用性。最后,文章还将涵盖缓存一致性问题和解决方案,帮助读者构建高效且可靠的后端系统。
|
19天前
|
缓存 NoSQL Redis
使用Redis实现缓存穿透的解决方案
使用Redis实现缓存穿透的解决方案
|
6天前
|
缓存 数据库
什么是缓存击穿
什么是缓存击穿
|
7天前
|
存储 缓存 NoSQL
深入理解分布式缓存在后端系统中的应用与实践
【7月更文挑战第20天】 本文将探讨分布式缓存技术在后端系统设计中的关键角色,并揭示其如何优化性能和扩展性。文章不仅剖析了分布式缓存的基本原理和工作机制,而且提供了实际案例分析,展示了其在处理大规模数据时的优势。我们将深入了解几种流行的分布式缓存解决方案,并讨论它们在不同场景下的适用性。最后,文章将指导读者如何在真实世界的应用中实施分布式缓存,包括架构设计、性能调优以及故障排除的最佳实践。
|
7天前
|
存储 缓存 NoSQL
深入理解分布式缓存在现代后端系统中的应用与挑战
随着互联网技术的飞速发展,分布式缓存已成为提升后端系统性能的关键技术之一。本文将从数据导向和科学严谨的角度出发,探讨分布式缓存技术的原理、应用场景以及面临的主要挑战。通过对具体案例的分析和数据统计,我们旨在为读者提供一个全面而深入的理解框架,帮助开发者更好地设计和优化后端系统。 【7月更文挑战第20天】
12 0
|
19天前
|
缓存 NoSQL Redis
使用Redis实现缓存穿透的解决方案
使用Redis实现缓存穿透的解决方案
|
29天前
|
缓存 NoSQL Java
Redis系列学习文章分享---第四篇(Redis快速入门之Java客户端--商户查询缓存+更新+双写一致+穿透+雪崩+击穿+工具封装)
Redis系列学习文章分享---第四篇(Redis快速入门之Java客户端--商户查询缓存+更新+双写一致+穿透+雪崩+击穿+工具封装)
30 0
|
3天前
|
缓存 安全 API
后端开发中的API设计原则与实践
在数字化时代的浪潮中,后端开发作为技术架构的核心,承载着数据交互与业务逻辑的重要职责。本文深入探讨了API设计的艺术与科学,从RESTful原则到安全性考量,再到性能优化的实践策略,旨在为后端开发者提供一套全面的API设计指南。通过具体案例分析,文章揭示了良好API设计对于提升系统可维护性、扩展性和用户体验的重要性,同时指出了常见设计陷阱与应对策略,为后端开发领域的专业人士提供了宝贵的参考和启示。
18 0