关于java:Redis缓存中缓存穿透缓存击穿缓存雪崩解决方案

38次阅读

共计 1069 个字符,预计需要花费 3 分钟才能阅读完成。

1. 前言

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


2. 缓存穿透

2.1 什么叫缓存穿透?

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

2.2 穿透带来的问题

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

2.3 解决方案

1). 禁用 IP 限度 IP 拜访.
2). 限流 每秒最多拜访 3 次
3). 布隆过滤器 (常见解决方案)
4). 缓存空值(简略粗犷)

  • 布隆过滤器

    • 布隆过滤器(Bloom Filter)是 1970 年由布隆提出的。它实际上是一个 很长的二进制向量和一系列随机映射函数 。布隆过滤器能够 用于检索一个元素是否在一个汇合中。它的长处是空间效率和查问工夫都比个别的算法要好的多,毛病是有肯定的误识别率和删除艰难。
    • 原理
    • 毛病:
    • 因为hash 碰撞问题, 可能由多个 key 有雷同的地位, 所以得出结论, 布隆过滤器认为数据存在, 那么数据可能存在. 如果布隆过滤器认为数据不存在, 则数据肯定不在.
    • 解决方案
    • 1. 扩容二进制向量位数.
    • 2. 减少 hash 函数的个数
    • 当位数减少 / 函数适当减少, 则能够无效的升高 hash 碰撞的几率. 默认值 0.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. 设定超时工夫时, 应该采纳随机算法
正文完
 0