1.前言

当我们设计一个Redis缓存服务时,缓存穿透、缓存击穿、缓存雪崩这三大问题我们不得不考虑。同时参见面试时面试官也会常问这三大问题。本章我们来分析一下这三大问题。

2.缓存穿透

2.1什么叫缓存穿透?

  • 正常情况下,查询数据无论在缓存中或者数据库中,都应该有这样的数据。但如果这个数据在缓存和数据库都 不存在 ,那么用户高并发环境下访问 数据库 和 缓存 中都 不存在的数据 称之为缓存穿透现象.

  • Redis缓存中【缓存穿透、缓存击穿、缓存雪崩】解决方案_缓存雪崩

2.2穿透带来的问题

  • 如果有些不怀好意的人,利用这个不存在的数据,频繁大量的访问你的数据库,产生大量的请求,极有可能导致你的数据库异常访问不了、数据库宕掉。

2.3解决方案

1). 禁用IP 限制IP访问.

2). 限流 每秒最多访问3次

3). 布隆过滤器 (常见解决方案)

4). 缓存空值 (简单粗暴)

  • 布隆过滤器

    • 布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个 很长的二进制向量和一系列随机映射函数 。布隆过滤器可以 用于检索一个元素是否在一个集合中 。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。

    • 原理

    • Redis缓存中【缓存穿透、缓存击穿、缓存雪崩】解决方案_缓存击穿_02

    • 缺点:

    • 由于 hash碰撞问题 ,可能由多个key有相同的位置,所以得出结论,布隆过滤器认为数据存在,那么数据可能存在.如果布隆过滤器认为数据不存在,则数据一定不在.

    • 解决方案

    • 1.扩容二进制向量位数.

    • 2.增加hash函数的个数

    • 当位数增加/函数适当增加,则可以有效的降低hash碰撞的几率. 默认值 0.03

Redis缓存中【缓存穿透、缓存击穿、缓存雪崩】解决方案_缓存雪崩_03

  • 缓存空值

    • 这个方案简单粗暴,就是拿到这些不存在数据key,并把value设置成null放到缓存中去,后面再请求这样的数据直接到缓存查询,返回给它null就可以了,切记也要给这些不存在数据的key设置失效时间。

3.缓存击穿

3.1什么叫缓存击穿?

  • 在高并发的环境下,大量请求同时请求同一个key,如果恰巧这个时候key失效了。那么当某个热点数据在缓存中 突然失效 .导致大量的用户直接访问数据库.导致并发压力过高造成异常这个现象被称为 缓存击穿

3.2击穿带来的问题

  • 造成某个时刻所有访问直接打在数据库上,导致数据库压力剧增

3.3解决方案

1.尽可能将热点数据的超时时间 设定的长一点

2.设定多级缓存 超时时间采用随机算法.

4.缓存雪崩

4.1什么叫缓存雪崩?

  • 在缓存服务器中,由于大量的缓存数据失效,导致用户访问的命中率过低.导致直接访问数据库.例如缓存服务宕机,然后大量请求直接访问数据库,极有导致数据库也宕机.

4.2雪崩带来的问题

导致缓存、数据库等一系列服务宕机..

4.3解决方案

  1. 使用集群缓存,保证缓存服务的高可用

  2. 设定超时时间时,应该采用随机算法