redis 缓存穿透,缓存雪崩,缓存击穿
之前也不知道是哪个老六总结出来得缓存穿透,缓存击穿 。
穿透,击穿 中文上容易搞混,所以贴出英文
缓存穿透: Cache Penetration
“Penetration” 有穿透、渗透之意,
eg: the penetration of hackers into the system (黑客对系统的侵入)
缓存击穿:Cache Breakdown
“Breakdown” 表示故障、损坏
eg: a nervous breakdown(精神崩溃 )
看下英文就很容易搞清楚了
缓存穿透
原理:当请求查询一个确定不存在的数据时 ,缓存中没有对应数据,请求直接落到数据库上。若被恶意利用,频繁发起此类查询,会给数据库带来极大压力。
解决方案分析:对不存在的数据也进行缓存,设置较短过期时间的空值缓存。或者采用布隆过滤器
缓存击穿
原理:热点数据(访问频率极高的数据)在缓存失效的瞬间,大量请求同时涌入,直接访问数据库,可能造成数据库短时间压力剧增。
解决方案分析:
使用互斥锁,在缓存失效时,只允许一个请求去数据库加载数据并更新缓存,其他请求等待,避免大量请求同时访问数据库。(只有缓存失效得时候才使用互斥锁)
采用 “永不过期” 策略,后台异步更新数据,保证热点数据一直有缓存,或者提前对热点数据进行预热,在缓存失效前主动更新缓存
缓存雪崩
原理:大量缓存同时失效,导致大量原本应从缓存获取数据的请求,瞬间都直接访问数据库,使数据库负载过高,甚至可能导致数据库崩溃。
解决方案分析:
给缓存失效时间加上随机值,让缓存失效时间分散开,避免集中失效。
使用多级缓存,如本地缓存 + 分布式缓存,当一级缓存失效时,二级缓存可作为缓冲,减轻数据库压力。
总结
缓存击穿 与 缓存雪崩 很像, 击穿是一条热点数据,雪崩是大量数据
穿透,是被入侵