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

前言

几种现象很常见,基本都是在高并发的场景下,因为大量请求没有在缓存中查询到数据而从数据库中查询,形成了数据库的并发量瞬间增大。数据库

好比2000的QPS,对于Redis来讲顶的很轻松,可是普通服务器上的数据库就很难顶。缓存

下面对这集中状况进行一个简单介绍,并总结一些解决方案。服务器

1、缓存雪崩

一、现象

项目中,一般会将热点数据保存到Redis并设置过时时间,好比在12点将热点数据放到Redis中,过时时间为1小时。并发

请求时,先去Redis读取数据,若是Redis中不存在该数据,就去数据库中读取数据,而后放到缓存中。高并发

这种设计在并发大时会出现一个问题。spa

如上面的设计,在1点、2点、3点……的时候,若是缓存失效时,系统并发请求过大,就会对数据库形成周期性的压力。设计

其实缓存的集中过时并非很是致命的,最致命的雪崩状况是缓存服务器失效(死机、断网)。基础

之因此这么说,是由于缓存集中过时形成的缓存雪崩,也会集中建立缓存,数据库兴许能够顶住。配置

但由于缓存服务节点失效而形成的缓存雪崩,对数据库形成的压力则是难以预估的,颇有可能把数据库压垮,形成系统不可用。请求

这种状况下,若是缓存由于过时时间到达而失效,那么就会有大量的请求打到数据库,形成周期性的数据库压力。

总结:缓存忽然不可能,接着来的大量请求瞬间打在了数据库。

二、解决方案

一、随机设置缓存的过时时间:在指定的缓存过时时间上,随机在加上必定时间的过时,不让缓存在同一时间过时,好比超时时间是固定的5分钟,能够随机加上2分钟内的秒数。

二、缓存备份,在A缓存节点设置过时时间,B缓存节点不设置过时时间,当A失效时去读取B。

三、不设置过时时间,在修改数据库时更新缓存。

2、缓存穿透

一、现象

缓存穿透是指,在缓存和数据库中都没有的数据,而用户不断发起请求,形成数据库压力增大。

例如,数据库中的数据主键使用自增,从1开始。可是用户不断查询主键为“-1”的数据,或主键特别大的不存在的数据。这时的用户极可能是攻击者,攻击会致使数据库压力过大。

二、解决方案

一、在应用程序层增长校验,如用户鉴权校验,主键基础校验等。

二、应用程序作限流、熔断、降级,能够从网关层进行限流(例如在Nginx中进行配置),或者使用相似Hystrix的组件进行熔断或降级。

三、使用布隆过滤器,先判断要查询的主键是否存在。

四、使用互斥锁。

3、缓存击穿

一、现象

缓存击穿是指缓存中没有,但数据库中有的数据。

例如,缓存中保存了一个很是热的数据,当缓存过时的同时,并发读取这个热数据的用户特别多,同一时间读缓存但没读到数据,又同时去数据库去取数据,形成了数据库的压力瞬间增大,这种状况就叫缓存击穿。

二、解决方案

一、设置热点数据永远不过时,更新数据库的同时更新缓存。

二、使用互斥锁;

相关文章
相关标签/搜索