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

人物背景
老徐,男,本名徐福贵,从事Java相关研发工作多年,职场老油条,摸鱼小能手,虽然岁数不大但长的比较着急,人称老徐。据说之前炒某币败光了所有家产,甚至现在还有欠债。
阿珍,女,本名陈家珍,刚刚入职不久的实习生,虽然是职场菜鸟但聪明好学。据说是学校的四大校花之一,追求她的人从旺角排到了铜锣湾,不过至今还单身。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Original: https://www.cnblogs.com/heihaozi/p/16065844.html
Author: 万猫学社
Title: 老徐和阿珍的故事:缓存穿透、缓存击穿、缓存雪崩、缓存热点,傻傻分不清楚

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/580938/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 观察者模式与事件处理

    观察者模式简介 观察者模式用于建立对象之间一对多的依赖关系,当一个对象状态发生改变,其他对象得到通知并做出响应。在观察者模式中,我们将状态发生改变的对象称为观察目标,将被通知的对象…

    Java 2023年6月8日
    0105
  • 红黑树以及JAVA实现(一)

    前言 红黑树是一种特殊的B树是B树种2-3-4树的一种特殊实现,红黑树保证了每个节点只会有两个子节点,通过对每个节点进行染色,然后通过不同颜色的节点组合来分别代表2-3-4的2节点…

    Java 2023年6月13日
    094
  • 你的团队工作量饱和吗?

    参与软件开发的相关人员,虽然称为工程技术人员,但本质上其实就是手艺人。手艺嘛肯定是一技之长,里面多少有些门道,外行人做不了, 也很难完全搞清楚其中的门道,合作过程中就怕被坑上当 :…

    Java 2023年6月15日
    0104
  • 干货分享之Spring框架源码解析01-(xml配置解析)

    记录并分享一下本人学习spring源码的过程,有什么问题或者补充会持续更新。欢迎大家指正! 环境: spring5.X + idea Spring 是一个工厂,是一个负责对象的创建…

    Java 2023年6月5日
    097
  • windows11(专业版或以上)开启虚拟机功能

    按照下图操作: 一: 二: 版权木有,侵权不究,欢迎转载 posted @2022-05-23 10:32 article 阅读(284 ) 评论() 编辑 Original: h…

    Java 2023年5月30日
    082
  • Maven基础学习笔记

    Maven基础学习笔记 下载链接 官网:https://maven.apache.org/ 所有版本:https://archive.apache.org/dist/maven/m…

    Java 2023年6月5日
    0103
  • 【java8新特性】01:函数式编程及Lambda入门

    我们首先需要先了解什么是函数式编程、函数式编程是一种结构化编程范式、类似于数学函数、它关注的重点在于数据操作、或者说它所提倡的思想是做什么,而不是如何去做。自Jdk8中开始、它也支…

    Java 2023年6月15日
    072
  • 删除链表结点类问题

    删除链表结点 NO1. 删除链表倒数第 k个结点 给定一个链表,删除链表的倒数第 n 个节点并返回链表的头指针。要求:空间复杂度 (O(1)),时间复杂度 (O(n)) 如果倒数第…

    Java 2023年6月15日
    0103
  • ArrayList 和 LinkedList 的区别是什么?

    说一下 ArrayList 的优缺点 ArrayList的优点如下:ArrayList 底层以数组实现,是一种随机访问模式。ArrayList 实现了RandomAccess 接口…

    Java 2023年6月13日
    077
  • org导出html时图片链接部分会出错(已解决)

    当在org中写入类似下列图片链接的时候,在导出的时候会出错 http://images.cnblogs.com/cnblogs_com/csophys/432523/o_%E7%9…

    Java 2023年6月7日
    073
  • SpringCloud最新组件介绍

    服务注册中心:Eureka:2018年Eureka2.x闭源,不再推荐使用Zookeeper:3年前的系统部分公司用zookeeper+dubbo做微服务,当然zookeeper也…

    Java 2023年5月30日
    0121
  • 使用VSCode编辑MarkDown文件(vditor 所见及所得)

    推荐使用以下两款插件: 特性 所见即所得(WYSIWYG) 自动同步变化之间的vsc编辑器和webview 复制 markdown/html 上传/粘贴/拖放图像时将自动保存到 a…

    Java 2023年5月30日
    0102
  • Kotlin学习快速入门(7)——扩展的妙用

    原文地址: Kotlin学习快速入门(7)——扩展的妙用 – Stars-One的杂货小窝 之前也模模糊糊地在用这个功能,也是十分方便,可以不用继承,快速给某个类增加新…

    Java 2023年6月13日
    0109
  • Chrome的强大搜索功能

    前言 前几天一个好朋友求助我,大概问题是他的电脑QQ啥都能上网,就浏览器上不了网不是IE而是chrome,我第一反应可能是dns问题。后来发甩过来一张图,好家伙把我吓得,类似于下面…

    Java 2023年6月5日
    091
  • 环形链表_141_142

    给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 如果链表中存在环 ,则返回 true 。 …

    Java 2023年6月5日
    083
  • Guava Cache源码浅析

    简介 Guava Cache是指在JVM的内存中缓存数据,相比较于传统的数据库或redis存储,访问内存中的数据会更加高效,无网络开销。 根据Guava官网介绍,下面的这几种情况可…

    Java 2023年6月6日
    063
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球