缓存的穿透、击穿和雪崩
缓存的穿透、击穿和雪崩
在缓存与数据库结合的系统架构中,穿透,击穿和雪崩是常见的问题,这里介绍它们产生的原因和解决方案。
穿透
出现原因:
当查询一个数据库中并不存在的数据时(我们暂时称为不合法查询),缓存中肯定也不存在,所以就会去磁盘中查询数据库。
如果同时出现大量这种不合法查询查询,就会给数据库造成巨大压力,甚至压垮数据库。
例如,黑客恶意攻击,使用大量不存在的Id进行查询。
解决方案:
- 布隆过滤器:在缓存之前使用布隆过滤器,对数据建立哈希映射。查询时先通过布隆过滤器判断数据是否存在,若不存在则直接返回,这样空查询就不会去访问数据库。
- 缓存空值:当某个数据查询数据库也找不到时,在缓存中记录空值,并设置较短的过期时间。后续相同的访问可以直接通过缓存拦截,直接返回空值,减少了对数据库的压力。
击穿
出现原因:
有一个热点key,有大量的并发的请求同时进行访问。当它缓存过期的瞬间,这些请求会绕过缓存之间查询数据库,瞬间对数据库造成巨大压力。
例如,电商的秒杀活动,当某个热门商品的缓存过期,大量用户同时查询该商品信息,查询请求都打到数据库上。
- 互斥锁:缓存过期时,只允许一个线程去访问数据库并更新缓存,此时其他线程需要等待。当该线程更新缓存后,释放锁,其他线程可以继续访问。
- 永不过期:对热点数据设置永不过期,但需要在数据发生变化时更新缓存。或者采用定时的异步缓存,保证数据一致性。
雪蹦
出现原因:
某个时间段内,大量缓存同时过期,这些请求大量涌入数据库,给数据库造成巨大压力,甚至宕机。
例如,系统中为所有缓存设置相同的过期时间,在过期时刻所有的请求都直接查询数据库。
- 随机过期时间
- 采用多级缓存:例如,一级缓存使用Redis,二级缓存采用本地缓存,这样一级缓存失效时二级缓存也有可能命中,减少数据库的压力。

浙公网安备 33010602011771号