缓存击穿、穿透、雪崩及常用解决方案

这篇具有很好参考价值的文章主要介绍了缓存击穿、穿透、雪崩及常用解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

缓存击穿、穿透、雪崩及解决方案

Redis是一种高性能的键值型数据库,它可以用来实现缓存功能,提高应用的响应速度和承载能力。但是,使用Redis缓存也会遇到一些常见的问题,比如缓存击穿、缓存穿透、缓存雪崩。这些问题都会影响缓存的效率和稳定性,所以需要了解它们的原因和解决方案,保障Redis能够正常运行。

击穿、穿透、雪崩的意思

击穿、穿透、雪崩这三个词语很容易混淆,本文先对词语进行理解,再讲解技术

击穿:击穿拆开后,是击和穿。击意为敲打,或做类似敲打的动作穿意为穿透

击是什么?如下图,攻击的意思

缓存击穿、穿透、雪崩及常用解决方案

穿是什么?如下图,穿透,造成的效果就是个

缓存击穿、穿透、雪崩及常用解决方案

雪崩的意思很简单,就是一个字,如下图

缓存击穿、穿透、雪崩及常用解决方案

白话讲解一下,击穿就是先击后穿;穿透就是穿透,有个洞;雪崩就是多,很多很多

再从技术角度说明击穿、穿透、雪崩

缓存击穿、穿透、雪崩及常用解决方案

击穿意为先击后穿。热点数据存在,且能够击中。但是由于热点数据失效从而访问数据库

穿透意为直接穿。由于访问不存在的数据,从而直接访问数据库

雪崩意为多,大量。大量缓存同时失效,从而直接访问数据库

缓存击穿

缓存击穿的定义:某个热点数据在缓存中过期或失效时,大量的请求同时访问该数据,导致数据库压力过大甚至崩溃的现象。通常会发生在数据更新频率较高或者缓存设置了相同的过期时间的时候。

实际上可以这么理解:应该有的数据但是没读到,从而击穿了缓存,直接访问数据库

可采取的方案:

  • 不设置过期时间或设置较长的过期时间:这样可以避免热点数据同时失效,但是也会增加内存占用和数据不一致的风险
  • 定时更新。比如这个热点数据的过期时间是 2 小时,那么每到 1小时50 分钟时,通过定时任务去更新这个热点 key,并重新设置其过期时间
  • 互斥锁:当缓存中没有数据时,只允许一个线程去数据库查询并更新缓存,其他线程等待该线程完成后再从缓存中获取数据。这样可以减少对数据库的并发访问,但是也会降低系统的吞吐量和响应速度
  • 分布式锁:当多个Redis节点存在时,可以使用分布式锁来保证只有一个节点去数据库查询并更新缓存,其他节点等待该节点完成后再从缓存中获取数据。这样可以避免多个Redis节点同时访问数据库,但是也会增加系统的复杂度和延迟

缓存穿透

缓存穿透的定义:

用户查询一个不存在的数据,导致缓存中没有该数据,每次都要去数据库查询,而数据库中也没有该数据,造成无效的查询和资源浪费的现象。通常会发生在用户恶意攻击或者参数校验不严格的时候

实际上可以这么理解:不应该有的数据非要读,从而穿透了缓存,直接访问数据库

可采取的方案:

  • 业务层校验。用户发过来的请求,根据请求参数进行校验,对于明显错误的参数,直接拦截返回。比如请求参数为主键自增 id ,那么对于请求小于 0 的 id 参数, 明显不符合业务逻辑。
  • 缓存空值:当数据库中没有查询到数据时,仍然将空值或者默认值写入缓存,并设置一个较短的过期时间。这样可以减少对数据库的访问次数,但也会占用一定的内存
  • 使用布隆过滤器:布隆过滤器是一种概率型的数据结构,它可以判断一个元素是否可能存在于一个集合中。可以将所有可能存在的数据的键值哈希到一个足够大的位图中,当用户查询一个数据时,先用布隆过滤器判断该键值是否可能存在,如果不存在则直接返回,如果存在则再去缓存和数据库中查询。这样可以有效地拦截不存在的数据请求,但是也会有一定的误判率和内存开销

缓存雪崩

缓存雪崩的定义:在某个时间点,大量的缓存数据同时失效或者缓存服务器宕机,导致所有的请求都要去数据库查询,造成数据库压力过大甚至崩溃的现象。这种情况通常发生在缓存设置了相同或者相近的过期时间或者缓存服务器遭遇意外故障的场景下。

实际上可以这么理解:大量数据读取,从而使缓存雪崩,直接访问数据库

为了防止缓存雪崩,可以采用以下几种方法:

  • 设置不同的过期时间。可以给缓存设置不同或者随机的过期时间,避免大量的缓存同时失效,造成数据库压力突增
  • 缓存预热:对于即将来临的大量请求,可以将数据提前缓存在Redis中,并设置不同的过期时间
  • 使用多级缓存:可以构建多级缓存架构,比如Nginx缓存+Redis缓存+本地缓存等,当某一级缓存出现问题时,可以从其他级别的缓存中获取数据,增加系统的容错能力
  • 使用限流熔断:可以利用一些限流和熔断组件,对请求进行限流和降级处理,当请求超过系统能承受的阀值时,直接拒绝或者返回默认值,保护数据库不被打垮
  • 使用集群和负载均衡:可以将Redis部署成集群模式,并使用负载均衡组件,比如LVS、HAProxy等,对请求进行分发和转发,提高Redis的可用性和并发能力

总结

本文介绍了缓存击穿、缓存穿透和缓存雪崩三种问题及解决方案。通过本文,可以了解到:文章来源地址https://www.toymoban.com/news/detail-464315.html

  • 缓存击穿:先击后穿
  • 缓存击穿的解决方案有:设置热点数据永不过期、定时更新、分布式
  • 缓存穿透:将缓存穿了个洞
  • 缓存穿透的解决方案有:业务层校验、缓存空值、布隆过滤器
  • 缓存雪崩:大量失效Key
  • 缓存雪崩的解决方案有:设置不同的过期时间、缓存预热、多级缓存、限流熔断、集群和负载均衡

到了这里,关于缓存击穿、穿透、雪崩及常用解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • redis中缓存雪崩,缓存穿透,缓存击穿的原因以及解决方案

    在redis中,新,旧数据交替时候,旧数据进行了删除,新数据没有更新过来,造成在高并发环境下,大量请求查询redis没有数据,直接查询mysql,造成mysql的压力骤增,给mysql造成极大的压力,造成一连串的后续异常反应。 1.大多数系统设计者 考虑用加锁 (最多的解决方案)或

    2024年02月15日
    浏览(39)
  • redis实战-缓存三剑客穿透击穿雪崩解决方案

    缓存穿透 :缓存穿透是指客户端请求的 数据在缓存中和数据库中都不存在 ,这样缓存永远不会生效,这些请求都会打到数据库, 造成数据库压力 ,也让缓存没有发挥出应有的作用 缓存空对象 当我们客户端访问不存在的数据时,先请求redis,但是此时redis中没有数据,此时

    2024年02月11日
    浏览(34)
  • Redis中的缓存穿透、雪崩、击穿的原因以及解决方案

    是指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库再查询一遍,然后返回空(相当于进行了两次无用的查询)。这样请求就绕过缓存直接查数据库,这也是经常提的缓存命中率问题。 我们可以简单的

    2024年02月12日
    浏览(32)
  • 【Redis从入门到进阶】第 6 讲:缓存雪崩、击穿、穿透场景与解决方案

    本文已收录于专栏 🍅《Redis从入门到进阶》🍅    本专栏开启,目的在于帮助大家更好的掌握学习 Redis ,同时也是为了记录我自己学习 Redis 的过程,将会从基础的数据类型开始记录,直到一些更多的应用,如缓存击穿还有分布式锁以及 Redis 持久化等。希望大家有问题也可

    2023年04月12日
    浏览(26)
  • Redis缓存雪崩、穿透、击穿原因分析和解决方案,附Redis管道使用技巧

    先给大家附上其他几篇文章,感兴趣的自行开车导航 Redis过期策略和持久化机制全面揭秘,教你如何合理配置 【深入浅出Redis 一】从版本特性到数据类型到线程模型,带你了解Redis的核心特性和应用场景! 一次redis OOM问题分析解决,rdbtools安装分析redis内存 Redis管道(pipelin

    2024年02月16日
    浏览(33)
  • 探讨Redis缓存问题及解决方案:缓存穿透、缓存击穿、缓存雪崩与缓存预热(如何解决Redis缓存中的常见问题并提高应用性能)

    Redis是一种非常流行的开源缓存系统,用于缓存数据以提高应用程序性能。但是,如果我们不注意一些缓存问题,Redis也可能会导致一些性能问题。在本文中,我们将探讨Redis中的一些常见缓存问题,并提供解决方案。 缓存穿透指的是当一个请求尝试访问一个不存在于缓存中的

    2024年02月03日
    浏览(49)
  • redis的缓存穿透,缓存并发,缓存雪崩,缓存问题及解决方案

    缓存穿透 问题原因 解决方案 缓存并发 缓存雪崩 缓存失效时间设置一致导致的。 解决方案: 1)方案一 2)方案二 如何设计一个缓存策略,缓存热点数据?

    2024年02月21日
    浏览(29)
  • 缓存雪崩、缓存击穿、缓存穿透原因及解决办法

    缓存雪崩是指在缓存中的大量数据在同一个时刻全部过期,导致原本这些可以由缓存中间件处理的高并发请求,一下子全部打到数据库,导致数据库服务器崩溃的一种现象。那么出现缓存雪崩的原因可以有①:缓存中间件宕机。②:缓存中大部分key都设置了相同的时间,导致

    2024年02月08日
    浏览(37)
  • Redis 如何解决缓存雪崩、缓存击穿、缓存穿透难题

    Redis 作为一门热门的缓存技术,引入了缓存层,就会有缓存异常的三个问题,分别是缓存击穿、缓存穿透、缓存雪崩。我们用本篇文章来讲解下如何解决! 缓存击穿 : 指的是缓存中的某个热点数据过期了,但是此时大量的并发请求访问这个key的值,此时因为缓存过期无法从

    2024年02月14日
    浏览(32)
  • [Redis]缓存穿透、缓存击穿、缓存雪崩问题及解决方法

    缓存穿透就是指在高并发的情况下大量的请求去查询一个不存在于缓存中的数据,导致这些请求都直接访问数据库,给数据库造成压力。例如:我存储在缓存中的key是数字类型(123),但是网络攻击者频繁地用字符串(abc)去获取缓存。导致永远都无法命中缓存,请求最终都

    2024年02月15日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包