“怎么避免缓存击穿?”
这是很多一二线大厂面试的时候考查频率较高的问题。
在并发量较高的零碎中,缓存能够晋升数据查问的性能,还能缓解后端存储系统的并发压力。堪称是屡试不爽的利器。
我把这个问题的答复,整顿到了一个 20W 字的面试文档外面。大家能够私信我支付。
上面看看高手的答复。
高手:
在理论利用中,咱们会在程序和数据库之间减少一个缓存层。
一方面是为了晋升数据检索效率,晋升程序性能,另一方面是为了缓解数据库的并发压力。
缓存击穿,示意申请因为某些起因全部打到了数据库,缓存并没有起到流量缓冲的作用。
我认为有 2 种状况会导致缓存击穿。
在 Redis 外面保留的热点 key,在缓存过期的霎时,有大量申请进来,导致申请全部打在数据库上。客户端歹意发动大量不存在的 key 的申请,因为拜访的 key 对应的数据自身就不存在,所以每次必然都会穿透到数据库,导致缓存成为了陈设。
总之,当 Redis 承当了流量缓冲性能的时候,就须要思考到 Redis 生效导致并发压力过大对后端存储设备造成冲击的问题。
因而,我认为能够通过几种办法来解决。
对于热点数据,咱们能够不设置过期工夫,或者在拜访数据的时候对数据过期工夫进行续期。对于访问量较高的缓存数据,咱们能够设计多级缓存,尽量减少后端存储设备的压力。应用分布式锁,当发现缓存生效的时候,不是先从数据库加载,而是先获取分布式锁,取得分布式锁的线程从数据库查问数据后写回到缓存外面。后续没有取得锁的线程就只须要期待和重试即可。这个计划就义了肯定的性能,然而确爱护了数据库防止被压垮。对于歹意攻打类的场景,能够应用布隆过滤器,利用启动的时候把存在的数据缓存到布隆过滤器外面。每一次申请进来的时候先拜访布隆过滤器,如果不存在,则阐明这个数据肯定没有在数据库外面,就没必要再去拜访数据库了。
另外,咱们在整个缓存架构设计中,除了尽可能防止缓存穿透的问题,还须要从全局视角做整体思考
比方业务隔离、多级缓存、部署隔离、安全性思考等。
总结
在我看来,很多面试题,其实更多的是考查求职者的技术底蕴以及思维边界,有些问题不肯定会有答案,或者说在面试的过程中不肯定立即能提出十分好的解决办法咱们只须要说大略的方向和思路即可。