缓存雪崩
缓存雪崩是指缓存同一时间大面积失效,所以后面的请求都会落在数据库上,造成数据库短时间内承受大量请求而崩掉。
目前电商首页以及热点数据都会缓存,一般缓存都是定时刷新或者查不到之后更新缓存。定时任务刷新就会存在一个问题。假如,所有的缓存数据失效时间都是12个小时,中午12点刷新缓存,双十一零点会有大量用户涌入,假设每秒6000个请求,本来缓存可以抗下请求,但此时缓存中的key都过期了,此时6000个请求全部落在数据库上,直接宕机。
解决方案:
1、缓存数据的过期时间设置随机值,防止同一时间大量数据过期。
2、缓存预热
3、设置热点数据永不过期,有更新操作就更新缓存。
4、互斥锁,保证只有一个线程访问数据库,其余都等待。
缓存穿透
缓存穿透指缓存和数据库中都没有数据,导致所有的请求都落在数据库上,造成数据库短时间内承受大量请求而崩掉。
例如:数据库id是从1开始自增的,如果黑客大量访问id=-1的数据,这样不断攻击会导致数据库压力特别大,严重时会击垮数据库。
解决方案:
1、接口层增加校验,比如用户鉴权,参数校验,比如id<=0 直接拦截
2、缓存获取不到数据,数据库也获取不到,这时可以在redis中缓存key-null,缓存有效时间可以设置短点。这样可以防止攻击者反复使用同一个id暴力攻击。
3、采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据一定会被bitmap拦截,从而避免对底层存储系统的查询压力。
缓存击穿
缓存击穿是指热点key在某个时间点过期的时候,而恰好在这个时间点对这个Key有大量的并发请求过来,没有从缓存中读取到数据,同时到数据库读取数据。
一个商品10点进行秒杀,但是10点的时候缓存恰好过期,这就导致所有的请求都走的数据库。
解决方案:
1、设置热点数据永不过期
2、加互斥锁。