Redis:缓存击穿、缓存穿透与缓存雪崩的区别、解决方案

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

0、前言

        近期学习redis相关原理,记录一下开发过程中Redis的一些常见问题及应对方法。

1、缓存穿透

一句话总结:先查redis发现没数据,再去数据库查发现还是没数据

这种情况下缓存永远不会生效,数据库将承担巨大压力。

        我们知道,redis的缓存作用,是在客户端发起查询请求时:
        (1)先找redis,如果redis内命中数据则直接返回。
        (2)如果未命中,则不得不去数据库中查询,把数据放到redis里,然后再返回数据给客户端。
        对于缓存穿透的情况,例如多次恶意查询数据库和redis里都没有的数据,将给数据库带来巨大压力。

常见解决方法:

Redis:缓存击穿、缓存穿透与缓存雪崩的区别、解决方案

         缓存空对象,就是发现数据库也没有这个数据的时候,缓存一个空值在redis里,那么下次这种访问就会从redis里返回null,而不会继续查询数据库了。

2. 缓存雪崩

一句话:大量的缓存key同时失效(比如同时过期了),或者redis服务宕机(redis寄了),导致大量请求直接给到数据库,压力过大寄了。

        缓存雪崩,指的是大面积的 key 同时过期,导致大量并发打到我们的数据库。不像击穿,只是因为 1 个 key 的过期。所以,对于雪崩来说,一般少量的 key 失效,所带来的数据库的并发压力是不会太大的。而大量 key 的同时失效,导致所有 key 的并发加起来,会影响到我们的数据库。

        那就算一个 key 失效,也会对数据库造成很大的影响,那么你把雪崩的所有 key 拆成一个一个 key 来看,也就是雪崩可以拆分成一个一个缓存击穿的集合。

        其实在真实场景中,雪崩才是一个更容易发生的一个问题,它不像击穿那么极端,一个 key 就成千上万的并发,直接把数据库打垮了;而是,可能就一个 key 几十几百的并发,然后大量的 key 一过期,然后就使得好多并发,同时叠加起来,累积到上千上万个,把数据库打崩了。

解决方案

        怕key同时失效,那就把缓存的TTL时间分散开, 比如在失效时间的基础上加上一个随机值。

        针对redis宕机情况,可以进行Redis集群的布置,或者添加多级缓存,增强系统的容错性。

3、缓存击穿

        概括:要查的key对应的数据是存在的(不像穿透,是不存在的数据),但redis里没有(比如过期了,这很常见),如果这个key的数据是热点数据,即可能会有大量并发请求

        这么多的并发请求都发现redis没有对应的数据,则都要去查数据库,这样一来将造成巨大压力。

         例如下图中,在线程1把数据写入缓存之前,其他多个并发线程都会去查数据库,这样将造成巨大的压力。Redis:缓存击穿、缓存穿透与缓存雪崩的区别、解决方案

 解决方案

        有的人可能会觉得,热点key过期容易导致缓存击穿,那我们把它的存活时间设成永久不就好了?
        这样肯定是不可以的,毕竟redis空间有限,不可能缓存那么多数据,而且“热点数据”也是会随时间变化的,也不可能把所有数据当成热点数据来缓存。

方案1:互斥锁(开发常用)

        假设会有 1w 个并发来访问这个 key,那么它们就会先查询 redis,然后都发现,这个 key 不存在;然后,它们就会对应的,往 redis 用 setnx 设置一个 key,来表示这是一把锁;

        这里介绍一下redis的setnx,该方法的作用可以标识锁,什么意思呢?

        setnx的使用方法是这样的:
        setnx key value

        如果key没有value,设置值成果。如果key已经有对应value,设置失败。

        类似于我们的互斥。上锁就是赋值、释放锁就是删掉锁(del key即可)

        一般会设置有效期,防止死锁。

Redis:缓存击穿、缓存穿透与缓存雪崩的区别、解决方案
        该方法通过传入锁的id,返回一个布尔值,来模拟获取锁的过程。

        然后,只有一个线程,会设置成功,然后去读取数据库,写回 redis;其他的 9999 个线程,则 sleep 一小会,然后再去访问我们的 redis。
        有人看到这,首先会问,这个 sleep 要多久?
        这个是要根据压测,以及线上环境进行调整的,一般会给出一个合适的值,也就是大约从数据库取出数据的时间。

 文章来源地址https://www.toymoban.com/news/detail-464349.html

Redis:缓存击穿、缓存穿透与缓存雪崩的区别、解决方案

Redis:缓存击穿、缓存穿透与缓存雪崩的区别、解决方案

 

 方案2:逻辑过期

        这种情况,我们假设key不会过期,而是通过人为地设置”expire time“一个属性,来进行人为地判断数据是否过期(比如,热门商品,那就在活动期间把它变为不会过期地key,等活动过了以后在主动让他过期)。

        中心思路就是,线程1抢到锁以后,将查数据库、返回缓存,这项比较耗时的任务交给别的线程(线程2)去做,然后多个并发线程就可以先返回过期的数据,等更新好了再返回新的。

        这样避免了大量线程休眠等待的情况。

Redis:缓存击穿、缓存穿透与缓存雪崩的区别、解决方案

Redis:缓存击穿、缓存穿透与缓存雪崩的区别、解决方案

 

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

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

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

相关文章

  • Redis缓存雪崩、穿透、击穿原因分析和解决方案,附Redis管道使用技巧

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

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

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

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

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

    2024年02月03日
    浏览(49)
  • 缓存穿透、缓存雪崩、缓存击穿解决方案

    缓存就是数据交换的缓冲区(称作Cache),是存贮数据的临时地方,一般读写性能较高。 需求:添加ShopTypeController中的queryTypeList方法,添加查询缓存 业务场景: 低一致性需求:使用内存淘汰机制。例如店铺类型的查询缓存 高一致性需求:主动更新,并以超时剔除作为兜底方

    2023年04月09日
    浏览(67)
  • Java缓存穿透、击穿、雪崩解决方案

    在互联网高并发的场景下,对于数据库查询频率高的数据,为了提高查询效率,常常会采用缓存技术进行优化。然而,缓存技术也会带来一些问题,比如缓存穿透、缓存击穿和缓存雪崩等。 当我们从缓存中查询一个不存在的数据时,请求就会穿透缓存直接查询数据库,这样就

    2023年04月19日
    浏览(47)
  • 缓存击穿、穿透、雪崩及常用解决方案

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

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

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

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

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

    2024年02月15日
    浏览(35)
  • redis缓存穿透、缓存击穿、缓存雪崩及对应解决方法

    缓存穿透、击穿和雪崩是缓存使用中的常见问题,对它们的理解和相应的解决方法对于维护系统性能和稳定性至关重要。 定义 : 当客户端请求的数据在缓存中和数据库中都不存在时,该请求会直接打到数据库上,这种情况称为缓存穿透。如果持续请求这样的数据,会给数据

    2024年04月08日
    浏览(36)
  • Redis缓存穿透、击穿、雪崩问题及其解决方法

    缓存穿透 :缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。 常见的解决方案有两种: 缓存空对象 优点:实现简单,维护方便 缺点: 额外的内存消耗 可能造成短期的不一致 布隆过滤 优点:内存占用较少,

    2024年02月02日
    浏览(31)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包