目录

1、数据雪崩

2、数据穿透

3、数据击穿


1、数据雪崩

  • 问题

定时刷新清理缓存中的key时,Redis缓存中大面积key失效,从而导致大量请求直接访问了数据库,导致数据库崩盘。

  • 举个栗子

目前电商首页以及热点数据都会去做缓存,一般缓存都是定时任务去刷新,或者查不到之后去更新缓存的,定时任务刷新就有一个问题。

如果首页所有 Key 的失效时间都是 12 小时,中午 12 点刷新的,我零点有个大促活动大量用户涌入,假设每秒 6000 个请求,本来缓存可以抗住每秒 5000 个请求,但是缓存中所有 Key 都失效了。此时 6000 个/秒的请求全部落在了数据库上,数据库必然扛不住,真实情况可能 DBA 都没反应过来直接挂了。此时,如果没什么特别的方案来处理,DBA 很着急,重启数据库,但是数据库立马又被新流量给打死了。这就是我理解的缓存雪崩。

同一时间大面积失效,瞬间 Redis 跟没有一样,那这个数量级别的请求直接打到数据库几乎是灾难性的。你想想如果挂的是一个用户服务的库,那其他依赖他的库所有接口几乎都会报错。如果没做熔断等策略基本上就是瞬间挂一片的节奏,你怎么重启用户都会把你打挂,等你重启好的时候,用户早睡觉去了,临睡之前,骂骂咧咧“什么垃圾产品”。

  • 解决

对症下药,避免缓存中出现大量key同时失效的情况。

具体来说:

1)设置失效时间。批量往 Redis 存数据的时候,把每个 Key 的失效时间都加个随机值就好了,这样可以保证数据不会再同一时间大面积失效;

setRedis(key, value, time+Math.random()*10000);

2)热点数据均匀分布。如果 Redis 是集群部署,将热点数据均匀分布在不同的 Redis 库中也能避免全部失效。

3)取消设置热点数据有一个失效时间,用更新缓存代替。或者设置热点数据永不过期,有更新操作就更新缓存就好了(比如运维更新了首页商品,那你刷下缓存就好了,不要设置过期时间),电商首页的数据也可以用这个操作,保险。


2、数据穿透

  • 问题

缓存穿透:缓存和数据库中都没有的数据,而用户(黑客)不断发起请求。

  • 例子

我们数据库的 id 都是从 1 自增的,如果发起 id=-1 的数据或者 id 特别大不存在的数据,这样的不断攻击导致数据库压力很大,严重会击垮数据库。

  • 解决

1)增加校验。比如用户鉴权,参数做校验,不合法的校验直接 return,比如 id 做基础校验,id<=0 直接拦截;

2)布隆过滤器。Redis 里还有一个高级用法布隆过滤器(Bloom Filter)这个也能很好的预防缓存穿透的发生。

它的原理也很简单,就是利用高效的数据结构和算法快速判断出你这个 Key 是否在数据库中存在,不存在你 return 就好了,存在你就去查 DB 刷新 KV 再 return。


3、数据击穿

  • 问题

缓存击穿嘛,这个跟缓存雪崩有点像,但是又有一点不一样,缓存雪崩是因为大面积的缓存失效,打崩了 DB。

而缓存击穿不同的是缓存击穿是指一个 Key 非常热点,在不停地扛着大量的请求,大并发集中对这一个点进行访问,当这个 Key 在失效的瞬间,持续的大并发直接落到了数据库上,就在这个 Key 的点上击穿了缓存。

  • 解决

1)设置热点数据永不过期;

2)或者加上互斥锁就搞定了

public static String getData(String key) throws InterruptedException {//从Redis查询数据 String result = getDataByKV(key);//参数校验if (StringUtils.isBlank(result)) {try {//获得锁if (reenLock.tryLock()) {//去数据库查询 result = getDataByDB(key);//校验if (StringUtils.isNotBlank(result)) {//插进缓存 setDataToKV(key, result);}} else {//睡一会再拿Thread.sleep(100L);result = getData(key);}} finally {//释放锁 reenLock.unlock();}}return result;}

数据雪崩和数据穿透、击穿相关推荐

  1. mysql缓存淘汰机制_Redis缓存总结:淘汰机制、缓存雪崩、数据不一致....

    在实际的工作项目中, 缓存成为高并发.高性能架构的关键组件 ,那么Redis为什么可以作为缓存使用呢?首先可以作为缓存的两个主要特征: 在分层系统中处于内存/CPU具有访问性能良好, 缓存数据饱和,有 ...

  2. redis 查询缓存_Redis缓存总结:淘汰机制、缓存雪崩、数据不一致....

    在实际的工作项目中, 缓存成为高并发.高性能架构的关键组件 ,那么Redis为什么可以作为缓存使用呢?首先可以作为缓存的两个主要特征: 在分层系统中处于内存/CPU具有访问性能良好, 缓存数据饱和,有 ...

  3. 【重难点】【Redis 03】缓存雪崩、缓存穿透、缓存击穿、Redis 的内存过期策略、并发读写和双写

    [重难点][Redis 03]缓存雪崩.缓存穿透.缓存击穿.Redis 的内存过期策略.并发读写和双写 文章目录 [重难点][Redis 03]缓存雪崩.缓存穿透.缓存击穿.Redis 的内存过期策略 ...

  4. Redis 5.0.8+常见面试题(单线程还是多线程、先更新缓存还是数据库、雪崩穿透击穿解决办法...)

    Redis 6.0 保姆级教程(含微服务案例与完整面试题):https://www.yuque.com/yuxuandmbjz/redis Redis是单线程还是多线程 ?为什么这么设计 ? Redi ...

  5. 大厂面试Redis:缓存雪崩、缓存穿透、缓存击穿

    欢迎关注这个有趣的灵魂 眼光不错,小伙子,看到这篇文章了就血赚,这篇文章绝对让你学到开心,这是面试的杀器,其实Redis这个东西吧,我个人认为,真的真的很强大,但是呢,又感觉被吹得有点过头了 不过人家 ...

  6. 缓存 雪崩 穿透 击穿

    缓存雪崩 原因:缓存雪崩是并发量过大带来的一系列的雪崩效应.大量的请求涌入缓存导致缓存无法处理挂掉,接着大量的请求会涌入数据库导致数据库挂掉. 分析:处理此问题的关键就是避免并发量大的时候缓存不要挂掉 ...

  7. Redis - 缓存雪崩,缓存穿透,缓存击穿

    Redis是一个完全开源的,遵守BSD协议的,高性能的key-value的数据存储结构系统,它支持数据持久化,可以将内存中的数据保存在磁盘中.不仅支持简单的key-value类型的数据结构,同事还提供 ...

  8. Redis缓存/穿透/击穿/雪崩

    目录 1 缓存穿透 1.1 问题描述 1.2 产生原因 1.3 解决方案 2 缓存击穿 2.1 问题描述 2.2 解决方案 3 缓存雪崩 3.1 问题描述 3.2 解决方案: 1 缓存穿透 1.1 问 ...

  9. 一文搞懂Redis缓存穿透/击穿/雪崩

    缓存穿透 问题描述 缓存穿透是指查询一个一定不存在的数据,由于缓存时不命中的,则需要从数据库中查询.查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库中去查询,进而增大了数据库的压力 ...

最新文章

  1. mysql导入sql脚本出现there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE
  2. 一键移植工具_【产品推广】让UI设计畅通无阻 — 信息系统人机界面增强工具(HFE Designer)...
  3. 为 UITextField 增加键盘偏移的模板化写法
  4. 没好域名?就得给自己换个名
  5. java学习教程之代码块
  6. getView的解析流程
  7. C++ 函数返回char*
  8. 11 二叉查找树中搜索区间
  9. 05-if和switch的简单比较
  10. BZOJ.1029.[JSOI2007]建筑抢修(贪心)
  11. vs2005下,回发或回调参数无效的解决方法
  12. 【Oracle】数据迁移工具(1):SQL Loader
  13. 最牛逼android上的图表库MpChart(三) 条形图
  14. 【机器学习系列】变分推断第三讲:基于随机梯度上升法SGD的变分推断解法
  15. 当《流浪地球》冲过2亿:中国的科幻大片为什么来得这么晚?
  16. Python100Days学习笔记---Day16-20Python语言进阶
  17. 对2-9取余的计算方法
  18. iOS UITextView问题一网打尽(占位文字、汉字输入字数计算、自动高度改变)
  19. 【vue报错】npm ERR code EJSONPARSE
  20. 儿科学类毕业论文文献有哪些?

热门文章

  1. 找对象必须问的几个问题
  2. 实现 RSA 算法之改进和优化(第三章)(老物)
  3. 持续集成(CI)系统
  4. 易拉罐WiFi收集器
  5. flex布局(flex容器,flex属性)
  6. 车速与档位匹配关系_驾考科目三车速和档位如何匹配
  7. javaweb基础搭建及导入包报错Cannot resolve org.codehaus.plexus:plexus-utils:3.0.5
  8. Vue指定日期选择框的值--自动计算过期时间
  9. 从记忆星期浅谈日语学习感想
  10. MQTT消息大小流量消耗测试