高并发下缓存失效问题;缓存穿透
、缓存击穿
、缓存雪崩
缓存穿透
指查询一个—定不存在的数据(从头到尾、自始至终数据库也不存在的数据),必然导致缓存不命中,直接查询数据库,但是数据库也无此记录
我们没有将这次查询的null写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义
风险: 利用不存在的数据进行攻击,数据库瞬时压力增大,最终导致崩溃
解决:
- 将数据库查询结果或
null
进行缓存,并加入短暂过期时间
缓存雪崩
缓存雪崩是指在我们设置缓存时key采用了相同的过期时间,导致缓存在某一时刻大量的key同时失效,请求全部转发到DB, DB瞬时压力过重雪崩。
解决: 原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。
缓存击穿
某一时刻某个
热点Key
突然失效,导致大量的请求都打到了数据库
解决: 加锁
;大量并发请求只允许一个去查数据库,其余进行等待,查到以后并进行缓存后释放锁,其他请求获取到锁,先查缓存,就会有数据,不用去db