缓存穿透、缓存雪崩、缓存击穿的区别和解决方案

本文探讨了在高并发环境下,Redis缓存可能遭遇的三大问题——缓存穿透、缓存击穿和缓存雪崩。缓存穿透是指查询数据库中不存在的数据,解决方案包括布隆过滤器、拦截器和互斥锁等。缓存击穿是大量请求在缓存失效时直接命中数据库,可以通过设置热点key永不失效或使用互斥锁来避免。缓存雪崩则是大量缓存在同一时间失效,解决方案包括设置随机过期时间、分散热点数据和主从缓存。
摘要由CSDN通过智能技术生成

前言

随着互联网行业不断的演进与变更,体量与复杂性的变化催生出一个又一个难题,从而衍生出一系列方便开发者解决问题的中间件,比如Redis,我们为什么要使用redis,有两个重要的原因,一个是为了减轻服务器数据库的压力,另一个当然就是因为它很‘快’,本文主要阐述在使用Redis过程中遇到高并发的情况下容易产生的几个问题,缓存击穿,缓存雪崩以及缓存穿透


一、缓存穿透

缓存穿透是指查询一个数据库中不存在的数据,数据库中不存在的数据自然也不会被加载到缓存当中,正常的查询流程应该是,查询一个数据先去缓存中判断这个数据是否存在,存在则返回,如果不存在则去数据库中查询,如果查询数据不为空则放回缓存后返回查询,当数据库中不存在这个数据的时候或者说这个数据已经过期,那么一直请求这个key,这个请求就会一直直接打在数据库查询上,导致数据库压力持续增大直至崩溃,如果有网络攻击者发现这个漏洞后果可想而知。

解决方案:
(1)采用布隆过滤器,使用一个足够大的bitmap,用于存储可能访问的key,不存在的key直接被过滤;
(2)拦截器,id<=0的直接拦截。
(3)利用互斥锁,缓存失效的时候,先去获得锁,得到锁了,再去请求数据库。没得到锁,则休眠一段时间重试
(4)采用异步更新策略,无论key是否取到值,都直接返回。value值中维护一个缓存失效时间,缓存如果过期,异步起一个线程去读数据库,更新缓存。需要做缓存预热(项目启动前,先加载缓存)操作。
(5)采取缓存空值的方式,也就是从数据库中查询该key的值为空的情况下也放入缓存当中。

二、缓存击穿

值得是一个存在的key,在缓存失效的那一刻,突然有大量查询请求,那么这些请求都会直接打在数据库上,导致数据库压力骤增,请求量过大导致崩溃,比如网购app中的抢购、秒杀等现象。

解决方案:
(1)设置热点的key在缓存中永不失效。
(2)添加互斥锁

三、缓存雪崩

缓存雪崩指的是大量的key在缓存中设置失效的时间都差不多,导致缓存在同一时间失效,那么所有的请求都会直接打在数据库上,同样会照成数据库压力陡增。

解决方案:
(1)缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
(2)如果缓存数据库是分布式部署,将热点数据均匀分布在不同的缓存数据库中。
(3)设置多缓存,主从缓存群等,主缓存失效,立即切换从缓存,确保请求不会直接对数据库照成查询压力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值