缓存雪崩、缓存穿透、缓存击穿

缓存雪崩:指在某个时间段内,缓存中的大量数据同时过期失效或者缓存集群挂掉,导致大量请求直接打到数据库上,使得数据库瞬间压力过大,甚至瘫痪的情况。这种情况下,系统的响应时间急剧增加,甚至会出现错误和超时等问题。

解决方法:

  1. 设置不同的缓存过期时间:将缓存设置成不同的过期时间,避免大量数据同时过期失效。

  2. 增加缓存容错能力:对缓存集群进行多机部署,当其中某一台机器发生故障时,其他机器可以顶替其工作,避免整个缓存集群挂掉。

  3. 实时监控缓存状态:定期检查缓存的命中率、使用量等指标,预测可能会出现的问题,并采取相应的措施。

  4. 限流降级:在高并发情况下,可以通过限制请求访问频率、降低服务质量等方式来减轻缓存和数据库的负载压力。

缓存穿透:指恶意攻击者通过构造不存在于缓存和数据库中的数据作为查询条件,从而导致大量请求直接打到数据库上,使得数据库瞬间压力过大,甚至瘫痪的情况。这种情况下,系统的响应时间急剧增加,甚至会出现错误和超时等问题。

解决方法:

  1. 建立布隆过滤器:将所有可能存在的数据哈希到一个足够大的向量空间中,使用多个不同哈希函数对一个查询值进行计算,如果所有的哈希函数值都为true,则说明该值可能存在于缓存或者数据库中;否则则可以直接拒绝请求。

  2. 对查询结果为空的情况进行缓存:由于查询结果为空的情况比较少见,因此可以将这些数据缓存一段时间,避免频繁访问数据库。

  3. 限制用户输入参数:限制用户输入参数的长度、格式等,避免攻击者通过构造特殊的查询参数来绕过缓存。

  4. 实时监控缓存状态:定期检查缓存的命中率、使用量等指标,预测可能会出现的问题,并采取相应的措施。

  5. 使用云服务提供商的防御服务:许多云服务提供商都提供了针对缓存穿透攻击的防御服务,可以使用这些防御服务来保护应用程序。

缓存击穿:当前key是一个热点key(例如一个秒杀活动),并发量非常大,在缓存失效的瞬间,有大量线程来重建缓存,造成后端负载加大,甚至可能会让应用崩溃。

解决方法:

1.分布式互斥锁:只允许一个线程重建缓存

2.永不过期:从缓存层面来看,确实没有设置过期时间,所以不会出现热点key过期后产生的问题,也就是“物理”不过期。
从功能层面来看,为每个value设置一个逻辑过期时间,当发现超过逻辑过期时间后,会使用单独的线程去更新缓

posted @ 2023-05-09 22:51  二二姐  阅读(14)  评论(0编辑  收藏  举报