缓存击穿及解决方案
最近小生遇到了好多人问缓存击穿的问题,作为一个乐于学习的渣渣,小生当然要去网上大肆搜集一番,综合小生的经验整理出了本篇文章,希望可以帮助到大家。
要想研究缓存击穿就得先知道什么是缓存?所谓缓存是Web应用开发同时也是互联网分层架构中非常重要的一个部分,通常用来缓解数据库的压力,从而提升系统整体性能,缩短用户的访问时间。
Web应用获取数据时先会去cache中找数据
- cache中有数据
- cache将数据返回给web应用
- cache中没有数据
- cache向数据库请求数据
- 数据库返回数据给cache
- cache将数据更新后返回给web应用
定义
所谓缓存击穿就是web应用去请求一个不在cache中或者已经失效的数据时,就会触发一次数据库查询,如果瞬间有大量类似的操作时就会导致数据库压力过大,造成反应过慢甚至宕机瘫痪。
解决方法
综上所述产生缓存击穿的场景主要两种
- 同一时间访问一个或者多个不存在的数据
- 多个数据同时失效
场景一:数据不存在
方案一:
缓存null:当通过某个key去查询时,如果cache和数据库都不存在对应的数据,那么cache可以将这个key对应的value设置为一个默认值(比如:null),并且设置一个缓存过期的时间,这样在缓存失效这段时间内,所有访问这个key的请求都会被cache拦截,等到缓存失效后再去数据库中查询。
缺点:如果不存在的数据非常多,则会存储大量的缓存垃圾,浪费资源。
方案二:
Bloomfilter:类似于一种哈希表算法,在cache之前预判这个key是否合法,如果不合法则直接返回。
缺点:存在误杀的可能性
方案三:
屏蔽IP:记录并分析访问不存在的数据请求,获取其IP地址,如果在规定时间内此IP超过某个设定值&#