Redis 雪崩、穿透、击穿「建议收藏」

Redis 雪崩、穿透、击穿「建议收藏」一、缓存雪崩:概念:缓存雪崩是指缓存中key大批量到过期时间,而这时大量请求同时打过来,引起数据库压力过大甚至down机实际生产中举例:以秒杀活动为例,QPS达到5000,这时,如果这5000个请求同时访问过来,在redis的缓存没有失效时,这个量级的qps,redis是可以承受住的。但是如果这时,所有的key都在某一个时间点失效了,而后台还没来得及重新刷缓存(缓存一般是定时任务主动刷新或修改时才刷新),那么这时,所有的请求就将会都直接打入MySQL数据库。可以想象,MySQL

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

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

一、缓存雪崩:

概念:

缓存雪崩是指缓存中key大批量到过期时间,而这时大量请求同时打过来,引起数据库压力过大甚至down机

实际生产中举例:

以秒杀活动为例,QPS 达到5000,这时,如果这5000个请求同时访问过来,在redis的缓存没有失效时,这个量级的qps,redis 是可以承受住的。

但是如果这时,所有的key都在某一个时间点失效了,而后台还没来得及重新刷缓存(缓存一般是定时任务主动刷新或修改时才刷新),那么这时,所有的请求就将会都直接打入MySQL 数据库。

可以想象,MySQL 基本是扛不住的,并且重启都没用,因为你重启的速度永远跟不上用户刷新的速度。

这个现象就叫做缓存雪崩。

解决方案:

1、针对key同时失效导致的缓存雪崩

我们平时设置key时,应该避免key的过期时间一样,可以在设置key的有效期时,添加一个随机数,把同时刷新出来的key的有效期设置为不一样的(比如几百毫秒到几十秒)。

当然,也可以采用数据预热的方案,在即将发生大并发访问前,手动触发缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。

2、针对redis缓存中间件突然挂掉,导致的缓存雪崩

针对小业务量级,我们可以采用 redis 的 sentinel 哨兵机制;

针对大业务量级,我们可以采用 redis 的 cluster 集群方案去应对。

不论是sentinel、还是cluster,其内部都有完整的自动故障转移,对于master 突然挂掉,都不换影响业务的正常运行。

 

二、缓存穿透

概念:

缓存穿透,是指恶意攻击者频繁查询一个数据库一定不存在的数据。

缓存不命中,就会把请求打到数据库,数据库没有这个数据,也就不会把数据存到缓存里,也就导致同样的请求,始终请求的,实际上都不是缓存,而是直接请求到数据库。

这时,如果有人利用不存在的key频繁请求我们的应用接口,并且量级非常大,就会造成存储层数据库承受不住,可能就会挂掉。

实际生产中举例:

比如有一个接口,www.haveyb.com/getProductInfo?product_id=109&porduct_type=2,

正常使用时,如果请求一个不存在的数据,比如 product_id = 999999999,这个数据实际上在数据库中是不存在的,但是就有那么一个恶意攻击者,拿着这个数据,频繁请求你,当一个一个请求发过来还好。

但如果同时几万个并发打过来呢?你实际上缓存没有命中后,把请求都打到数据库了,但是数据库没有这个数据,也就不能把数据放到缓存里,导致的结果就是请求不断地打到数据库上,数据库实际上是承受不住这么大并发的,就会导致数据库挂掉。

这就是缓冲穿透。

解决方案:

1、不管数据实际上存不存在,我们都把这个键存到缓存中(有效期设置的短一些,比如一分钟到三分钟),然后值设置为一个特定值,业务中如果获取到的结果是这个特定值,则报错返回。

2、另一个方案是使用 redis 的布隆过滤器(Bloom Filter),将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。

 

三、缓存击穿

1、概念

缓存击穿是指一个Key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个Key在失效的瞬间,持续的大并发就穿破缓存,直接请求到数据库,这时,大并发量可能直接将数据库给挂掉。

注:缓存击穿与缓存雪崩最本质的区别在于

缓存雪崩是由于大量的key同时过期,导致所有请求同时直接打到数据库,造成数据库挂掉;

缓存击穿是由于一个热点key失效,之前一直由缓存挡着的请求,直接发送到数据库,造成数据库挂掉。

生产中举例:

我们有一个获取商家系统后台设置的接口,缓存到redis中,这个接口,其他服务都在时刻调用,比如订单、商品、库存模块。

本来,这个数据在缓存中存在,所有请求都被缓存挡住了,这没什么问题,但是如果这个key突然过期了,那这个热点请求就会被直接打到数据库,在大并发量级的情况下,可能就会把数据库挂掉。

解决方案:

1、设置数据永久不过期(只更新,不删除或过期)

2、对该key 的 value 内部设置一个超时值,当访问时,发现已经达到这个超时值了,就更新缓存,并重置超时值(对于这个key,可以设置为不过期,或者超时值小于外部设置的过期时间)

$key = 'system_setting_106976';
$timestamp = time();
$data = [
    'value' => 12345678,
    'timeout' => $time
];
setnx($key, $data, $time + 360);
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/193938.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 10v转16v_nv12和nv21区别

    10v转16v_nv12和nv21区别摘要关于像素格式转换,搜到的帖子基本是NV16转RGB24或NV12转RGB24,对于NV16转NV12并没太多资料,因此我打算参照这两个像素格式的结构,实现这个转换接口。NV16像素格式介绍NV16可以理解为yuyv像素格式的变种,属于YUV422SP类型。整帧图像的大小为Width*Height*2。其像素格式如下:start+00: Y’00 Y’01 Y’02 …

  • t检验和u检验_均匀性检验界值表

    t检验和u检验_均匀性检验界值表常用显著性检验适用于计量资料、正态分布、方差具有齐性的两组间小样本比较。包括配对资料间、样本与均数间、两样本均数间比较三种,三者的计算公式不能混淆。应用条件与t检验大致相同,但t′检验用于两组间方差不齐时,t′检验的计算公式实际上是方差不齐时t检验的校正公式。应用条件与t检验基本一致,只是当大样本时用U检验,而小样本时则用t检验,t检验可以代替U检验。用于正态分布、方差齐性的多组间计量比较。常见的…

    2022年10月31日
  • python新浪股票接口 历史数据_实时数据与历史数据的区别_新浪股市接口

    用Python抓取新浪的股票数据新浪默认字段中的日期字段名是day。我个人认为这很不舒服。如果是小时数据或5分钟数据称为天,是不是不舒服?所以到日期的变化实际上没有多大意义。这只是我的个人喜好。实时数据采集方法与历史数据差别不大。完整的代码地址是:。不同的是,实时数据可以用逗号分隔同时获得的多个代码。经过实验,似乎最多可以得到100张票的实时数据。链接=’。请求。urlopen(链接)。decod…

  • java 将String字符串转 List集合「建议收藏」

    java 将String字符串转 List集合「建议收藏」StringgameString=”199,99,243,34,52,57,193,277,194,284,275,270,274,54,238,259,225,262,32,53,31,196,33,286,246,285,94,200,276,269,242,271,40,272,278,251,5,288,11,283,245,253,58,241,282,197,237,93,55,

  • nfv与云计算_云计算必学知识

    nfv与云计算_云计算必学知识云计算1.Saas软件即服务SaaS的实例:MicrosoftOfficeOnline(WordOnline,ExcelOnline等)服务,无需在本机安装,打开浏览器,注册账号,可以随时随地通过网络进行软件编辑,保存等,不需要用户去升级软件,维护软件等。平台即服务,把服务器平台作为一种对外提供的一种商业模式。系统对外提供接口服务,开发者可以利用这些接口进行开发业务或者应用,提供给用户使…

  • 软件、硬件版本号命名规范 ,请收藏好![通俗易懂]

    软件、硬件版本号命名规范 ,请收藏好![通俗易懂]点击上方"编程技术圈"关注,星标或置顶一起成长后台回复“大礼包”有惊喜礼包!每日英文Ionceheardthat,theonlythingyoucand…

发表回复

您的电子邮箱地址不会被公开。

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