【每日一题】缓存穿透、缓存击穿、缓存雪崩及解决方案

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

当下ChatGPT很火,让人心痒痒想试一试好不好用,因此我就试着借它写一篇文章,但是试了几次最终还是没有生成想要的结果,基本上每次都是缓存击穿写了点之后也就没了,也不知道是网络问题还是怎么了。不过本文最终还是由ChatGPT主导生成的文章,我只是做个简单的修饰。

ChatGPT

好了,接下来言归正传。

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

缓存穿透

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

解决方案:

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

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

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

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

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

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

缓存击穿

缓存击穿(Cache Breakdown) 是指在一个热点数据的缓存过期时,大量的请求同时命中数据库,导致数据库压力过大。

解决方案

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

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

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

缓存雪崩

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

解决方案

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

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

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

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

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

总结

最后对缓存穿透、缓存击穿、缓存雪崩做一个总结:

缓存穿透缓存击穿缓存雪崩
原因大量的无效请求直接到达后端数据库一个热点数据的缓存过期时,大量的请求同时命中数据库大量缓存数据同时过期时。当大量请求同时命中数据库
解决方案设置布隆过滤器、设置空值缓存、黑名单机制加锁、缓存预热、热点数据不过期缓存失效随机化、动态调整缓存失效时间、缓存预热、设置缓存容错、缓存集群
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
对于 Redis 缓存穿透击穿雪崩,可以采取以下解决方案: 1. 缓存穿透:当请求的数据在缓存中不存在时,会直接访问数据库,如果有恶意攻击者大量请求不存在的数据,会给数据库造成很大压力。解决方案可以是在查询前进行参数校验,比如对请求的参数进行合法性检查,或者使用布隆过滤器等技术来快速判断请求的数据是否存在。 2. 缓存击穿:当某个热点数据过期或被删除时,大量请求同时涌入,导致请求直接访问数据库。为了解决这个问,可以使用互斥锁(Mutex)或者分布式锁来避免多个请求同时访问数据库。在获取锁之前,首先尝试从缓存获取数据,如果缓存中存在,则直接返回;如果不存在,则获取锁,并从数据库中获取数据并放入缓存,最后释放锁。 3. 缓存雪崩:当缓存中的大量数据同时过期时,会导致大量请求直接访问数据库,给数据库带来巨大压力。为了解决这个问,可以采取以下措施: - 设置合理的缓存过期时间,使得不同数据的过期时间错开,避免同时失效。 - 使用热点数据预加载,提前将热点数据加载到缓存中,避免同时失效。 - 使用多级缓存架构,将缓存分为多个层级,不同层级的缓存设置不同的过期时间,从而降低缓存失效的风险。 - 引入限流和熔断机制,对请求进行限制,避免大量请求同时访问数据库。 通过以上措施,可以有效地解决 Redis 缓存穿透击穿雪崩

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

索码理

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值