面试题,Redis 缓存穿透,缓存击穿,缓存雪崩区别

面试题,Redis 缓存穿透,缓存击穿,缓存雪崩区别
最新回答
不堪烟染

2024-03-12 12:22:57

Redis 缓存穿透、缓存击穿、缓存雪崩的区别

一、缓存穿透

  • 定义:缓存穿透是指大量请求的 key 根本不存在于缓存中,也不存在于数据库中。这就导致这些请求在查询缓存中不存在之后,直接查询数据库,导致每次这样的请求都会直接到数据库,缓存并没有起到缓存该有的作用。

  • 解决方案

    缓存无效的 key:如果缓存和数据库都查不到某个 key 的数据,就将其写入 Redis 中并设置过期时间。但这种方式不能从根本上解决问题,特别是面对恶意攻击时。

    布隆过滤器:布隆过滤器是一种高效的数据结构,可以判断一个给定数据是否存在于海量数据中。通过布隆过滤器,可以先判断请求的值是否存在于过滤器中,不存在则直接返回错误信息。

    接口限流:根据用户或 IP 对接口进行限流,对于异常频繁的访问行为,还可以采取黑名单机制。

二、缓存击穿

  • 定义:缓存击穿是指请求的 key 对应的是热点数据,该数据存在于数据库中,但不存在于缓存中(通常是因为缓存中的那份数据已经过期)。这可能会导致瞬时大量的请求直接打到数据库上,对数据库造成巨大的压力。

  • 解决方案

    设置热点数据永不过期或过期时间比较长:这样可以避免热点数据在缓存中过期后被大量请求直接打到数据库上。

    提前预热:将热点数据提前存入缓存中并设置合理的过期时间。

    互斥锁:在请求数据库写数据到缓存之前,先获取互斥锁,保证只有一个请求会落到数据库上,减少数据库的压力。

三、缓存雪崩

  • 定义:缓存雪崩是指缓存在同一时间大面积的失效,导致大量的请求都直接落到了数据库上,对数据库造成了巨大的压力。这可能导致数据库宕机,进而影响整个服务的可用性。

  • 解决方案

    Redis 集群:采用 Redis 集群,避免单机出现问题导致整个缓存服务无法使用。

    限流:避免同时处理大量的请求,保护数据库不被压垮。

    多级缓存:例如本地缓存+Redis 缓存的组合,当 Redis 缓存出现问题时,还可以从本地缓存中获取到部分数据。

    设置不同的失效时间:例如随机设置缓存的失效时间,避免大量缓存同时失效。

    缓存预热:在程序启动后或运行过程中,主动将热点数据加载到缓存中。

总结

  • 缓存穿透:请求的 key 既不存在于缓存中,也不存在于数据库中。解决方案包括缓存无效的 key、布隆过滤器和接口限流。
  • 缓存击穿:请求的 key 对应的是热点数据,该数据存在于数据库中,但不存在于缓存中(通常因为缓存过期)。解决方案包括设置热点数据永不过期或过期时间长、提前预热和互斥锁。
  • 缓存雪崩:缓存在同一时间大面积的失效,导致大量请求直接落到数据库上。解决方案包括 Redis 集群、限流、多级缓存、设置不同的失效时间和缓存预热。

以上内容详细阐述了 Redis 缓存穿透、缓存击穿和缓存雪崩的定义、区别及解决方案,并附带了相关图片以辅助理解。