当前位置: 首页 > Web前端 > HTML

【Java访谈】如何防止缓存崩溃的问题?

时间:2023-04-02 12:46:15 HTML

"如何防止缓存崩溃?"这是很多一二线厂商在采访中经常被追问的问题。在高并发的系统中,缓存可以提高数据查询的性能,缓解后端存储系统的并发压力。可谓是久经考验的利器。我把这个问题的答案写成一个20W字的面试文档。可以私信我获取。看下面大师的回答。师傅:在实际应用中,我们会在程序和数据库之间加一个缓存层。一方面是为了提高数据检索效率和程序性能,另一方面是为了缓解数据库的并发压力。缓存崩溃是指由于某种原因所有的请求都命中了数据库,缓存没有起到流量缓冲的作用。我认为有两种情况会导致缓存崩溃。Redis中保存的hotkey,当缓存过期时,大量的请求进来,导致所有的请求都命中到数据库上。客户端恶意发起大量不存在的密钥请求。由于访问的key对应的数据不存在,所以每次都必然会渗透到数据库中,导致缓存成为摆设。总之,当Redis承担流量缓冲的功能时,需要考虑Redis故障导致的并发压力过大对后端存储设备的影响。所以我认为它可以通过几种方式解决。对于热点数据,我们不能设置过期时间,也不能在访问数据时更新数据过期时间。对于访问量大的缓存数据,我们可以设计多级缓存,尽量减少对后端存储设备的压力。使用分布式锁,当发现缓存失效时,不先从数据库加载,而是先获取分布式锁,获取分布式锁的线程从数据库中查询数据并写回缓存。后续没有获得锁的线程只需要等待重试即可。这种方案牺牲了一定的性能,但保证了数据库不会被淹没。对于恶意攻击场景,可以使用Bloomfilter,在应用启动时将已有数据缓存在Bloomfilter中。每次有请求进来,先访问布隆过滤器。如果不存在,则说明该数据一定不在数据库中,不需要再次访问数据库。另外,在整个缓存架构的设计中,除了尽可能避免缓存穿透的问题外,我们还需要从全局的角度进行统筹考虑,比如业务隔离、多级缓存、部署隔离等和安全考虑。总结在我看来,很多面试题其实更多的是考察求职者的技术背景和思维边界。有些问题可能没有答案,或者在面试的过程中不能马上想出很好的解决办法。我们只需要谈谈大方向和思路。