Redis 中的缓存击穿、缓存穿透和缓存雪崩是什么?

发布于:2025-05-23 ⋅ 阅读:(12) ⋅ 点赞:(0)

在 Redis 中,缓存击穿、缓存穿透和缓存雪崩是常见的缓存问题,它们都会影响系统的性能和稳定性。以下是针对这三个问题的详细解释:

一、缓存击穿(Cache Breakdown)

定义:缓存击穿是指某个热点数据在缓存中过期或不存在,而此时有大量并发请求同时访问该数据。由于缓存中没有该数据,所有请求都会直接落到数据库上,导致数据库压力骤增,甚至可能引发数据库宕机。

特点

  • 并发性:大量并发请求同时访问同一个热点数据。
  • 数据热点:被访问的数据是热点数据,即经常被访问的数据。
  • 缓存失效:缓存中的数据恰好过期或不存在。

解决方案

  • 互斥锁:在访问数据库之前,先获取一个互斥锁。如果获取成功,则访问数据库并更新缓存;如果获取失败,则等待一段时间后重试。这样可以确保同一时间只有一个请求能够访问数据库,避免并发请求对数据库造成过大压力。
  • 永不过期:为热点数据设置一个较长的过期时间或根本不设置过期时间,从而避免缓存过期导致的问题。但这种方法可能会占用较多的缓存空间,且当数据需要更新时,需要手动或通过其他机制来更新缓存。
  • 逻辑过期:在缓存中设置数据的逻辑过期时间,而不是实际的过期时间。当访问数据时,先检查逻辑过期时间,如果已过期,则异步更新缓存,同时返回旧数据给客户端。这样可以减少对数据库的直接访问。

二、缓存穿透(Cache Penetration)

定义:缓存穿透是指查询一个在缓存和数据库中都不存在的数据。由于缓存中没有该数据,所有请求都会直接落到数据库上,导致数据库压力骤增。与缓存击穿不同的是,缓存穿透通常是由恶意攻击或程序错误导致的,攻击者可能故意查询不存在的数据来耗尽数据库资源。

特点

  • 数据不存在:查询的数据在缓存和数据库中都不存在。
  • 大量请求:大量并发请求同时查询不存在的数据。
  • 恶意攻击:可能是由恶意攻击或程序错误导致的。

解决方案

  • 缓存空值:当查询一个不存在的数据时,将该空值也缓存起来,并设置一个较短的过期时间。这样,在过期时间内再次查询该数据时,就可以直接从缓存中返回空值,而不需要访问数据库。
  • 布隆过滤器:使用布隆过滤器来过滤掉不存在的数据请求。布隆过滤器是一种空间效率极高的概率型数据结构,可以判断一个元素是否存在于集合中。虽然存在一定的误判率,但可以通过调整参数来降低误判率。
  • 接口校验:在访问数据库之前,先对请求进行校验,过滤掉明显不合法的请求。

三、缓存雪崩(Cache Avalanche)

定义:缓存雪崩是指大量缓存数据在同一时间过期或缓存服务器宕机,导致大量请求直接落到数据库上,造成数据库压力骤增甚至宕机。缓存雪崩通常是由于缓存数据的过期时间设置过于集中或缓存服务器故障导致的。

特点

  • 大量数据过期:大量缓存数据在同一时间过期。
  • 缓存服务器故障:缓存服务器宕机或不可用。
  • 请求激增:大量请求直接落到数据库上,导致数据库压力骤增。

解决方案

  • 过期时间分散:为缓存数据设置不同的过期时间,避免大量数据在同一时间过期。可以使用随机数或哈希算法来分散过期时间。
  • 高可用缓存集群:搭建高可用的缓存集群,确保缓存服务器的高可用性。可以使用 Redis Sentinel 或 Redis Cluster 等技术来实现。
  • 限流与降级:在缓存服务不可用时,通过限流和降级策略来减少对数据库的冲击。例如,可以限制访问数据库的并发数,或者返回预设的降级数据。
  • 多级缓存:引入多级缓存机制,如本地缓存(如 Ehcache)与分布式缓存(如 Redis)相结合,提高缓存的可用性和响应速度。

总结

  • 缓存击穿:针对热点数据缓存过期或不存在时,大量请求直接访问数据库。解决方案包括互斥锁、永不过期、逻辑过期等。
  • 缓存穿透:查询不存在的数据,导致大量请求直接访问数据库。解决方案包括缓存空值、布隆过滤器、接口校验等。
  • 缓存雪崩:大量缓存数据过期或缓存服务器故障,导致大量请求直接落到数据库上。解决方案包括过期时间分散、高可用缓存集群、限流与降级等。

在实际应用中,应根据具体情况选择合适的解决方案,并结合监控和告警机制,及时发现并处理缓存问题,确保系统的稳定性和性能。

我正在程序员刷题神器面试鸭上高效准备面试,9000+ 高频面试真题、800 万字优质题解,覆盖主流编程方向,跟我一起刷原题、过面试:
点击进入


网站公告

今日签到

点亮在社区的每一天
去签到