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

JAVA烂猪皮

共 1418字,需浏览 3分钟

 · 2020-12-20

走过路过不要错过

点击蓝字关注我们

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. 设定超时时间时,应该采用随机算法




往期精彩推荐



腾讯、阿里、滴滴后台面试题汇总总结 — (含答案)

面试:史上最全多线程面试题 !

最新阿里内推Java后端面试题

JVM难学?那是因为你没认真看完这篇文章


END


关注作者微信公众号 —《JAVA烂猪皮》


了解更多java后端架构知识以及最新面试宝典


你点的每个好看,我都认真当成了


看完本文记得给作者点赞+在看哦~~~大家的支持,是作者源源不断出文的动力

浏览 32
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报