当前位置: 首页 > news >正文

redis之缓存击穿

一、前言

        本期我们聊一下缓存击穿,其实缓存击穿和缓存穿透很相似,区别就是,缓存穿透是一些黑客故意请求压根不存在的数据从而达到拖垮系统的目的,是恶意的,有针对性的。缓存击穿的情况是,数据确实存在,只不过因为某些原因导致缓存中数据消失了,导致请求到达了数据库,从而导致数据库的崩,下面我们看看这个问题是怎么个情况。

二、问题描述

        我们之前也介绍过,缓存和数据库双写一致的事情,一般是如果缓存中不存在的话,就从数据库中再查询一遍,然后将查询到的数据维护到缓存中,等下次请求的时候,就能直接从缓存中获取到了,正常是这么个套路,没毛病。但是我们之前也介绍过,有一些热点数据,在启动的时候就需要加载到缓存中,热点数据的特点就是访问频繁,为了减少数据库压力才放到缓存中,那么如果是热点数据在缓存中失效,那么数据库访问压力就会剧增,情况再糟糕一点,热点数据访问量巨大,那么数据库被拖垮那也是板上钉钉的事情。

        那么热点数据为什么会失效?

        其中一个原因是缓存过期了,热点数据被设置了过期时间,一旦过期,大量请求达到数据库,压垮数据库。

        还有别的原因,缓存搭建了主从结构,主从的数据同步存在延时,导致客户端请求从节点时拿不到数据,或者是主节点使用了rdb备份方式,恰好宕机丢失了一部分数据中包含了热点数据等等,缓存失效的可能原因我们先暂时讨论这么多,这不是我们本次讨论的内容。

三、解决方案

3.1、热点数据设置永不过期

        对于热点数据,如果担心因为缓存过期引起击穿,我们可以尝试不设置过期时间,这样就不用担心因缓存过期导致缓存击穿了。

        不设置过期时间是个好办法,不过我想既然给设置了过期时间,那么说明确实需要设置过期时间,那么在这种情况下,不设置过期时间就不适用了,我们采取另一种方案。

3.2、互斥锁方案

       我们再唠叨一下缓存击穿的特点,大量请求达到数据库导致数据库崩溃。那我们简单分析一下,核心问题是大量请求到达数据库,而且这些请求的都是同一个key的数据。

        基于上述两点可以想想办法:

        首先我们可以基于同一个key进行加锁,保证同一时间只会有一个线程访问数据库。如果某个线程先获取到了锁,先进行一次缓存读取,如果确实没有数据,再去访问数据库,将数据库中的数据加载到缓存中并返回,之后将锁释放。依次往复。为什么要这么做,数据库访问过一次之后,缓存中就会维护好数据,其他的请求当然也没有再访问数据库并维护缓存的必要了。

    @Testpublic void cachePenetrate() throws Exception{int countNumber = 5;CountDownLatch countDownLatch = new CountDownLatch(countNumber);//查询数据for (int i = 0; i < countNumber; i++) {new Thread(()->{Long id = 3L;String cacheKey = "mutualExclusion:"+id;String lockKey = "mutualExclusionLock:"+id;//线程从缓存中获取数据Object valObj = redisTemplate.opsForValue().get(cacheKey);String code = "";if(Objects.isNull(valObj)){code = mutualExclusion(cacheKey,lockKey, id);}else {code = valObj.toString();}System.out.println(Thread.currentThread().getName()+"已获取到值:"+code);countDownLatch.countDown();},"线程"+(i+1)).start();}countDownLatch.await();}/*** 功能描述: 互斥锁解决缓存穿透* @Author:huhy* @Date: 2025/4/10 22:38*/private String mutualExclusion(String cacheKey,String lockKey,Long id){//开启分布式锁RLock lock = redissonClient.getLock(lockKey);try {lock.lock();//在获取锁之后,从缓存中获取一次数据,看看是否已有其他线程写入Object valObj = redisTemplate.opsForValue().get(cacheKey);//如果缓存中有数据,则直接返回if(Objects.nonNull(valObj)){System.out.println("缓存中已有数据,线程【"+Thread.currentThread().getName()+"】未进行数据库查询");return valObj.toString();}System.out.println("缓存中没有数据,线程【"+Thread.currentThread().getName()+"】正在进行数据库查询并设置缓存");TSCodeRule tsCodeRule = codeRuleService.selectTSCodeRuleById(id);//设置过期时间为5秒redisTemplate.opsForValue().set(cacheKey,tsCodeRule.getCodePrefix(),5,TimeUnit.SECONDS);}finally {lock.unlock();}return null;}

       

        测试代码中,设置了5个线程,只有第一个线程进行了数据库查询,后边的线程都读取到了线程1设置好的缓存数据,减少了数据库的访问压力,算是解决了缓存击穿的问题。

        T哥:什么叫算是解决了,那到底解决没啊。

        小永哥:被你发现了,解决是解决了,但是我们设置缓存的初衷是什么?不就是看中它快嘛,热点数据本来访问量就大,放到缓存本来就是为了快速响应的,现在好了,加上了锁,都串行化了,那势必会牺牲掉性能。

        T哥:别卖关子了,我知道你还有招,赶紧的吧........

        小永哥:好的。

3.3、逻辑过期方案

        逻辑过期的意思是:不再设置过期时间,将过期时间与值一起保存到redis中,当应用程序读取到缓存中值的时候,将值中包含的过期时间读取出来进行校验,如果已过期,那么开启新的线程异步去维护缓存数据,而本次还是返回旧数据。这么做的好处是应用程序依旧能保持很高的响应,缺点就是,如果数据库中数据被修改过的话,无法及时返回最新的数据。

        

       

    @Testpublic void logicExpireTest() throws Exception{int countNumber = 50;CountDownLatch countDownLatch = new CountDownLatch(countNumber);//查询数据for (int i = 0; i < countNumber; i++) {new Thread(()->{random = new Random();try {TimeUnit.SECONDS.sleep(random.nextInt(3) + 1);}catch (Exception e){}System.out.println(Thread.currentThread().getName()+"已获取到值:"+getCacheValueByKey(4L));countDownLatch.countDown();},"线程"+(i+1)).start();}countDownLatch.await();}String getCacheValueByKey(Long id){//从缓存中获取值String cacheKey = "logicExpireTest:"+id;String jsonStr = redisTemplate.opsForValue().get(cacheKey).toString();Map<String,String> cacheCodeMap = JSON.parseObject(jsonStr,Map.class);//校验是否已超时long startTime = Long.parseLong(cacheCodeMap.get("startTime"));long expire = Long.parseLong(cacheCodeMap.get("expire"));boolean isExpire = (System.currentTimeMillis() - startTime) > expire;//如果超时,另起线程去维护redisif(isExpire){new Thread(()->{TSCodeRule tsCodeRule = codeRuleService.selectTSCodeRuleById(id);Map<String,String> codeInfoMap = new HashMap<>();codeInfoMap.put("code",tsCodeRule.getCodePrefix());codeInfoMap.put("expire",String.valueOf(3000));codeInfoMap.put("startTime",String.valueOf(System.currentTimeMillis()));redisTemplate.opsForValue().set(cacheKey,JSON.toJSONString(codeInfoMap));}).start();}//始终返回从缓存中读取到的数据return cacheCodeMap.get("code");}

        经过运行测试代码,我们可以看到,有的线程是新值,有的是旧值。

四、结语

        缓存穿透我们讨论了三种解决方式,这两种方式并没有谁比谁更优秀,没有哪种解决方案是完美的,只有适合应用场景的解决方案,在日常应用时需要我们灵活选择。

相关文章:

redis之缓存击穿

一、前言 本期我们聊一下缓存击穿&#xff0c;其实缓存击穿和缓存穿透很相似&#xff0c;区别就是&#xff0c;缓存穿透是一些黑客故意请求压根不存在的数据从而达到拖垮系统的目的&#xff0c;是恶意的&#xff0c;有针对性的。缓存击穿的情况是&#xff0c;数据确实存在&…...

Node.js中path模块详解

Node.js path 模块全部 API 详解 Node.js 的 path 模块提供了处理文件路径的工具函数&#xff0c;支持跨平台路径操作。以下是 path 模块的所有 API 详解&#xff1a; 1. 路径解析与操作 const path require(path);// 1. 路径连接 const fullPath path.join(__dirname, fi…...

重构艺术 | 内联与查询替代临时变量

重构艺术 | 内联与查询替代临时变量 在代码重构的殿堂里&#xff0c;临时变量常常扮演着双面角色&#xff1a;既是代码清晰的助力器&#xff0c;也可能成为代码腐败的温床。本文将深入探讨两种处理临时变量的重要手法&#xff1a;内联临时变量&#xff08;Inline Temp&#xf…...

数据分析-数据预处理

数据分析-数据预处理 处理重复值 duplicated( )查找重复值 import pandas as pd apd.DataFrame(data[[A,19],[B,19],[C,20],[A,19],[C,20]],columns[name,age]) print(a) print(--------------------------) aa.duplicated() print(a)只判断全局不判断每个 any() import p…...

Java基础 4.12

1.方法的重载&#xff08;OverLoad&#xff09; 基本介绍 Java中允许同一个类&#xff0c;多个同名方法的存在&#xff0c;但要求形参列表不一致&#xff01; 如 System.out.println(); out是PrintStream类型 重载的好处 减轻了起名的麻烦减轻了记名的麻烦 2.重载的快速入…...

PostgreSQL有类似oracle的move表吗

PostgreSQL有类似oracle的move表吗 PostgreSQL 提供了类似 Oracle MOVE 表功能的重组操作&#xff0c;但实现方式和具体命令有所不同。以下是详细对比和 PostgreSQL 中的实现方案&#xff1a; 一 Oracle MOVE 与 PostgreSQL 对比 特性Oracle MOVEPostgreSQL 等效操作主要用途…...

AUTO-RAG: AUTONOMOUS RETRIEVAL-AUGMENTED GENERATION FOR LARGE LANGUAGE MODELS

Auto-RAG&#xff1a;用于大型语言模型的自主检索增强生成 单位&#xff1a;中科院计算所 代码&#xff1a; https://github.com/ictnlp/Auto-RAG 拟解决问题&#xff1a;通过手动构建规则或者few-shot prompting产生的额外推理开销。 贡献&#xff1a;提出一种以LLM决策为中…...

ABC-CNN-GRU-Attention、CNN-GRU-Attention、ABC-CNN-GRU和CNN-GRU四类对比模型多变量时序预测

人工蜂群算法四模型对比&#xff01;ABC-CNN-GRU-Attention系列四模型多变量时序预测 目录 人工蜂群算法四模型对比&#xff01;ABC-CNN-GRU-Attention系列四模型多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 本研究针对多变量时间序列预测任务&#xf…...

ssh 免密登录服务器(vscode +ssh 免密登录)

每次打开vscode连接服务器都需要输入密码&#xff0c;特别繁琐。 然后自己在网上翻阅了一下教程&#xff0c;发现说的内容比较啰嗦&#xff0c;而且个人感觉非常有误导性倾向。 因此自己直接干脆写一个简便易懂的教程算了。 &#xff08;以经过本人亲测&#xff0c;真实可靠&am…...

Elasticsearch 系列专题 - 第七篇:实战项目

理论学习固然重要,但实战才能真正巩固知识。本篇将通过两个项目,带你从需求分析到实现,体验 Elasticsearch 在真实场景中的应用。 1. 项目一:日志分析系统 1.1 需求分析与架构设计 需求: 实时采集服务器日志。按时间和日志级别(INFO、ERROR)分析。可视化错误趋势。架构…...

C++初阶-类和对象(上)

本章内容相对于之后的类和对象中和下都比较简单&#xff0c;但是整体还是有些难度的。 目录 1.类的定义 1.1类定义格式 1.2访问限定符 1.3类域 2.实例化 2.1实例化概念 2.2对象大小 3.this指针 4.练习 4.1选择题1 4.2选择题2 5.总结 1.类的定义 1.1类定义格式 &am…...

(十九)安卓开发中的Application类的使用详解

在 Android 开发中&#xff0c;Application 类是一个全局的单例类&#xff0c;代表应用进程本身。它常用于初始化全局资源、维护应用级别的状态和注册全局生命周期回调。以下是详细讲解和代码示例&#xff1a; 一、自定义 Application 类 1. 创建子类 public class MyApplica…...

算法思想之位运算(一)

欢迎拜访&#xff1a;雾里看山-CSDN博客 本篇主题&#xff1a;算法思想之位运算(一) 发布时间&#xff1a;2025.4.12 隶属专栏&#xff1a;算法 目录 滑动窗口算法介绍六大基础位运算符常用模板总结 例题位1的个数题目链接题目描述算法思路代码实现 比特位计数题目链接题目描述…...

十八、TCP多线程、多进程并发服务器

1、TCP多线程并发服务器 服务端&#xff1a; #include<stdio.h> #include <arpa/inet.h> #include<stdlib.h> #include<string.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <pthread.h>…...

『生成内容溯源系统』详解

生成内容溯源系统详解 1. 定义与核心目标 生成内容溯源系统&#xff08;Generative Content Provenance System&#xff09;是指能够追踪AI生成内容的来源、生成过程、版权归属及修改历史的技术体系。其核心目标是&#xff1a; 验证真实性&#xff1a;证明内容由特定AI模型生…...

mac 解压 nsz 文件

nsz 地址 下载 nsz PIP 套餐 使用以下命令安装仅限 Console 的版本&#xff1a; pip3 install --upgrade nsz使用以下命令安装 GUI 版本&#xff1a; pip3 install --upgrade nsz[gui]解压 nsz 文件 nsz -D 文件路径...

Python进阶(3):函数(接上篇)

上一篇我们初步介绍python中函数的定义与调用 Python进阶(2):函数-CSDN博客 这里继续: 关键字参数: 形参1实参1,形参2实参2,...... 关键字参数是指使用形式参数的名字来确定输入的参数值。通过该方式指定实际参数时,不再需要与形式参数的位置完全一致。只要将参数名写正确…...

卒/兵过河前的判断和走法触发器优化

兵(卒)&#xff1a;兵(卒)在未过河前&#xff0c;只能向前一步步走&#xff0c;过河以后&#xff0c;除不能后退外&#xff0c;允许左右移动&#xff0c;但也只能一次一步。 迷你世界地图已上传 优化...

生物信息Rust-01

前言-为什么想学Rust&#xff1f; 一直想多学一门编译语言&#xff0c;主要有几个原因吧&#xff08;1. 看到一位老师实验室要求需要掌握一门编译语言&#xff1b;2. 自己享想试着开发一些实用的生信工具&#xff0c;感觉自己现在相比于数据分析&#xff0c;探索生物学层面的意…...

基于HTML + jQuery + Bootstrap 4实现(Web)地铁票价信息生成系统

地铁票价信息表生成系统 1. 需求分析 1.1 背景 地铁已经成为大多数人出行的首选,北京地铁有多条运营线路, 截至 2019 年 12 月,北京市轨道交通路网运营线路达 23 条、总里程 699.3 公里、车站 405 座。2019 年,北京地铁年乘客量达到 45.3 亿人次,日均客流为 1241.1 万人次…...

智慧水务项目(八)基于Django 5.1 版本PyScada详细安装实战

一、说明 PyScada&#xff0c;一个基于Python和Django框架的开源SCADA&#xff08;数据采集与监视控制系统&#xff09;系统&#xff0c;采用HTML5技术打造人机界面&#xff08;HMI&#xff09;。它兼容多种工业协议&#xff0c;如Modbus TCP/IP、RTU、ASCII等&#xff0c;并具…...

DeepSeek在消防救援领域的应用解决方案

DeepSeek在消防救援领域的应用解决方案 一、火灾风险动态感知与早期预警 火灾风险动态感知与早期预警是智慧消防的关键环节&#xff0c;DeepSeek通过多模态数据分析&#xff0c;融合烟雾传感器、热成像摄像头和气体浓度检测等数据&#xff0c;能够识别传统阈值法难以捕捉的火…...

VSCode CMake调试CPP程序

文章目录 1 安装C与CMake插件2 配置CMakeLists.txt3 使用CMake编译调试3.1 编译3.2 调试 4 自定义构建调试参考 1 安装C与CMake插件 C插件 CMake插件 2 配置CMakeLists.txt 编写测试程序 #include<iostream>int main(int argc, char const *argv[]) {int a 1, b 2;i…...

AI Agent工程师认证-学习笔记(3)——【多Agent】MetaGPT

学习链接&#xff1a;【多Agent】MetaGPT学习教程 源代码链接&#xff08;觉得很好&#xff0c;star一下&#xff09;&#xff1a;GitHub - 基于MetaGPT的多智能体入门与开发教程 MetaGPT链接&#xff1a;GitHub - MetaGPT 前期准备 1、获取MetaGPT &#xff08;1&#xff…...

Spring AI 结构化输出详解

一、Spring AI 结构化输出的定义与核心概念 Spring AI 提供了一种强大的功能&#xff0c;允许开发者将大型语言模型&#xff08;LLM&#xff09;的输出从字符串转换为结构化格式&#xff0c;如 JSON、XML 或 Java 对象。这种结构化输出能力对于依赖可靠解析输出值的下游应用程…...

AMGCL库使用示例

AMGCL库使用示例 AMGCL是一个用于解决大规模稀疏线性方程组的C库&#xff0c;它实现了代数多重网格(AMG)预处理器和Krylov子空间迭代求解器。下面是一些AMGCL的使用示例。 基本示例&#xff1a;求解稀疏线性系统 #include <iostream> #include <vector> #includ…...

关于 Java 预先编译(AOT)技术的详细说明,涵盖 GraalVM 的配置、Spring Boot 3.x 的集成、使用示例及优缺点对比

以下是关于 Java 预先编译&#xff08;AOT&#xff09;技术的详细说明&#xff0c;涵盖 GraalVM 的配置、Spring Boot 3.x 的集成、使用示例及优缺点对比&#xff1a; 1. 预先编译&#xff08;AOT&#xff09;技术详解 1.1 核心概念 AOT&#xff08;Ahead-of-Time&#xff09…...

Video Encoder:多模态大模型如何看懂视频

写在前面 大型语言模型(LLM)已经掌握了理解文本的超能力,而多模态大模型(MLLM)则更进一步,让 AI 拥有了“看懂”图像的眼睛。但这还不够!真实世界是动态的、流动的,充满了运动、变化和声音。视频,正是承载这一切动态信息的关键媒介。 让 LLM 看懂视频,意味着 AI 需…...

leetcode0622. 设计循环队列-medium

1 题目&#xff1a;设计循环队列 官方标定难度&#xff1a;中 设计你的循环队列实现。 循环队列是一种线性数据结构&#xff0c;其操作表现基于 FIFO&#xff08;先进先出&#xff09;原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一…...

专题十四:动态路由——OSPF

一、OSPF简介 开放式最短路径优先OSPF&#xff08;Open Shortest Path First&#xff09;是IETF组织开发的一个基于链路状态的内部网关协议&#xff08;Interior Gateway Protocol&#xff09;&#xff0c;采用DIjkstra算法&#xff0c;协议号是89。用于自治系统&#xff08;A…...

【蓝桥杯】第十六届蓝桥杯 JAVA B组记录

试题 A: 逃离高塔 很简单&#xff0c;签到题&#xff0c;但是需要注意精度&#xff0c;用int会有溢出风险 答案&#xff1a;202 package lanqiao.t1;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWrit…...

一个项目的架构演进

1&#xff0c;单体架构 垂直升级&#xff1a;4核16GB -> 8核64G 水平扩展&#xff1a;一台服务器扩展成多台 存在以下几个问题 1&#xff0c;提升的性能是有限的 2&#xff0c;更新&#xff0c;维护成本非常高&#xff0c;对于系统中要修改或增加的功能&#xff0c;整个发…...

创建虚拟环境无法加载到pycharm当conda环境,只能为python环境

conda create -n myenv python3.8 然后&#xff0c;在pycharm中&#xff0c;点击 ..." 按钮并浏览到您的 Conda 环境路径。通常&#xff0c;Conda 环境路径位于 ~/.conda/envs/<Your Environment Name> 或 ~/miniconda3/envs/<Your Environment Name> 或 ~/an…...

暴雨打造智能化时代源动力

当清晨的智能管家为您调节室温、日间数字员工自动生成会议纪要、深夜AI外教仍在纠正发音……这不是科幻片&#xff0c;2025年的世界正被智能体悄然重塑。这些能听会想的数智化助理&#xff0c;正在医疗会诊、工业质检、金融风控等多个领域创造着价值。 那么&#xff0c;智能体…...

【ROS2】行为树:BehaviorTree

1、简介 与状态机不同,行为树强调执行动作,而不是状态之间的转换。 行为树是可组合的。可以重复使用简单的行为来构建复杂的行为。 在游戏领域,行为树已经比较流行了。主要用于维护游戏角色的各种动作和状态。 ROS2的导航框架Navigation2中引入了行为树来组织机器人的工作流…...

【HTTP】:应用层协议HTTP(1)

1.HTTP协议 虽然我们说,应用层协议是我们程序猿自己定的.但实际上,已经有大佬们定义了一些现成的,又非常好用的应用层协议,供我们直接参考使用.HTTP(超文本传输协议)就是其中之一。 在互联网世界中&#xff0c;HTTP&#xff08;HyperTextTransfer Protocol&#xff0c;超文本…...

Boost Graph Library (BGL) 介绍与使用示例

Boost Graph Library (BGL) 介绍与使用示例 Boost Graph Library (BGL) 是 Boost 库中用于图论计算的模块&#xff0c;提供了处理图数据结构的通用接口和多种图算法实现。 BGL 主要特性 提供多种图表示方式&#xff1a;邻接表、邻接矩阵等包含常用图算法&#xff1a;DFS、BF…...

数据结构--线性表

单链表的基本操作 1.清空单链表 链表仍然存在&#xff0c;但链表中无元素&#xff0c;成为空链表&#xff08;头指针和头链表仍存在&#xff09;算法思路&#xff1a;依次释放所有结点&#xff0c;并将头结点指针设置为空 2.返回表长 3.取值–取单链表中第i个元素 因为存储…...

电商用户购物行为分析:基于K-Means聚类与分类验证的完整流程

随着电商行业的快速发展,用户行为分析成为企业优化营销策略、提升用户体验的重要手段。通过分析用户的购物行为数据,企业可以挖掘出用户群体的消费特征和行为模式,从而制定更加精准的营销策略。本文将详细介绍一个基于Python实现的电商用户购物行为分析系统,涵盖数据预处理…...

《车辆人机工程-汽车驾驶显示装置》实验报告

汽思考题 汽车显示装置有哪些&#xff1f; 汽车显示装置是车辆与驾驶员、乘客交互的重要界面&#xff0c;主要用于信息展示、功能控制和安全辅助。以下是常见的汽车显示装置分类及具体类型&#xff1a; 一、驾驶舱核心显示装置 1. 仪表盘&#xff08;Instrument Cluster&am…...

三维点云投影二维图像的原理及实现

转自个人博客&#xff1a;三维点云投影二维图像的原理及实现 1. 概述 1.1 原理概述 三维点云模型是由深度相机采集深度信息和RGB信息进行生成的&#xff0c;深度相机能直接获取到深度图和二维RGB图像&#xff0c;也就是说利用相机原本的关系就可以把深度信息投影回二维图像&a…...

使用Golang打包jar应用

文章目录 背景Go 的 go:embed 功能介绍与打包 JAR 文件示例1. go:embed 基础介绍基本特性基本语法 2. 嵌入 JAR 文件示例项目结构代码实现 3. 高级用法&#xff1a;嵌入多个文件或目录4. 使用注意事项5. 实际应用场景6. 完整示例&#xff1a;运行嵌入的JAR 背景 想把自己的一个…...

MySQL数据过滤、转换与标准化

数据处理是数据库操作的重要组成部分&#xff0c;尤其是在大量数据中查找、转换和规范化目标信息的过程中。为了确保数据的有效性与一致性&#xff0c;MySQL提供了一系列数据过滤、转换与标准化的功能。 本教程将深入探讨数据过滤和转换的基本方法及应用&#xff0c;内容涵盖数…...

Linux中安装sentinel

拉取镜像 #我默认拉取最新的 sentinel 镜像 docker pull bladex/sentinel-dashboard 创建容器 docker run --name sentinel -d -p 8858:8858 bladex/sentinel-dashboard 检查是否成功 docker ps 浏览器访问 默认账号密码是 sentinel/sentinel 成功了 开放sentinel端口或者关…...

大模型压缩训练(知识蒸馏)

AI的计算结果不是一个数值&#xff0c;而是一个趋势 一、模型压缩简介 1、深度学习&#xff08;Deep Learning&#xff09;因其计算复杂度或参数冗余&#xff0c;在一些场景和设备上限制了相应的模型部署&#xff0c;需要借助模型压缩、优化加速、异构计算等方法突破瓶颈。 …...

Matlab绘制函数方程图形

Matlab绘制函数方程图形&#xff1a; 多项式计算: polyval 函数 Values of Polynomials: polyval ( ) 绘制方程式图形&#xff1a; 代码如下&#xff1a; >> a[9,-5,3,7]; x-2:0.01:5; fpolyval(a,x); plot(x,f,LineWidth,2); xlabel(x); ylabel(f(x))…...

dify windos,linux下载安装部署,提供百度云盘地址

dify下载安装 dify1.0.1 windos安装包百度云盘地址 通过网盘分享的文件&#xff1a;dify-1.0.1.zip 链接: 百度网盘 请输入提取码 提取码: 1234 dify安装包 linux安装包百度云盘地址 通过网盘分享的文件&#xff1a;dify-1.0.1.tar.gz 链接: 百度网盘 请输入提取码 提取码…...

优化方法介绍(一)

优化方法介绍(一) 本博客是一个系列博客,主要是介绍各种优化方法,使用 matlab 实现,包括方法介绍,公式推导和优化过程可视化 1 失败案例介绍 本文在编写最速下降法的时候使用了经典的求解函数框架,并使用了自适应步长(alpha)机制,即加入参数flag,当出现梯度下降的情…...

Centos7.9 升级内核,安装RTX5880驱动

系统镜像下载 https://vault.centos.org/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso 系统安装步骤省略 开始安装显卡驱动 远程登录查看内核 [root192 ~]# uname -a Linux 192.168.119.166 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x8…...

计算轴承|滚动轴承故障频率

一、轴承故障频率概述 在旋转机械故障诊断中&#xff0c;轴承故障频率&#xff08;BPFO、BPFI、BSF、FTF&#xff09;是重要的分析依据。通过计算这些特征频率&#xff0c;可以帮助工程师&#xff1a; 识别轴承故障类型&#xff08;内圈/外圈/滚动体故障&#xff09;制定振动…...