(每日一问)缓存穿透、缓存击穿、缓存雪崩及解决方案

缓存是许多现代Web应用程序的重要组成部分,因为它可以大大提高系统的性能和可靠性。然而,缓存也存在一些潜在的问题,如缓存穿透、缓存击穿和缓存雪崩,这些问题可能导致系统性能下降甚至宕机。因此,对这些问题的理解和解决方案非常重要。面试也会经常问到缓存相关知识,缓存穿透、缓存击穿、缓存雪崩基本也是必问的问题之一。

缓存穿透

缓存穿透(Cache Penetration) 是指大量的无效请求直接到达后端数据库,因为缓存中不存在该数据的缓存。这种情况下,大量的请求将直接影响到数据库的性能,并可能导致数据库崩溃。

解决方案:

设置布隆过滤器(Bloom Filter) :使用布隆过滤器可以快速识别无效数据,从而避免直接请求数据库。

简单介绍一下布隆过滤器:

布隆过滤器(Bloom Filter) 是一种基于哈希的快速、高效的数据结构,可以用于判断一个元素是否可能属于某个集合,它可以在极小的空间开销下,实现近似快速查询,但存在一定的误判率。

布隆过滤器的核心思想是:如果一个元素不在集合中,那么它对应的每一个位都不会被置为1,因此查询时只需要检查这些位是否都为1即可确定该元素不在集合中。而如果一个元素在集合中,那么它对应的位可能被其他元素所置为1,因此查询时只能判断该元素可能在集合中,但不能确定其一定在集合中。

设置空值缓存:当请求的数据不存在时,可以将一个空值缓存到缓存中,避免重复请求数据库。

黑名单机制:对于请求失败次数进行记录,超过一定次数后,将该数据加入黑名单,以后不再请求该数据。

缓存击穿

缓存击穿是特殊的缓存穿透,是热点Key在同一时间同时失效,从而请求直接打到数据库,导致数据库压力过大

解决方案

  1. 加锁:在缓存数据过期时可以使用锁机制,避免多个请求同时命中数据库。

  1. 缓存预热:在缓存数据过期前,可以使用缓存预热的方法将数据提前加载到缓存中,从而避免缓存数据过期时大量请求数据库。

  1. 热点数据不过期:热点数据过期时间设置为不过期,后台定时去异步刷新缓存。

缓存雪崩

缓存雪崩(Cache Avalanche) 是一种常见的缓存问题,发生在大量缓存数据同时过期时。当大量请求同时命中数据库,数据库压力过大,导致数据库宕机或性能严重下降。

解决方案:

缓存失效随机化:通过随机化缓存数据的失效时间,可以避免所有数据同时过期,从而避免缓存雪崩的问题。

动态调整缓存失效时间:通过动态调整缓存数据的失效时间,可以根据实际情况调整缓存数据的失效时间,从而避免缓存雪崩的问题。

缓存预热:在缓存数据过期前,可以使用缓存预热的方法将数据提前加载到缓存中,从而避免缓存数据过期时大量请求数据库。

设置缓存容错:在缓存系统中设置容错机制,在缓存数据过期时可以使用备用数据源,从而避免数据库宕机。

缓存集群:使用缓存集群可以将缓存负载分散到多台机器上,从而避免缓存雪崩的问题

最后总结

缓存穿透

缓存击穿

缓存雪崩

原因

大量无效数据同一时间访问到数据库

热点Key同一时间失效

大量缓存同一时间失效

解决方案

布隆过滤器,缓存空值,黑名单机制

热点key不过期,加锁,缓存预热

缓存失效随机化、动态调整缓存失效时间、缓存预热、设置缓存容错、缓存集群

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值