缓存雪崩,缓存穿透,缓存击穿及解决方案

缓存的设置是用来处理高并发的情况,一般的项目都会进行缓存的设置,mysql 这么重的数据库,几乎不能承载高并发,虽然能支持一点点,但是天然支持不好。mysql 单机支撑到 2000QPS 也开始容易报警了。所以一般使用Redis来做缓存中间件。

但是缓存一般也会遇到以下三个问题,缓存雪崩、缓存穿透、缓存击穿。现在来讲一讲这是什么,是原因造成的以及如何解决。

正常的缓存流程

以淘宝为例,观察上图,当用户访问淘宝时,用户搜索某一商品,首先会在Redis中查询该数据的缓存,如果找到了该数据的缓存,则直接返回给客户。如果在Redis中没有检索到该数据的缓存,那么就会去数据库中查询该商品。在查询到该数据之后,在给客户做出结果返回的同时将查询后的数据同步至Redis中,以便下一个用户查询的时候可以在Redis中直接检索到,来缓解数据库的压力。

缓存雪崩

什么是缓存雪崩?

举个例子,什么是缓存雪崩,比如设置了缓存失效的时间为三个小时,在双十一的时候,大量的用户进入淘宝的首页,会有大量的查询数据库的请求,三小时之后缓存失效,此时如果缓存雪崩Redis失效后,会有大量的线程开始操作数据库,从而倒是系统的宕机。

缓存雪崩指的是Readis里的key在同一时间大量的失效,倒是大量的请求直接访问的数据库,而数据库能承载的线程到达一定数量之后就会挂掉,导致整个服务挂掉。

缓存雪崩怎么解决?

1.缓存中间件宕机的时候,也就是说Redis出现宕机。

一般不会出现,因为一般Redis都是搭建了高可用集群,不会出现所有的Redis服务器全部宕机。

2.设置随机的缓存失效时间,使得缓存不会同时失效。

3.Redis一般集群部署,将热点的Key放到不同的节点上去,让热点的缓存能够平均的分配到不同的节点来减缓Redis服务器的压力。

4.暴力办法,不设置缓存的失效时间,使得缓存永远不过期(不推荐)

5.定时任务,例如我们设置了缓存失三小时失效,那么在缓存失效之前,我们设置定时任务,再把缓存写到Redis中去。

缓存穿透

什么是缓存穿透?

举个例子,我们设计一个网站,网站异常的火爆,遭到黑客的攻击。我们在设计数据库的时候,id都是从1开始自增的,id最小值为1。黑客就会使用id=-1,或者其他不合法的值来疯狂的发请求,导致Redis失效,就会去数据库中查询,数据库中也没有相对应的值,数据库被大量的线程操作导致宕机。

缓存穿透就是缓存和数据库中都没有数据

一般来说,导致缓存穿透的情况都是黑客的攻击,因为正常的用户不会使用非法的数据一直去请求。

缓存穿透怎么解决?

1.拉黑ip,拉黑一直非法请求的ip,但是一般来说黑客都会使用随机的ip来发送请求,所以不能很有效的解决这个问题。

2.当请求穿透Redis后,数据库无论查到什么结果(null或者有值)都将其结果缓存到Redis中,当下一次请求的时候可以直接被Redis拦截。

3.参数校验,在请求发送到服务器的时候,进行参数的校验,当参数不合法直接返回。

4.布隆过滤器,是 1970 年由布隆提出的,是一种非常节省空间的概率数据结构,运行速度快,占用内存小,但是有一定的误判率且无法删除元素。它实际上是一个很长的二进制向量和一系列随机映射函数组成,主要用于判断一个元素是否在一个集合中。

缓存击穿

什么是缓存击穿 

举个例子,在进行秒杀某一个商品的时候,设置了缓存的有效时长为3小时,特别多的用户都来参与商品的秒杀活动,直到缓存有效时间到了,大家还在买这个商品,在缓存到期的一瞬间,缓存失效,Redis由于高并发大量的请求打倒数据库,导致数据库宕机。

某一个热点Key突然失效,导致Redis失效,使得大量的线程开始操作数据库。

缓存击穿怎么解决?

1.设置缓存不过期(不推荐)

2.分布式锁:在请求数据库时上锁,只让一个线程去请求数据库,然后缓存到Redis上,其他的线程睡眠上几毫秒之后直接去Redis上检索数据。可以通过zookeeper和Redis来实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值