飞不高 发表于 10 小时前

Redis 缓存优化:缓存雪崩、缓存击穿、缓存穿透的概念与防备

在实际的业务场景中,Redis 通常作为缓存和其他数据库(比方 MySQL)搭配使用,用来减轻数据库的压力。但是在使用 Redis 作为缓存数据库的过程中,大概会碰到一些常见题目,比方缓存穿透、缓存击穿和缓存雪崩等。
缓存雪崩

缓存雪崩是指缓存中大批量的 key 同时逾期,于是大量哀求访问数据库,从而导致数据库压力激增,乃至引起数据库宕机,这种征象被称为 “缓存雪崩”。
制止缓存雪崩的步调有:

[*]给缓存数据设置差别的逾期时间,制止同时逾期;
[*]使用 Redis 集群进步服务可用性,制止因 Redis 宕机引起的缓存雪崩;
[*]给缓存业务添加降级限流计谋;
[*]使用多级缓存架构,分散缓存失效的影响。
缓存击穿

如果 Redis 中一个被高并发访问而且缓存重修业务较复杂的 Key 突然失效,那么大量哀求将直接访问数据库,从而瞬间给数据库造成巨大打击。这种征象被称为 “缓存击穿”。
制止缓存击穿的步调有:

[*] 使用互斥锁:
当缓存未掷中时,通过互斥锁方式,确保只有一个线程访问后端存储获取数据,并重修缓存,其他线程保持列队期待。
长处:没有额外内存斲丧(不须要设置逻辑逾期数据);包管数据库数据与缓存数据的划一性;
缺点:线程须要期待,性能受影响;当多个线程须要竞争多把锁时,大概会有死锁风险。
[*] 逻辑逾期:将缓存设置一个逻辑逾期时间,线程每次都会访问到缓存。当取到逾期数据时,开启一个新线程,用于缓存重修,同时须要给新线程加上互斥锁(用于包管单个缓存的重修只被一次实行)。
长处:线程无需期待,性能较好;
缺点:不包管数据库数据与缓存数据的划一性;有额外内存斲丧。
缓存穿透

当用户查询某个数据时,Redis 中不存在该数据,即未掷中缓存,以是此时查询数据的哀求将访问恒久层数据库(比方 MySQL 数据库)以获取须要的数据,但是发现数据库中也并不存在该数据,于是数据库将返回空对象。此类哀求如果过多,大概恶意用户使用此毛病举行恶意攻击,将会给数据库造成过大压力,乃至引起数据库瓦解。这种征象被称为 “缓存穿透”。
制止缓存穿透的步调有:

[*] 缓存空值:
当哀求未掷中缓存,同时数据库中也无法查询到数据时,直接将哀求对应的数据在 Redis 中缓存为空值。当哀求再次访问该数据时,Redis 将直接返回缓存中缓存的空值,从而使哀求制止直接访问数据库。
该方案也有缺点:

[*]额外内存斲丧:由于 Redis 是基于内存的,以是将产生额外的内存斲丧。
[*]数据不划一:在实际开辟中,通常在更新数据库数据时同步删除缓存,以到达缓存与数据库数据划一的目的。但是在更新数据乐成后到更新缓存乐成前的极短时间内,大概会造成极短时间的缓存与数据库数据的不划一。
针对上述两个题目,可以设置一个较短的 TTL(缓存逾期时间)以规避。

[*] 使用布隆过滤器:
布隆过滤器的特性之一是可以判断命据是否存在,布隆过滤器的这一特性可以用于办理缓存穿透题目。通过布隆过滤器可以将无效哀求过滤掉,以确保合法的哀求才华访问后端数据库。
       当有一个用户哀求到来时会先颠末布隆过滤器,如果哀求的数据,布隆过滤器中不存在,那么该哀求将直接被拒绝,否则将继承实行查询。
    https://i-blog.csdnimg.cn/direct/d3ca1386bd79481eaf689928c5735176.gif
相较于第一种方法,布隆过滤器内存占用较少,更为高效、实用,但是存在误判大概。
别的,对于恶意用户举行的恶意攻击而导致的缓存穿透情况,也可以通过限流、黑名单等本领加以限定,从而掩护后端数据库免受恶意攻击。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Redis 缓存优化:缓存雪崩、缓存击穿、缓存穿透的概念与防备