怎样防止缓存击穿?

Posted 砖业洋__

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样防止缓存击穿?相关的知识,希望对你有一定的参考价值。

欢迎关注Java面试系列,不定期更新面试小短文。欢迎一键三连!

  实际用里面,我们会在程序和数据库之间增加一个缓存层。一方面呢是为了提数据的检索效率,提升程序的性能,另外一方面,是为了缓解数据库的并发压力。

  缓存击穿表示请求因为某些原因全部打到了数据库,缓存并没有起到流量缓冲的作用。

  有两种情况会导致缓存击穿

  • 1.在redis里面,保存的热点key在缓存过期的瞬间,有大量的请求进来,导致请求全部打到数据库里。
  • 2.客户端恶意发起大量不存在的key的一个请求,由于访问的key对应的数据本身也不存在,所以每一次必然都会穿透到数据库里面,导致缓存成了摆设。

综上,当redis承担了流量缓冲功能的时候,就需要考虑redis失效导致并发压力过大对于后端存储设备造成冲击的问题。

解决方案:

  • 1.对于热点数据的访问,可以不设置过期时间,或者在访问数据的时候对数据的过期时间进行续期。
  • 2.对于访问量较高的缓存数据,可以设计多级缓存,尽量减少后端存储设备的压力。
  • 3.使用分布式锁。当发现缓存失效的时候,不是先从数据库加载数据,而是先去获取分布式锁,获取到分布式锁的线程从数据库查询到数据后写回到缓存里面,后续没有获得锁的线程只需要等待和重试就行,这样就能避免大量请求打到后端存储设备的问题,这个方案虽然牺牲一定的性能,但是确保了数据库的稳定性。
  • 4.对于恶意攻击类的场景,可以使用布隆过滤器,应用程序在启动的时候,把存在的数据缓存到布隆过滤器里,每一次请求进来的时候,先访问布隆过滤器,如果不存在,则说明这个数据一定没有在数据库,则没有必要再去访问数据库。

欢迎一键三连~

有问题请留言,大家一起探讨学习

----------------------Talk is cheap, show me the code-----------------------

以上是关于怎样防止缓存击穿?的主要内容,如果未能解决你的问题,请参考以下文章

怎样防止缓存击穿?

使用Golang的singleflight防止缓存击穿

缓存击穿

Go分布式缓存 防止缓存击穿(day6)

Go分布式缓存 防止缓存击穿(day6)

布隆过滤器实战防止缓存击穿