老徐和阿珍的故事:缓存穿透、缓存击穿、缓存雪崩、缓存热点,傻傻分不清楚
人物背景:
老徐,男,本名徐福贵,从事Java相关研发工作多年,职场老油条,摸鱼小能手,虽然岁数不大但长的比较着急,人称老徐。据说之前炒某币败光了所有家产,甚至现在还有欠债。
阿珍,女,本名陈家珍,刚刚入职不久的实习生,虽然是职场菜鸟但聪明好学。据说是学校的四大校花之一,追求她的人从旺角排到了铜锣湾,不过至今还单身。
阿珍:“在高并发下遇到瓶颈的时候,经常会用到缓存来提高整个系统的性能。”
老徐:“嗯,不过缓存能够大大提升整个系统的性能,但同时也引入了更多复杂性。”
阿珍点了点头,说:“是啊,缓存穿透、缓存击穿、缓存雪崩、缓存热点这些东西,这些东西我一直分不清楚,经常混淆。”
老徐立刻自信满满地说:“这个我懂啊,你听我给你娓娓道来。”
缓存穿透
缓存穿透是指在查询缓存数据时,缓存和数据库中都没有对应数据,在缓存中找不到对应的数据,每次都要去数据库中再查询一遍,然后返回数据不存在。
在这个场景中,缓存并没有起到分担数据库访问压力的作用。读取不存在的数据的请求量一般不会太大,但如果出现一些恶意攻击,故意大量访问某些不存在的数据,就会对数据库造成很多压力。
阿珍:“太可怕了,万一遇到了这样攻击,该怎么办呀?”
老徐:“这个很好应对的,一般有两种办法。”
第一个是:如果查询数据库中的数据没有找到,则直接设置一个特定值存到缓存中。之后读取缓存时就会获取到这个特定值,直接返回空值,就不会继续访问数据库了。
第二个是:把已存在数据的key存放在布隆过滤器中。当有新的请求时,先到布隆过滤器中查询是否存在,如果不存在该条数据直接返回;如果存在该条数据再查询缓存查询数据库。
缓存击穿
缓存击穿是指在查询缓存数据时,数据库原本有得数据,但是缓存中没有,生成缓存数据需要耗费较长时间或者大量资源,这时候如果有大量请求该数据,会对数据库甚至系统造成较大压力。
阿珍:“哦?该怎么解决呀?”
老徐:“这个很好解决,一般有两个做法。”
第一个是:对缓存更新操作加入锁的保护,保证只有一个线程能够进行缓存更新的操作,没有获取更新锁的线程要么等待锁释放后重新读取缓存,要么直接返回空值或者默认值。
第二个是:后台作业定时更新缓存,而不是在访问页面时生成缓存数据。这样可以按照一定策略定时更新缓存,不会对存储系统较大的瞬时压力。
缓存雪崩
缓存雪崩是指当大量缓存同时失效或过期后,大量请求直接访问对数据库,甚至耗费较长时间或者大量资源计算缓存结果,引起系统性能的急剧下降。
阿珍抢先说道:“这个我知道怎么解决!”老徐反问:“怎么解决?”
阿珍回答:“同一类型的缓存的过期时间可以设置一个随机值,比如:原来的过期时间是5分钟,在此基础上加060秒,那么过期时间就变为在56分钟内波动,有效防止都在同一个时间点上大量缓存过期。”
缓存热点
缓存热点是指大部分甚至所有的业务请求都命中同一份缓存数据。
虽然缓存本身的性能比较高,但对于一些特别热点的数据,如果大部分甚至所有的请求都命中同一份缓存数据,则这份数据所在的缓存服务器的压力也会很大。比如,电商的爆品秒杀活动,短时间内被上千万的用户访问。
阿珍:“遇到了这种情况,该怎么办呀?”
老徐:“这个很好解决的,一般有两种办法:复制多份缓存副本和本地内存缓存。”
复制多份缓存副本,就是将请求分散到多个缓存服务器上,减轻缓存热点导致的单台缓存服务器压力。在设计缓存副本的时候,有一个细节需要注意:不同的缓存副本不要设置统一的过期时间,否则就会出现所有缓存副本同时生成同时失效的情况,从而引发缓存的雪崩效应。
把热点数据缓存在客户端的本地内存中,并且设置一个失效时间。对于每次读请求,将首先检查该数据是否存在于本地缓存中,如果存在则直接返回,如果不存在再去访问分布式缓存的服务器。
阿珍用崇拜的眼神看着老徐,说:“老徐,你太牛了,什么都懂!”
老徐不好意思地挠了挠头,说:“也没有了。”
最后,谢谢你这么帅,还给我点赞和关注。
老徐和阿珍的故事:缓存穿透、缓存击穿、缓存雪崩、缓存热点,傻傻分不清楚相关推荐
- Redis 缓存穿透、击穿、雪崩现象及解决方案
前言 如何有效的理解并且区分 Reids 穿透.击穿和雪崩 缓存穿透 关键词:穿过 Redis 和数据库 当 Redis 和数据库中都没有我们想要的数据时,就需要考虑缓存穿透的问题了.下面这段逻辑大家 ...
- Redis应用问题解决(缓存穿透、击穿、雪崩、分布式锁)
Redis应用问题解决(缓存穿透.击穿.雪崩.分布式锁) 缓存穿透 问题描述 当系统中引入redis缓存后,一个请求进来后,会先从redis缓存中查询,缓存有就直接返回,缓存中没有就去db中查询,db ...
- Redis缓存穿透、击穿、雪崩
一.缓存穿透 描述 指访问一个缓存和数据库中都不存在的key,由于这个key在缓存中不存在,则会到数据库中查询,数据库中也不存在该key,无法将数据添加到缓存中,所以每次都会访问数据库导致数据库压 ...
- 牛逼,三句话搞懂 Redis 缓存穿透、击穿、雪崩!
前言 如何有效的理解并且区分 Reids 穿透.击穿和雪崩之间的区别,一直以来都挺困扰我的.特别是穿透和击穿,过一段时间就稀里糊涂的分不清了. 为了有效的帮助笔者自己,以及拥有同样烦恼的朋友们区分这三 ...
- Redis基本数据类型、持久化机制、集群模式、淘汰策略、缓存穿透、击穿、雪崩、常见面试题大集合!
redis redis reids的常用数据类型 1.String 2.Hash 3.List 5.Sorted Set(ZSet) 6.其他 发布(pub)订阅模式(sub)模式 作用 Redis的 ...
- redis完整笔记总结-数据类型-事务与锁-集群-分布式锁-常见问题(缓存穿透、击穿、雪崩)
1. 数据类型 五大基本类型 String hash -> 类似map list set -> zset -> 基于set的有序集合 新增 bitmaps:其实就是string,主要 ...
- Redis缓存穿透、击穿、雪崩及主从复制
文章目录 Redis缓存穿透 概念 解决方案1-布隆过滤器 解决方案2-缓存空对象 缓存击穿 概念 解决方案1-热点数据永不过期 解决方案2-加互斥锁 缓存雪崩 概念 解决方案1-Redis高可用 解 ...
- Redis缓存穿透、击穿、雪崩、预热、更新、降级
Redis是高性能的分布式内存数据库,对于内存数据库经常会出现下面几种情况,也经常会出现在Redis面试题中:缓存穿透.缓存击穿.缓存雪崩.缓存预热.缓存更新.缓存降级.本篇分别介绍这些概念以及对应的 ...
- 缓存穿透、击穿、雪崩什么的傻傻分不清楚?看了这篇文后,我明白了
对于缓存,大家肯定都不陌生,不管是前端还是服务端开发,缓存几乎都是必不可少的优化方式之一.在实际生产环境中,缓存的使用规范也是一直备受重视的,如果使用的不好,很容易就遇到缓存击穿.雪崩等严重异常情景, ...
- Redis缓存穿透、击穿、雪崩来解释个明白
随着用户的增长,用户的请求也越来越频繁,为了保证服务器在高并发的情况能正常提供服务,我们首先引入了缓存Redis,减少数据库的压力和数据的安全性同时提高了接口反应效率,解决了用户的请求直接与数据库建立 ...
最新文章
- 关键词热度分析工具_亚马逊卖家: 产品关键词挖掘分析必备工具!
- eclipse——jsp字体设置
- 数据结构和算法:第七章 排序
- Sorm进阶(1):storm实现github提交数监控看板
- GPU Gems2 - 2 使用基于GPU几何体裁剪图的地形渲染(Terrain Rendering Using GPU-Based Geometry Clipmaps)
- 常量指针与指针常量勘误
- 反汇编基础-乘法与除法
- python自己创建模块引用失败_详解Python import方法引入模块的实例 Python怎么import自己写的模块...
- 戴尔电脑安装win 7
- {Java}一个有关类属性初始化的有趣儿情况
- nes模拟器java版_JAVA版手机FC/Nes模拟器vN
- 雅虎邮箱2022年2月28日起停止中国大陆服务后的收信方法
- 必须了解的EXCEL常用函数都有哪些?【附动图详解】数据分析
- mysql查询不到的数据补0
- LAN9252/3 EtherCAT module
- 推荐10款简单好用的免费内网穿透工具
- css 侧栏跟随_JS+CSS实现侧边栏跟随浏览器滚动效果
- input限制只能输入数字,限制输入数字长度或者大小
- HMM隐马尔科夫时间序列预测 Markov马尔科夫时间序列预测(Matlab)
- org.eclipse.wst.validation has been removed