缓存穿透、缓存击穿、缓存雪崩的定义及处理措施

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ren365880/article/details/88594866

1.缓存的流程及作用:

每一个企业级应用都应该在数据不要求必须及时的场景使用缓存,当用户访问某个业务场景时,先从缓存中读取,如果没有缓存或者缓存过期再去数据库读取,然后把数据写入缓存在返回客户端;这样减少了大量的数据库读取次数与压力,提高了系统性能。
在这里插入图片描述


2.缓存穿透:

缓存穿透一般都是人为的恶意访问行为,数据库唯一标识几乎都是自增长ID,攻击者就利用查询不到数据也不缓存或者缓存中根本没有的进行缓存穿透攻击,造成服务器资源浪费,甚至直接拒绝服务。
解决方案:
针对ID为负的访问请求,在程序中直接判断返回为空。
针对ID为正数的数据库没有记录的重复ID请求,在第一次读取数据库后保存value为任意字符的缓存,缓存时间按需设定,避免有数据记录后还是返回缓存内容。
针对ID为正数的数据库没有记录的不重复ID请求,可以配合服务器黑名单屏蔽攻击者IP,或者在系统中设置规则进行拦截。


3.缓存击穿:

在某个业务缓存过期而此时有大量并发访问,会造成数据库瞬间访问压力过大,造成反应过慢,从而形成缓存击穿。
解决方案:
在业务场景中增加互斥锁,首次访问业务的在没有缓存的时候拿到锁读取数据库,然后缓存数据,在释放锁,其他没有拿到锁的也没有缓存的sleep极短的时候然后在调用方法,此时应为在等待的时间中已经重新设这了缓存,所以后续的无需读取数据库。


4.缓存雪崩:

如果系统缓存在同一时间大量过期,导致所有访问的业务场景都去读取数据库,访问量大的系统很容易出现缓存雪崩,如果出现缓存雪崩显现,可能会引起宕机显现,造成无法挽回的损失:
解决方案:
缓存时间随机,避免在同一时间大量缓存失效。
部分数据永不过期,任务系统在晚上定时更新缓存。

猜你喜欢

转载自blog.csdn.net/ren365880/article/details/88594866