redis 击穿 穿透_redis穿透击穿雪崩

redis 击穿 穿透_redis穿透击穿雪崩本文分享自华为云社区《【高并发】什么是缓存穿透?击穿?雪崩?如何解决?》,作者:冰河。缓存穿透首先,我们来说说缓存穿透。什么是缓存穿透呢?缓存穿透问题在一定程度上与缓存命中率有关。如果我们的缓存设计的不合理,缓存的命中率非常低,那么,数据访问的绝大部分压力都会集中在后端数据库层面。什么是缓存穿透?如果在请求数据时,在缓存层和数据库层都没有找到符合条件的数据,也就是说,在缓存层和数据库层都没有命中数据,那么,这种情况就叫作缓存穿透。我们可以使用下图来表示缓存穿透的现象。造成缓

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

本文分享自华为云社区《【高并发】什么是缓存穿透?击穿?雪崩?如何解决?》,作者:冰 河。

缓存穿透

首先,我们来说说缓存穿透。什么是缓存穿透呢?缓存穿透问题在一定程度上与缓存命中率有关。如果我们的缓存设计的不合理,缓存的命中率非常低,那么,数据访问的绝大部分压力都会集中在后端数据库层面。

什么是缓存穿透?

如果在请求数据时,在缓存层和数据库层都没有找到符合条件的数据,也就是说,在缓存层和数据库层都没有命中数据,那么,这种情况就叫作缓存穿透。

我们可以使用下图来表示缓存穿透的现象。

redis 击穿 穿透_redis穿透击穿雪崩

造成缓存穿透的主要原因就是:查询某个Key对应的数据,Redis缓存中没有相应的数据,则直接到数据库中查询。数据库中也不存在要查询的数据,则数据库会返回空,而Redis也不会缓存这个空结果。这就造成每次通过这样的Key去查询数据都会直接到数据库中查询,Redis不会缓存空结果。这就造成了缓存穿透的问题。

如何解决缓存穿透问题?

既然我们知道了造成缓存穿透的主要原因就是缓存中不存在相应的数据,直接到数据库查询,数据库返回空结果,缓存中不存储空结果。

那我们就自然而然的想到了第一种解决方案:就是把空对象缓存起来。当第一次从数据库中查询出来的结果为空时,我们就将这个空对象加载到缓存,并设置合理的过期时间,这样,就能够在一定程度上保障后端数据库的安全。

第二种解决缓存穿透问题的解决方案:就是使用布隆过滤器,布隆过滤器可以针对大数据量的、有规律的键值进行处理。一条记录是不是存在,本质上是一个Bool值,只需要使用 1bit 就可以存储。我们可以使用布隆过滤器将这种表示是、否等操作,压缩到一个数据结构中。比如,我们最熟悉的用户性别这种数据,就非常适合使用布隆过滤器来处理。

缓存击穿

如果我们为缓存中的大部分数据设置了相同的过期时间,则到了某一时刻,缓存中的数据就会批量过期。

什么是缓存击穿?

如果缓存中的数据在某个时刻批量过期,导致大部分用户的请求都会直接落在数据库上,这种现象就叫作缓存击穿。

我么可以使用下图来表示缓存击穿的线程。

redis 击穿 穿透_redis穿透击穿雪崩

造成缓存击穿的主要原因就是:我们为缓存中的数据设置了过期时间。如果在某个时刻从数据库获取了大量的数据,并设置了相同的过期时间,这些缓存的数据就会在同一时刻失效,造成缓存击穿问题。

如何解决缓存击穿问题?

对于比较热点的数据,我们可以在缓存中设置这些数据永不过期;也可以在访问数据的时候,在缓存中更新这些数据的过期时间;如果是批量入库的缓存项,我们可以为这些缓存项分配比较合理的过期时间,避免同一时刻失效。

还有一种解决方案就是:使用分布式锁,保证对于每个Key同时只有一个线程去查询后端的服务,某个线程在查询后端服务的同时,其他线程没有获得分布式锁的权限,需要进行等待。不过在高并发场景下,这种解决方案对于分布式锁的访问压力比较大。

缓存雪崩

如果缓存系统出现故障,所有的并发流量就会直接到达数据库。

什么是缓存雪崩?

如果在某一时刻缓存集中失效,或者缓存系统出现故障,所有的并发流量就会直接到达数据库。数据存储层的调用量就会暴增,用不了多长时间,数据库就会被大流量压垮,这种级联式的服务故障,就叫作缓存雪崩。

我们可以用下图来表示缓存雪崩的现象。

redis 击穿 穿透_redis穿透击穿雪崩

造成缓存雪崩的主要原因就是缓存集中失效,或者缓存服务发生故障,瞬间的大并发流量压垮了数据库。

如何解决缓存雪崩问题?

解决缓存雪崩问题最常用的一种方案就是保证Redis的高可用,将Redis缓存部署成高可用集群(必要时候做成异地多活),可以有效的防止缓存雪崩问题的发生。

为了缓解大并发流量,我们也可以使用限流降级的方式防止缓存雪崩。例如,在缓存失效后,通过加锁或者使用队列来控制读数据库写缓存的线程数量。具体点就是设置某些Key只允许一个线程查询数据和写缓存,其他线程等待。则能够有效的缓解大并发流量对数据库打来的巨大冲击。

另外,我们也可以通过数据预热的方式将可能大量访问的数据加载到缓存,在即将发生大并发访问的时候,提前手动触发加载不同的数据到缓存中,并为数据设置不同的过期时间,让缓存失效的时间点尽量均匀,不至于在同一时刻全部失效。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/193890.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Cocos2d-x lua游戏开发之安装Lua到mac系统

    Cocos2d-x lua游戏开发之安装Lua到mac系统

    2022年1月27日
    46
  • vs2019配置opencv什么版本_vs配置opencv

    vs2019配置opencv什么版本_vs配置opencv一、环境vs2019社区版、win1064位操作系统二、opencv配置步骤(共5步)1、下载OpenCV4.0.1,官网为opencv.org2、安装opencv,我的安装目录是D:\opencv-4.0.1-vc14_vc153、添加环境变量,在PATH中添加:D:\opencv-4.0.1-vc14_vc15\opencv\build\x64\vc15…

    2022年10月20日
    1
  • 懒加载(Lazy Loading) – MyBatis懒加载 – Spring懒加载

    懒加载(Lazy Loading) – MyBatis懒加载 – Spring懒加载文章目录懒加载(LazyLoading)MyBatis中懒加载的使用Spring中懒加载的使用懒加载(LazyLoading)  懒加载也叫“延迟价值”,核心思想是把对象的实例化延迟到真正调用该对象的时候,这样做的好处是可以减轻大量对象在实例化时对资源的消耗,而不是在程序初始化的时候就预先将对象实例化。另外“懒加载”可以将对象的实例化代码从初始化方法中独立出来,从而提高代码的可读性,以便于代码能够更好地组织。  特别是在web应用程序中,它能够在用户滚动页面的时候自动获取更多的数据,而新得到的数据

    2025年6月7日
    2
  • ThreadPoolTaskExecutor线程池参数配置

    ThreadPoolTaskExecutor线程池参数配置一、线程池配置1、ThreadPoolConfigimportorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.scheduling.annotation.EnableAsync;importorg.springframework.scheduling.concurrent.Threa

    2022年5月4日
    306
  • 可重入锁详解(什么是可重入)

    可重入锁详解(什么是可重入)可重入锁详解概述什么是“可重入”,可重入就是说某个线程已经获得某个锁,可以再次获取锁而不会出现死锁。例如packagecom.test.reen;//演示可重入锁是什么意思,可重入,就是可以重复获取相同的锁,synchronized和ReentrantLock都是可重入的//可重入降低了编程复杂性publicclassWhatReentrant{ publicsta…

    2022年4月19日
    48
  • centos7中安装VMware虚拟机_安装wget

    centos7中安装VMware虚拟机_安装wget1.安装相应的编译工具在root用户下(不要用普通用户,麻烦),全部复制粘贴过去,一次性安装即可.yum-ygroupinstall”Developmenttools”yum-yinstallzlib-develbzip2-developenssl-develncurses-develsqlite-develreadline-develtk-develgdbm-develdb4-devellibpcap-develxz-develyuminstall-ylib

    2025年12月4日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号