人物背景

老徐,男,本名徐福贵,从事Java相关研发工作多年,职场老油条,摸鱼小能手,虽然岁数不大但长的比较着急,人称老徐。据说之前炒某币败光了所有家产,甚至现在还有欠债。

阿珍,女,本名陈家珍,刚刚入职不久的实习生,虽然是职场菜鸟但聪明好学。据说是学校的四大校花之一,追求她的人从旺角排到了铜锣湾,不过至今还单身。

阿珍:“在高并发下遇到瓶颈的时候,经常会用到缓存来提高整个系统的性能。”

老徐:“嗯,不过缓存能够大大提升整个系统的性能,但同时也引入了更多复杂性。”

阿珍点了点头,说:“是啊,缓存穿透、缓存击穿、缓存雪崩、缓存热点这些东西,这些东西我一直分不清楚,经常混淆。”

老徐立刻自信满满地说:“这个我懂啊,你听我给你娓娓道来。”

缓存穿透

缓存穿透是指在查询缓存数据时,缓存和数据库中都没有对应数据,在缓存中找不到对应的数据,每次都要去数据库中再查询一遍,然后返回数据不存在。

在这个场景中,缓存并没有起到分担数据库访问压力的作用。读取不存在的数据的请求量一般不会太大,但如果出现一些恶意攻击,故意大量访问某些不存在的数据,就会对数据库造成很多压力。

阿珍:“太可怕了,万一遇到了这样攻击,该怎么办呀?”

老徐:“这个很好应对的,一般有两种办法。”

第一个是:如果查询数据库中的数据没有找到,则直接设置一个特定值存到缓存中。之后读取缓存时就会获取到这个特定值,直接返回空值,就不会继续访问数据库了。

第二个是:把已存在数据的key存放在布隆过滤器中。当有新的请求时,先到布隆过滤器中查询是否存在,如果不存在该条数据直接返回;如果存在该条数据再查询缓存查询数据库。

缓存击穿

缓存击穿是指在查询缓存数据时,数据库原本有得数据,但是缓存中没有,生成缓存数据需要耗费较长时间或者大量资源,这时候如果有大量请求该数据,会对数据库甚至系统造成较大压力。

阿珍:“哦?该怎么解决呀?”

老徐:“这个很好解决,一般有两个做法。”

第一个是:对缓存更新操作加入锁的保护,保证只有一个线程能够进行缓存更新的操作,没有获取更新锁的线程要么等待锁释放后重新读取缓存,要么直接返回空值或者默认值。

第二个是:后台作业定时更新缓存,而不是在访问页面时生成缓存数据。这样可以按照一定策略定时更新缓存,不会对存储系统较大的瞬时压力。

缓存雪崩

缓存雪崩是指当大量缓存同时失效或过期后,大量请求直接访问对数据库,甚至耗费较长时间或者大量资源计算缓存结果,引起系统性能的急剧下降。

阿珍抢先说道:“这个我知道怎么解决!”老徐反问:“怎么解决?”

阿珍回答:“同一类型的缓存的过期时间可以设置一个随机值,比如:原来的过期时间是5分钟,在此基础上加060秒,那么过期时间就变为在56分钟内波动,有效防止都在同一个时间点上大量缓存过期。”

缓存热点

缓存热点是指大部分甚至所有的业务请求都命中同一份缓存数据。

虽然缓存本身的性能比较高,但对于一些特别热点的数据,如果大部分甚至所有的请求都命中同一份缓存数据,则这份数据所在的缓存服务器的压力也会很大。比如,电商的爆品秒杀活动,短时间内被上千万的用户访问。

阿珍:“遇到了这种情况,该怎么办呀?”

老徐:“这个很好解决的,一般有两种办法:复制多份缓存副本和本地内存缓存。”

复制多份缓存副本,就是将请求分散到多个缓存服务器上,减轻缓存热点导致的单台缓存服务器压力。在设计缓存副本的时候,有一个细节需要注意:不同的缓存副本不要设置统一的过期时间,否则就会出现所有缓存副本同时生成同时失效的情况,从而引发缓存的雪崩效应。

把热点数据缓存在客户端的本地内存中,并且设置一个失效时间。对于每次读请求,将首先检查该数据是否存在于本地缓存中,如果存在则直接返回,如果不存在再去访问分布式缓存的服务器。

阿珍用崇拜的眼神看着老徐,说:“老徐,你太牛了,什么都懂!”

老徐不好意思地挠了挠头,说:“也没有了。”

最后,谢谢你这么帅,还给我点赞关注

老徐和阿珍的故事:缓存穿透、缓存击穿、缓存雪崩、缓存热点,傻傻分不清楚相关推荐

  1. Redis 缓存穿透、击穿、雪崩现象及解决方案

    前言 如何有效的理解并且区分 Reids 穿透.击穿和雪崩 缓存穿透 关键词:穿过 Redis 和数据库 当 Redis 和数据库中都没有我们想要的数据时,就需要考虑缓存穿透的问题了.下面这段逻辑大家 ...

  2. Redis应用问题解决(缓存穿透、击穿、雪崩、分布式锁)

    Redis应用问题解决(缓存穿透.击穿.雪崩.分布式锁) 缓存穿透 问题描述 当系统中引入redis缓存后,一个请求进来后,会先从redis缓存中查询,缓存有就直接返回,缓存中没有就去db中查询,db ...

  3. Redis缓存穿透、击穿、雪崩

    一.缓存穿透 描述   指访问一个缓存和数据库中都不存在的key,由于这个key在缓存中不存在,则会到数据库中查询,数据库中也不存在该key,无法将数据添加到缓存中,所以每次都会访问数据库导致数据库压 ...

  4. 牛逼,三句话搞懂 Redis 缓存穿透、击穿、雪崩!

    前言 如何有效的理解并且区分 Reids 穿透.击穿和雪崩之间的区别,一直以来都挺困扰我的.特别是穿透和击穿,过一段时间就稀里糊涂的分不清了. 为了有效的帮助笔者自己,以及拥有同样烦恼的朋友们区分这三 ...

  5. Redis基本数据类型、持久化机制、集群模式、淘汰策略、缓存穿透、击穿、雪崩、常见面试题大集合!

    redis redis reids的常用数据类型 1.String 2.Hash 3.List 5.Sorted Set(ZSet) 6.其他 发布(pub)订阅模式(sub)模式 作用 Redis的 ...

  6. redis完整笔记总结-数据类型-事务与锁-集群-分布式锁-常见问题(缓存穿透、击穿、雪崩)

    1. 数据类型 五大基本类型 String hash -> 类似map list set -> zset -> 基于set的有序集合 新增 bitmaps:其实就是string,主要 ...

  7. Redis缓存穿透、击穿、雪崩及主从复制

    文章目录 Redis缓存穿透 概念 解决方案1-布隆过滤器 解决方案2-缓存空对象 缓存击穿 概念 解决方案1-热点数据永不过期 解决方案2-加互斥锁 缓存雪崩 概念 解决方案1-Redis高可用 解 ...

  8. Redis缓存穿透、击穿、雪崩、预热、更新、降级

    Redis是高性能的分布式内存数据库,对于内存数据库经常会出现下面几种情况,也经常会出现在Redis面试题中:缓存穿透.缓存击穿.缓存雪崩.缓存预热.缓存更新.缓存降级.本篇分别介绍这些概念以及对应的 ...

  9. 缓存穿透、击穿、雪崩什么的傻傻分不清楚?看了这篇文后,我明白了

    对于缓存,大家肯定都不陌生,不管是前端还是服务端开发,缓存几乎都是必不可少的优化方式之一.在实际生产环境中,缓存的使用规范也是一直备受重视的,如果使用的不好,很容易就遇到缓存击穿.雪崩等严重异常情景, ...

  10. Redis缓存穿透、击穿、雪崩来解释个明白

    随着用户的增长,用户的请求也越来越频繁,为了保证服务器在高并发的情况能正常提供服务,我们首先引入了缓存Redis,减少数据库的压力和数据的安全性同时提高了接口反应效率,解决了用户的请求直接与数据库建立 ...

最新文章

  1. 关键词热度分析工具_亚马逊卖家: 产品关键词挖掘分析必备工具!
  2. eclipse——jsp字体设置
  3. 数据结构和算法:第七章 排序
  4. Sorm进阶(1):storm实现github提交数监控看板
  5. GPU Gems2 - 2 使用基于GPU几何体裁剪图的地形渲染(Terrain Rendering Using GPU-Based Geometry Clipmaps)
  6. 常量指针与指针常量勘误
  7. 反汇编基础-乘法与除法
  8. python自己创建模块引用失败_详解Python import方法引入模块的实例 Python怎么import自己写的模块...
  9. 戴尔电脑安装win 7
  10. {Java}一个有关类属性初始化的有趣儿情况
  11. nes模拟器java版_JAVA版手机FC/Nes模拟器vN
  12. 雅虎邮箱2022年2月28日起停止中国大陆服务后的收信方法
  13. 必须了解的EXCEL常用函数都有哪些?【附动图详解】数据分析
  14. mysql查询不到的数据补0
  15. LAN9252/3 EtherCAT module
  16. 推荐10款简单好用的免费内网穿透工具
  17. css 侧栏跟随_JS+CSS实现侧边栏跟随浏览器滚动效果
  18. input限制只能输入数字,限制输入数字长度或者大小
  19. HMM隐马尔科夫时间序列预测 Markov马尔科夫时间序列预测(Matlab)
  20. org.eclipse.wst.validation has been removed

热门文章

  1. 抖音小程序有哪些优势
  2. 声纹识别技术简介——化繁为简的艺术
  3. 第十二章 非编码RNA与复杂疾病
  4. java反射机制和运用
  5. scrapy_redis分布式爬虫遇到的问题DEBUG: Filtered offsite request to
  6. 智能DNS之DNS原理与解析
  7. SteamVR自定义手部抓取姿势
  8. 5不触发系统键盘_防盗报警系统基础知识汇总
  9. Java类成员变量的默认值
  10. c++语言常量,C++常量(constant)