缓存击穿、缓存穿透、缓存雪崩

news2024/10/5 17:17:01

初学者总是喜欢自己吓自己,在听到缓存击穿、缓存穿透、缓存雪崩等问题后,就觉得这根本不是自己这个级别所能接触的知识点,甚至不敢下定决心去了解。

然而,缓存击穿、缓存穿透、缓存雪崩等概念只是听着高大上罢了,实则并没有你想想的那么难以理解。


从字面意思上很容易搞混 缓存穿透缓存击穿,这也是面试官喜欢埋坑的点。

缓存击穿缓存雪崩的区别

缓存

缓存:大多数情况下,加缓存的目的是为了:减轻数据库的压力,提高系统性能。

cd


缓存用的好,到来的性能提升是非常明显的。但如果用不好,比如出现下面两种情况,甚至可能造成系统服务器挂机。

  • 用户请求的 key 在缓存中不存在 (有可能时请求的 key 过期了)。

  • 恶意用户伪造不存在的 key 发起请求。


缓存穿透

缓存穿透:缓存 和 数据库中都没有请求查询的数据,每次从缓存中都查不到数据,请求转发到数据库上,同时在数据库中也查询不到该数据,查不到数据则不写入缓存。这就导致每次请求这个不存在的数据时,都要到数据库中查询,缓存根本没有起到作用,好像被穿透了一样。每次都会去访问数据库,这就是我们所说的缓存穿透问题。

cd

缓存穿透带来的问题:

如果穿透了缓存,如果是在洪峰流量下,全部的请求都会转发到数据库中,从而导致数据库压力过大,甚至可能会因为扛不住压力而挂掉。

解决方案:

  • 使用布隆过滤器:如果数据比较少,可以将数据库中的数据,全部放到内存中的一个Map中,这样就可以快速识别数据在缓存中是否存在。如果存在,则请求查询缓存。如果不存在,则直接拒绝该请求。但如果数据量太多了,有数千万或者上亿的数据,全都放到内存中,会占用太多的内存空间。 如何使用少量的内存来达到这种效果呢 ??? - - - > 布隆过滤器(Bloom Filter)就应运而生。

  • 加互斥锁:缓存不存在时,先去获取锁,得到锁后,再去请求数据库。没有得到锁,则休眠一段时间后重试。
    cd

  • 缓存空对象:从缓存和数据库中都查不到数据时,将这个 key 的 value 值设置为 null,并设置较短的过期时间 (设置过期时间太长会导致正常情况也没法使用),一般不超过5分钟,30秒为宜。

    redisTemplate.opsForValue().set(key, null, 30, TimeUnit.SECONDS);
    



缓存击穿

缓存击穿:缓存击穿是指缓存中没有数据 (一般是 key 过期了),但数据库中有该数据。在洪峰流量下,同时查询缓存没有查询到数据,请求全部打到数据库上,导致数据库压力过大,大量请求堆积。

cd

解决方案:

  • 设置热点 key 永不过期

  • 加互斥锁:缓存不存在时,先去获取锁,得到锁后,再去请求数据库。没有得到锁,则休眠一段时间后重试。


缓存雪崩

缓存雪崩:在洪峰流量下,大量 key 集中在一段时间内过期失效,所有查询请求都打到数据库上,造成了缓存雪崩。

  • 与缓存击穿的区别是:缓存击穿是因为一个热点 key 过期失效导致的情况,而缓存雪崩是指缓存中大批量的数据同时过期,巨量请求直接落在数据库中,引起数据库压力过大甚至宕机。

cd

解决方案:

  • 加互斥锁:缓存不存在时,先去获取锁,得到锁后,再去请求数据库查询数据,并写入缓存。没有得到锁,则休眠一段时间后重试。

  • 数据预热:通过缓存 reload 重加载机制,预先更新缓存,再即将发生高并发访问前,手动触发加载缓存不同的 key,设置不同的过期时间,让缓存失效的时间点尽量均匀。

  • 做二级缓存 / 双缓存策略:Cache1为原始缓存,Cache2为拷贝缓存。Cache1失效时可以访问Cache2。Cache1缓存过期时间设置为短期,Cache2设置为长期。

  • 过期时间加随机值:在缓存的时候,给过期时间加上一个随机值,这样就可以大幅度减少缓存在同一时间过期。

    redisTemplate.opsForValue().set(Key, value, time + Math.random() * 1000, TimeUnit.SECONDS)
  • 设置热点 key 永不过期:(热点 key 就是最常被请求查询,且请求数量非常大的 key)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/86884.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RabbitMq应用

1.RabbitMQ介绍 1.1现存问题 服务调用:两个服务调用时,我们可以通过传统的HTTP方式,让服务A直接去调用服务B的接口,但是这种方式是同步的方式,虽然可以采用SpringBoot提供的Async注解实现异步调用,但是这…

Spring之AOP

谈起AOP就不得不说起代理,Java 源代码经过编译生成字节码,然后再由 JVM 经过类加载,连接,初始化成 Java 类型,可以看到字节码是关键,静态和动态的区别就在于字节码生成的时机 静态代理:由程序员…

BLE MESH中的Secure Network beacon包

作用:节点使用安全网络信标来识别子网及其安全状态。可以用来更新Key和Iv Index。 数据包结构: 数据包格式: 大小含义 Beacon Type 1安全网络信标(0x01) Flags1包含密钥刷新标志和IV更新标志 Network ID8包含网络ID的值…

代码随想录算法训练营第四天 | 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II

今天是链表章节最后一天,加油💪 24. 两两交换链表中的节点 题目:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节…

html练习11:案例仿制

1.目标效果 2.布局效果 3.顶端部分制作效果 问题:img和p无法同时垂直居中显示,img会顶端对齐,p会底部对齐 解决方法:把img作为背景加入;用两个div分别做img和p的容器再进行格式调整 4.导航栏部分制作效果 要点&#…

保证项目如期上线,测试人能做些什么?

要保证项目按照正常进度发布,需要整个研发团队齐心协力。 有很多原因都可能会造成项目延期。 1、产品经理频繁修改需求 2、开发团队存在技术难题 3、测试团队测不完 今天我想跟大家聊一下,测试团队如何保证项目按期上线,以及在这个过程中可能…

词法分析程序

一、实验原理 1.1实验内容 通过本实验,应达到以下目标: 1.掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。 2.掌握词法分析的实现方法。 3.上机调试编出的词法分析程序。 1.2实验内容 词法分析是作为相对独立的阶段来完成的…

C# 事件

一 C#中的事件 大致上:事件-----回调函数; 二 用户界面中的事件 ① 按钮点击事件 ② 基本的写法 this.button1.Clicknew System.EventHandler(this.button1_Click); private void button1_Click(object sender,EventHandler e) {this.label1.TextDat…

C++智能指针weak_ptr

C智能指针weak_ptr 学习路线:C智能指针shared_ptr->C智能指针unique_ptr->C智能指针weak_ptr 简介:本文讲解常用的智能指针的用法和原理,包括shared_ptr,unique_ptr,weak_ptr。 概述 weak_ptr设计的目的是为配合 shared_ptr 而引入…

静电场方程与边界面上的衔接条件 工程电磁学 P6

我们现在已经知道两个公式 我们可以得到微分形式 对于体密度,面密度,线密度,点电荷的理解 很多同学会问空间中为什么要有面密度,线密度的存在呢? 其实这个是模型的需要,因为介质不一定是连续的&#xff0…

如何设计一个高性能的图 Schema

本文整理自青藤云安全工程师——文洲在青藤云技术团队内部分享,分享视频参考:https://www.bilibili.com/video/BV1r64y1R72i 图数据库的性能和 schema 的设计息息相关,但是 NebulaGraph 官方本身对图 schema 的设计其实没有一个定论&#xff…

Codeforces Round #837 (Div. 2) C. Hossam and Trainees

Problem - C - Codeforces 翻译: 胡萨姆有𝑛名学员。他给𝑖-th的学员分配了一个号码𝑎𝑖。 一双𝑖-th和𝑗-th(𝑖≠𝑗)学员被称为成功的如果有一个整数𝑥(&…

基于springboot的企业员工工资管理系统(财务系统)

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

Vue渲染器(二):挂载与更新

渲染器(二):挂载与更新 前面介绍了渲染器的基本概念和整体框架,接下来就可以介绍渲染器的核心功能:挂载与更新。 1.挂载子节点和元素的属性: vnode.children的值为字符串类型时,会把它设置为…

019 | 在线电影娱乐网站系统设计含论文 | 大学生毕业设计 | 极致技术工厂

作为一个在线电影娱乐网站系统,它展示给浏览者的是各种电影信息,把这些信息能够按用户的需要友好的展示出来是很重要的,同时,能够实现对这些信息的有条不紊的管理也是不可以忽视的。对浏览者和会员的功能而言叫做前台实现&#xf…

[附源码]Node.js计算机毕业设计电子购物商城Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

[附源码]计算机毕业设计电商小程序Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis MavenVue等等组成,B/S模式…

【GRU时序预测】基于卷积神经网络结合门控循环单元CNN-GRU实现时间序列预测附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

代码随想录训练营第49天|LeetCode 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II

参考 代码随想录 题目一&#xff1a;LeetCode 121. 买卖股票的最佳时机 注意这个题只买卖一次&#xff01;&#xff01; 贪心 class Solution { public:int maxProfit(vector<int>& prices) {int low INT_MAX;int result 0;for(int i 0; i < prices.size(…

Redis框架(十):大众点评项目 订单功能 Redis实现全局唯一ID、 秒杀基本环境

大众点评项目 订单功能 秒杀基本环境需求&#xff1a;订单功能 秒杀基本环境Redis实现全局唯一ID业务实现代码总览总结SpringCloud章节复习已经过去&#xff0c;新的章节Redis开始了&#xff0c;这个章节中将会回顾Redis实战项目 大众点评 主要依照以下几个原则 基础实战的Dem…