数据雪崩和数据穿透、击穿
目录
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;}
数据雪崩和数据穿透、击穿相关推荐
- mysql缓存淘汰机制_Redis缓存总结:淘汰机制、缓存雪崩、数据不一致....
在实际的工作项目中, 缓存成为高并发.高性能架构的关键组件 ,那么Redis为什么可以作为缓存使用呢?首先可以作为缓存的两个主要特征: 在分层系统中处于内存/CPU具有访问性能良好, 缓存数据饱和,有 ...
- redis 查询缓存_Redis缓存总结:淘汰机制、缓存雪崩、数据不一致....
在实际的工作项目中, 缓存成为高并发.高性能架构的关键组件 ,那么Redis为什么可以作为缓存使用呢?首先可以作为缓存的两个主要特征: 在分层系统中处于内存/CPU具有访问性能良好, 缓存数据饱和,有 ...
- 【重难点】【Redis 03】缓存雪崩、缓存穿透、缓存击穿、Redis 的内存过期策略、并发读写和双写
[重难点][Redis 03]缓存雪崩.缓存穿透.缓存击穿.Redis 的内存过期策略.并发读写和双写 文章目录 [重难点][Redis 03]缓存雪崩.缓存穿透.缓存击穿.Redis 的内存过期策略 ...
- Redis 5.0.8+常见面试题(单线程还是多线程、先更新缓存还是数据库、雪崩穿透击穿解决办法...)
Redis 6.0 保姆级教程(含微服务案例与完整面试题):https://www.yuque.com/yuxuandmbjz/redis Redis是单线程还是多线程 ?为什么这么设计 ? Redi ...
- 大厂面试Redis:缓存雪崩、缓存穿透、缓存击穿
欢迎关注这个有趣的灵魂 眼光不错,小伙子,看到这篇文章了就血赚,这篇文章绝对让你学到开心,这是面试的杀器,其实Redis这个东西吧,我个人认为,真的真的很强大,但是呢,又感觉被吹得有点过头了 不过人家 ...
- 缓存 雪崩 穿透 击穿
缓存雪崩 原因:缓存雪崩是并发量过大带来的一系列的雪崩效应.大量的请求涌入缓存导致缓存无法处理挂掉,接着大量的请求会涌入数据库导致数据库挂掉. 分析:处理此问题的关键就是避免并发量大的时候缓存不要挂掉 ...
- Redis - 缓存雪崩,缓存穿透,缓存击穿
Redis是一个完全开源的,遵守BSD协议的,高性能的key-value的数据存储结构系统,它支持数据持久化,可以将内存中的数据保存在磁盘中.不仅支持简单的key-value类型的数据结构,同事还提供 ...
- Redis缓存/穿透/击穿/雪崩
目录 1 缓存穿透 1.1 问题描述 1.2 产生原因 1.3 解决方案 2 缓存击穿 2.1 问题描述 2.2 解决方案 3 缓存雪崩 3.1 问题描述 3.2 解决方案: 1 缓存穿透 1.1 问 ...
- 一文搞懂Redis缓存穿透/击穿/雪崩
缓存穿透 问题描述 缓存穿透是指查询一个一定不存在的数据,由于缓存时不命中的,则需要从数据库中查询.查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库中去查询,进而增大了数据库的压力 ...
最新文章
- mysql导入sql脚本出现there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE
- 一键移植工具_【产品推广】让UI设计畅通无阻 — 信息系统人机界面增强工具(HFE Designer)...
- 为 UITextField 增加键盘偏移的模板化写法
- 没好域名?就得给自己换个名
- java学习教程之代码块
- getView的解析流程
- C++ 函数返回char*
- 11 二叉查找树中搜索区间
- 05-if和switch的简单比较
- BZOJ.1029.[JSOI2007]建筑抢修(贪心)
- vs2005下,回发或回调参数无效的解决方法
- 【Oracle】数据迁移工具(1):SQL Loader
- 最牛逼android上的图表库MpChart(三) 条形图
- 【机器学习系列】变分推断第三讲:基于随机梯度上升法SGD的变分推断解法
- 当《流浪地球》冲过2亿:中国的科幻大片为什么来得这么晚?
- Python100Days学习笔记---Day16-20Python语言进阶
- 对2-9取余的计算方法
- iOS UITextView问题一网打尽(占位文字、汉字输入字数计算、自动高度改变)
- 【vue报错】npm ERR code EJSONPARSE
- 儿科学类毕业论文文献有哪些?