前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。
当下ChatGPT很火,让人心痒痒想试一试好不好用,因此我就试着借它写一篇文章,但是试了几次最终还是没有生成想要的结果,基本上每次都是缓存击穿写了点之后也就没了,也不知道是网络问题还是怎么了。不过本文最终还是由ChatGPT主导生成的文章,我只是做个简单的修饰。
好了,接下来言归正传。
缓存是许多现代Web应用程序的重要组成部分,因为它可以大大提高系统的性能和可靠性。然而,缓存也存在一些潜在的问题,如缓存穿透、缓存击穿和缓存雪崩,这些问题可能导致系统性能下降甚至宕机。因此,对这些问题的理解和解决方案非常重要。面试也会经常问到缓存相关知识,缓存穿透、缓存击穿、缓存雪崩基本也是必问的问题之一。但是我一个QPS不到10系统,问我这些问题,真的让我很为难。。
缓存穿透
缓存穿透(Cache Penetration) 是指大量的无效请求直接到达后端数据库,因为缓存中不存在该数据的缓存。这种情况下,大量的请求将直接影响到数据库的性能,并可能导致数据库崩溃。
解决方案:
-
设置布隆过滤器(Bloom Filter) :使用布隆过滤器可以快速识别无效数据,从而避免直接请求数据库。
简单介绍一下布隆过滤器:
布隆过滤器(Bloom Filter) 是一种基于哈希的快速、高效的数据结构,可以用于判断一个元素是否可能属于某个集合,它可以在极小的空间开销下,实现近似快速查询,但存在一定的误判率。
布隆过滤器的核心思想是:如果一个元素不在集合中,那么它对应的每一个位都不会被置为1,因此查询时只需要检查这些位是否都为1即可确定该元素不在集合中。而如果一个元素在集合中,那么它对应的位可能被其他元素所置为1,因此查询时只能判断该元素可能在集合中,但不能确定其一定在集合中。
-
设置空值缓存:当请求的数据不存在时,可以将一个空值缓存到缓存中,避免重复请求数据库。
-
黑名单机制:对于请求失败次数进行记录,超过一定次数后,将该数据加入黑名单,以后不再请求该数据。
缓存击穿
缓存击穿(Cache Breakdown) 是指在一个热点数据的缓存过期时,大量的请求同时命中数据库,导致数据库压力过大。
解决方案:
-
加锁:在缓存数据过期时可以使用锁机制,避免多个请求同时命中数据库。
-
缓存预热:在缓存数据过期前,可以使用缓存预热的方法将数据提前加载到缓存中,从而避免缓存数据过期时大量请求数据库。
-
热点数据不过期:热点数据过期时间设置为不过期,后台定时去异步刷新缓存。
缓存雪崩
缓存雪崩(Cache Avalanche) 是一种常见的缓存问题,发生在大量缓存数据同时过期时。当大量请求同时命中数据库,数据库压力过大,导致数据库宕机或性能严重下降。
解决方案:
-
缓存失效随机化:通过随机化缓存数据的失效时间,可以避免所有数据同时过期,从而避免缓存雪崩的问题。
-
动态调整缓存失效时间:通过动态调整缓存数据的失效时间,可以根据实际情况调整缓存数据的失效时间,从而避免缓存雪崩的问题。
-
缓存预热:在缓存数据过期前,可以使用缓存预热的方法将数据提前加载到缓存中,从而避免缓存数据过期时大量请求数据库。
-
设置缓存容错:在缓存系统中设置容错机制,在缓存数据过期时可以使用备用数据源,从而避免数据库宕机。
-
缓存集群:使用缓存集群可以将缓存负载分散到多台机器上,从而避免缓存雪崩的问题
总结
最后对缓存穿透、缓存击穿、缓存雪崩做一个总结:
缓存穿透 | 缓存击穿 | 缓存雪崩 | |
---|---|---|---|
原因 | 大量的无效请求直接到达后端数据库 | 一个热点数据的缓存过期时,大量的请求同时命中数据库 | 大量缓存数据同时过期时。当大量请求同时命中数据库 |
解决方案 | 设置布隆过滤器、设置空值缓存、黑名单机制 | 加锁、缓存预热、热点数据不过期 | 缓存失效随机化、动态调整缓存失效时间、缓存预热、设置缓存容错、缓存集群 |