缓存穿透+缓存击穿+缓存雪崩

前言

redis看上去很完美,但是世上没有毫无缺点的系统,redis也是如此。在一些高并发的系统中,redis可能会出现缓存穿透、缓存击穿和缓存雪崩这几个问题。接下来我们看看这几个问题的出现原因和解决方案。

缓存穿透

概述:查询条件在数据库中查不到任何结果时,redis中也不会缓存,则此类查询请求会全部落在数据库上,请求如果过大,会击垮数据库。

缓存穿透

解决方案:1.采用布隆过滤器,(布隆过滤器其实是一个超大的bitmap,对每一种请求可能通过各种hash算法,映射到bitmap中不同位置,被映射到的位置值变成1,没有被映射到的位置值是0)。当请求过来时对请求做hash,如果映射到bitmap中的所有位置中有一个不是0,说明这个请求不可能存在,则直接返回,请求也不会到达数据库。布隆过滤器不能确定一定存在的请求,但能确定一定不存在的请求。

2.简单粗暴做法,如果数据库查不到此条数据,返回null,在redis中也将此结果缓存key-null。下次同样请求过来,到redis直接返回null。这种做法需要将null对应的key有效期设置的短一些,一般不超过五分钟。

缓存击穿

概述:key对应的数据在redis过期时,对应的查询请求会直接到达数据库,如果在数据回设到redis之前,这段时间请求过大,也会压垮数据库。

缓存击穿

解决方案:加锁。能击穿缓存的肯定是热点数据,当热点数据请求进来时,如果redis中查不到此数据,则对此请求加上锁,如果是分布式环境,则需要加上分布式锁,等数据从数据库返回,重新进入缓存时,再释放锁,这样下个请求过来,就可以直接从redis中获取数据。

缓存雪崩

概述:redis出现多个key的失效时间相同,当这些key同时失效时,这些key对应的请求就都会到达数据库,压垮数据库。

缓存雪崩

解决方案:在设置失效时间时添加一个随机值,防止多个key的过期时间重复,这样就很难出现集体失效的事件发生。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。