redis的缓存穿透、击穿和雪崩

背景:

       随着用户的增长,用户的请求也越来越频繁,为了保证服务器在高并发的情况能正常提供服务,我们首先引入了缓存Redis,减少数据库的压力和数据的安全性同时提高了接口反应速度,解决了用户的请求直接与数据库建立连接。 

       但是在使用Redis的时候,随之而来的问题也会越来越多,有些请求甚至会直接越过Redis直接请求数据库,今天我们来了解Redis数据库经常会谈及的问题缓存雪崩缓存击穿缓存穿透

缓存雪崩:

概念:

       在某一时刻,大量的key失效,用户大量请求直接请求数据库,导致数据库宕机。此时的Redis形同虚设,用户大量请求都命中不了,导致数据库服务器压力过大,Redis本身是用来减少数据库的压力,那么此时如何解决呢?

解决方案:

       1、随机设置缓存的过期时间,以防同时过期大量缓存数据。

       2、如果是在集群环境中,将热点数据均匀分布在不同的缓存数据库中。

       3、可以设置热点数据永不过期,如果有数据更新就直接更新redis即可。

缓存击穿:

概念:

       缓存里面的一个key非常的火爆,在某一时间这个key刚好过期,大并发数据量击穿了缓存直接请求数据库,导致数据库压力过大,严重情况会导致数据库崩溃,这就是缓存击穿。

       例如:微博热点新闻,某个明星又出绯闻了,然后大量的粉丝刷文章刷评论,一时间热火朝天,突然请求这条微博的缓存过期,那么大量的请求直接涌向数据库,建立大量连接,数据库还没反应过来就崩了

解决方案:

       1、设置这个key永远不会过。

       2、程序控制请求数据库的次数,比如添加互斥锁、延时请求(1s后请求)。

       3、服务器熔断、降级,限制每个用户的访问次数,并且如果获取不到数据即返回一个固定的推荐页面。

缓存穿透:

概念:

       用户不断地请求一个缓存没有,并且数据库也没有的数据,服务器疯狂的跟数据库建立连接从而压倒数据库。比如说:根据产品id获取产品详情的接口,那么我用一个id=-1去请求,那肯定是获取不到任何数据的。一般这样的情况有可能服务器遭到了恶意攻击。

解决方案:

       1、在用户请求的接口层增加一些校验,例如:用户鉴权校验、参数传值校验等不合法的参数请求即直接返回。开发者应该保持一个悲观的态度,不要相信任何客户端因为计算机本身不知道操作者是谁,任何参数都应该考虑到。

       2、使用Redis高级数据结构布隆过滤器,他就是检测数据库中是否存在该key,不存在就直接返回即可。

总结:

       缓存的雪崩击穿穿透其实都是客户端请求直接越过缓存直接请求数据库,但是他们从意义上来讲又有微妙的不同。大家一定要理解这三者是如何产生的,才能对症下药。在用户请求的时候我们可以配置服务器的熔断+降级,保证服务器不会崩溃,用户请求频繁可以限制它的请求次数,或者可以牺牲部分用户的性能。

       一般来讲数据到达一定量后,为了保证服务器的高可用,我们会对redis建立集群或者是主从+哨兵模式,避免redis直接挂掉没有任何的机器代替。也可以使用redis持久化,如果redis崩溃,重启后且恢复数据。当然,我们也要保证数据库本身具有一定的抗压性,比如我们添加一主多从的数据库,保证数据库不会那么容易崩溃。

你可能感兴趣的:(redis,缓存,redis)