13

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

 3 years ago
source link: https://segmentfault.com/a/1190000038461071
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

1.前言

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

2.缓存穿透

2.1什么叫缓存穿透?

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

2.2穿透带来的问题

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

2.3解决方案

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

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

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

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

  • 布隆过滤器

    • 布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个 很长的二进制向量和一系列随机映射函数 。布隆过滤器可以 用于检索一个元素是否在一个集合中 。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。
    • 原理
    • uMV7Zrj.png!mobile
    • 缺点:
    • 由于 hash碰撞问题 ,可能由多个key有相同的位置,所以得出结论,布隆过滤器认为数据存在,那么数据可能存在.如果布隆过滤器认为数据不存在,则数据一定不在.
    • 解决方案
    • 1.扩容二进制向量位数.
    • 2.增加hash函数的个数
    • 当位数增加/函数适当增加,则可以有效的降低hash碰撞的几率. 默认值 0.03

v2QNNzU.png!mobile

  • 缓存空值

    • 这个方案简单粗暴,就是拿到这些不存在数据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. 设定超时时间时,应该采用随机算法

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK