2019-11-22 缓存穿透,缓存雪崩,缓存击穿是什么?如何解决?

缓存穿透,缓存雪崩,缓存击穿是什么?如何解决?

缓存穿透:用户查询数据,在数据库中没有,自然在缓存中也不会有。这就导致用户查询的时候,再缓存中找不到,每次都要去数据库查询一遍,然后返回空。这样请求绕过缓存直接查询数据库,这也是缓存命中率问题。

假如有恶意攻击,就可以利用这个漏洞,对数据库造成压力,甚至压垮数据库。

解决办法:1.如果查询数据库也为空,直接设置一个默认值存放到缓存,这样第二次到缓存中获取就有值了,不会继续访问数据库。

            2.双重检测锁,

2019-11-22 缓存穿透,缓存雪崩,缓存击穿是什么?如何解决?_第1张图片

3.布隆过滤器

缓存雪崩:原因之一:缓存雪崩是由于原有缓存失效(过期),新缓存未到期间。所有的请求都去查询数据库,对数据库cpu和内存造成巨大压力,严重的会造成数据库脱机。从而形成一系列连锁反应,造成整个系统崩溃。

缓存雪崩:原因之二:缓存服务器某个节点宕机或断网。

解决方案1.一般并发量不是特别多的时候,使用最多的解决方案是加锁排队

2019-11-22 缓存穿透,缓存雪崩,缓存击穿是什么?如何解决?_第2张图片

2.加锁排队只是为了减轻数据库的压力,并没有提高系统的吞吐量。高并发情况下,缓存重建期间key是锁着的,大部分请求都在阻塞着。导致用户等待超时,治标不治本的方法。

给每个缓存数据增加相应的缓存标记,记录缓存是否失效,如果缓存标记失效,则更新数据缓存。缓存标记:记录缓存数据是否过期,如果过期会触发通知另外的线程在后台去更新实际key的缓存。

2019-11-22 缓存穿透,缓存雪崩,缓存击穿是什么?如何解决?_第3张图片

缓存击穿一个key非常热点,在不停的扛着大并发,大并发集中对这个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库。

解决方案

1.大多数情况下这种爆款很难对数据库服务器造成压胯性的压力,达到这个级别的公司没有几家。主打商品设置成永不过期,即便某些商品发酵撑了爆款,也直接设为永不过期就好了。

      2.加锁或者队列的方式保证缓存的单线程(进程)写,再加锁方法内先从缓存中再获取一次,没有再查DB写入缓存。

      3.物理上的缓存是不设置超时时间(或时间比较长),但是在缓存对象上增加一个属性标示超时时间(相对较小)。获取到数据后,校验数据内部的标示时间,判断是否过期,如果是异步发起一个线程(控制好并发)去主动更新缓存。

缓存预热:系统上线后,将相关的缓存数据直接加载到缓存系统。这样避免用户请求的时候,再去加载相关的数据。

解决思路  1.直接写个缓存刷新页面,上线是手工操作下

           2.数据量不大,可以再web系统启动的时候加载

           3.定时刷新缓存

缓存更新:缓存淘汰的策略有两种:

(1) 定时去清理过期的缓存。

(2)当有用户请求过来时,再判断这个请求所用到的缓存是否过期,过期的话就去底层系统得到新数据并更新缓存。 

你可能感兴趣的:(2019-11-22 缓存穿透,缓存雪崩,缓存击穿是什么?如何解决?)