Spring Boot项目@Cacheable注解的使用
@Cacheable
是 Spring 框架中用于缓存的注解之一,它可以帮助你轻松地将方法的结果缓存起来,从而提高应用的性能。下面详细介绍如何使用 @Cacheable
注解以及相关的配置和注意事项。
1. 基本用法
1.1 添加依赖
首先,确保你的项目中包含了 Spring Cache 的依赖。如果你使用的是 Spring Boot,可以在 pom.xml
或 build.gradle
中添加以下依赖:
Maven:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>
Gradle:
implementation 'org.springframework.boot:spring-boot-starter-cache'
1.2 启用缓存
在你的 Spring Boot 应用的主类或配置类上添加 @EnableCaching
注解,以启用缓存功能。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;@SpringBootApplication
@EnableCaching
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
1.3 使用 @Cacheable
注解
假设你有一个服务类 DataService
,其中有一个方法 getSortedData
需要缓存其结果。你可以使用 @Cacheable
注解来实现这一点。
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;@Service
public class DataService {@Cacheable("sortedData")public TableDataInfo getSortedData(String param) {// 模拟耗时操作try {Thread.sleep(2000);} catch (InterruptedException e) {Thread.currentThread().interrupt();}// 返回模拟数据return new TableDataInfo();}
}
解释:
@Cacheable("sortedData")
: 这个注解告诉 Spring 在调用getSortedData
方法时,先检查名为sortedData
的缓存中是否存在与参数param
对应的结果。- 如果存在,则直接返回缓存中的结果,不再执行方法体。
- 如果不存在,则执行方法体,将结果存入缓存中,并返回结果。
1.4 自定义缓存键
默认情况下,Spring 使用方法参数作为缓存键。如果你需要自定义缓存键,可以使用 key
属性。
@Cacheable(value = "sortedData", key = "#param")
public TableDataInfo getSortedData(String param) {// 方法体
}
解释:
key = "#param"
: 使用方法参数param
作为缓存键。
你还可以使用 SpEL(Spring Expression Language)来构建更复杂的缓存键。
@Cacheable(value = "sortedData", key = "#param + '_' + #anotherParam")
public TableDataInfo getSortedData(String param, String anotherParam) {// 方法体
}
2. 配置缓存管理器
Spring 支持多种缓存实现,如 Caffeine、Ehcache、Redis 等。下面分别介绍如何配置这些缓存管理器。
2.1 使用 Caffeine 作为缓存实现
-
添加依赖:
<dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId> </dependency>
-
配置 Caffeine:
你可以在
application.yml
或application.properties
中配置 Caffeine 的缓存参数。application.yml:
spring:cache:type: caffeinecaffeine:spec: maximumSize=1000,expireAfterAccess=60s
application.properties:
spring.cache.type=caffeine spring.cache.caffeine.spec=maximumSize=1000,expireAfterAccess=60s
maximumSize=1000
: 设置缓存的最大条目数为 1000。expireAfterAccess=60s
: 设置缓存条目在最后一次访问后的过期时间为 60 秒。
2.2 使用 Ehcache 作为缓存实现
-
添加依赖:
<dependency><groupId>org.ehcache</groupId><artifactId>ehcache</artifactId> </dependency>
-
配置 Ehcache:
创建一个
ehcache.xml
文件,并在其中定义缓存配置。ehcache.xml:
<config xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'xmlns='http://www.ehcache.org/v3'xsi:schemaLocation="http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core.xsd"><cache alias="sortedData"><key-type>java.lang.String</key-type><value-type>com.ruoyi.common.core.page.TableDataInfo</value-type><resources><heap unit="entries">1000</heap><offheap unit="MB">100</offheap></resources></cache> </config>
<heap unit="entries">1000</heap>
: 设置堆内存中缓存的最大条目数为 1000。<offheap unit="MB">100</offheap>
: 设置堆外内存中缓存的最大大小为 100MB。
-
配置 Spring 使用 Ehcache:
在
application.yml
或application.properties
中指定 Ehcache 配置文件的位置。application.yml:
spring:cache:type: ehcacheehcache:config: classpath:ehcache.xml
application.properties:
spring.cache.type=ehcache spring.cache.ehcache.config=classpath:ehcache.xml
2.3 使用 Redis 作为缓存实现
-
添加依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
-
配置 Redis:
在
application.yml
或application.properties
中配置 Redis 连接信息。application.yml:
spring:cache:type: redisredis:host: localhostport: 6379
application.properties:
spring.cache.type=redis spring.redis.host=localhost spring.redis.port=6379
-
可选配置:
你可以进一步配置 Redis 的缓存行为,例如设置最大内存大小和淘汰策略。
application.yml:
spring:redis:lettuce:pool:max-active: 20max-idle: 10min-idle: 5timeout: 5000ms
3. 其他相关注解
除了 @Cacheable
,Spring 还提供了其他几个注解来管理缓存:
3.1 @CachePut
@CachePut
注解用于更新缓存中的值,但不会影响方法的执行。每次调用带有 @CachePut
注解的方法时,都会执行方法体并将结果存入缓存。
@CachePut(value = "sortedData", key = "#param")
public TableDataInfo updateSortedData(String param) {// 更新逻辑return new TableDataInfo();
}
3.2 @CacheEvict
@CacheEvict
注解用于从缓存中移除一个或多个条目。适用于需要清除缓存的情况。
@CacheEvict(value = "sortedData", key = "#param")
public void deleteSortedData(String param) {// 删除逻辑
}// 清除整个缓存
@CacheEvict(value = "sortedData", allEntries = true)
public void clearAllSortedData() {// 清除所有缓存
}
3.3 @Caching
@Caching
注解允许你在同一个方法上组合多个缓存操作。
@Caching(put = {@CachePut(value = "sortedData", key = "#param"),@CachePut(value = "anotherCache", key = "#param")},evict = {@CacheEvict(value = "oldCache", key = "#param")}
)
public TableDataInfo updateAndEvict(String param) {// 更新逻辑return new TableDataInfo();
}
4. 示例代码
下面是一个完整的示例,展示了如何使用 @Cacheable
注解以及配置 Caffeine 缓存。
4.1 项目结构
src
├── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ ├── Application.java
│ │ ├── config
│ │ │ └── CacheConfig.java
│ │ ├── service
│ │ │ └── DataService.java
│ │ └── model
│ │ └── TableDataInfo.java
│ └── resources
│ └── application.yml
4.2 Application.java
package com.example;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;@SpringBootApplication
@EnableCaching
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
4.3 CacheConfig.java
package com.example.config;import com.github.benmanes.caffeine.cache.Caffeine;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.caffeine.CaffeineCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.concurrent.TimeUnit;@Configuration
@EnableCaching
public class CacheConfig {@Beanpublic CacheManager cacheManager() {CaffeineCacheManager cacheManager = new CaffeineCacheManager("sortedData");cacheManager.setCaffeine(caffeineCacheBuilder());return cacheManager;}Caffeine<Object, Object> caffeineCacheBuilder() {return Caffeine.newBuilder().expireAfterWrite(60, TimeUnit.SECONDS).maximumSize(1000);}
}
4.4 DataService.java
package com.example.service;import com.example.model.TableDataInfo;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;@Service
public class DataService {@Cacheable("sortedData")public TableDataInfo getSortedData(String param) {// 模拟耗时操作try {Thread.sleep(2000);} catch (InterruptedException e) {Thread.currentThread().interrupt();}// 返回模拟数据return new TableDataInfo();}
}
4.5 TableDataInfo.java
package com.example.model;public class TableDataInfo {// 模拟数据模型
}
4.6 application.yml
spring:cache:type: caffeine
5. 注意事项
-
缓存一致性:
- 确保在更新数据时正确使用
@CachePut
和@CacheEvict
注解,以保持缓存的一致性。 - 对于分布式系统,考虑使用支持分布式缓存的实现(如 Redis)。
- 确保在更新数据时正确使用
-
缓存失效策略:
- 根据业务需求选择合适的缓存失效策略(如基于时间、基于条件等)。
- 定期清理过期或不必要的缓存条目,以避免内存泄漏。
-
缓存击穿和穿透:
- 缓存击穿: 当缓存失效后,大量请求同时涌入数据库,导致数据库压力骤增。
- 解决方案: 可以使用互斥锁(如 Redis 分布式锁)来防止缓存击穿。
- 缓存穿透: 当查询一个不存在的数据时,所有请求都直接打到数据库。
- 解决方案: 可以在缓存中存储一个空对象或特殊标记,表示该数据不存在。
- 缓存击穿: 当缓存失效后,大量请求同时涌入数据库,导致数据库压力骤增。
-
缓存雪崩:
- 当大量缓存同时失效时,大量请求直接打到数据库,导致数据库压力骤增。
- 解决方案: 可以设置不同的过期时间,避免缓存同时失效。
6. 调试和监控
为了更好地管理和调试缓存,可以使用以下工具和方法:
- 日志记录: 在方法上添加日志记录,查看缓存的命中率和缓存操作的频率。
- 监控工具: 使用监控工具(如 Prometheus、Grafana)来监控缓存的性能指标。
- Spring Boot Actuator: 提供了缓存相关的端点,可以方便地查看缓存的状态和统计信息。
启用 Spring Boot Actuator:
-
添加依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId> </dependency>
-
配置暴露端点:
application.yml:
management:endpoints:web:exposure:include: "caches"
-
访问缓存端点:
访问
http://localhost:8080/actuator/caches
可以查看缓存的状态信息。
总结
通过使用 @Cacheable
注解,可以轻松地在 Spring 应用中实现缓存机制,从而提高应用的性能和响应速度。结合不同的缓存实现(如 Caffeine、Ehcache、Redis),你可以根据具体需求灵活配置缓存策略,确保缓存的有效性和高效性。
相关文章:
Spring Boot项目@Cacheable注解的使用
Cacheable 是 Spring 框架中用于缓存的注解之一,它可以帮助你轻松地将方法的结果缓存起来,从而提高应用的性能。下面详细介绍如何使用 Cacheable 注解以及相关的配置和注意事项。 1. 基本用法 1.1 添加依赖 首先,确保你的项目中包含了 Spr…...
飞书API
extend目录下,API <?php // ---------------------------------------------------------------------- // | 飞书API // ---------------------------------------------------------------------- // | COPYRIGHT (C) 2021 http://www.jeoshi.com All rights reserved. …...
杨校老师课堂之信息学奥赛结构体操作使用经典题集锦汇总
C基础:结构体数组综合训练 员工信息处理系统题目描述输入描述输出描述解题思路参考代码 员工信息处理系统 题目描述 在一家企业中,员工信息的准确性和时效性是日常人事管理工作的关键。由于企业员工数量众多,手动统计与更新员工信息不仅耗费大量时间&a…...
交互编程工具之——Jupyter
Jupyter 是什么? Jupyter 是一个开源的交互式编程和数据分析工具,广泛应用于数据科学、机器学习、教育和研究领域。其核心是 Jupyter Notebook(现升级为 JupyterLab),允许用户在一个基于浏览器的界面中编写代码、运行…...
Redis常见问题排查
redis连接不上去,ERR max number of clients reached redis默认最大连接是10000,如果出现连接泄露或者被服务器被攻击可能会出现连接数超过限制。 Redis 的 INFO 命令可以提供服务器的统计信息,其中包括当前客户端连接数。这是获取连接数最…...
Hadoop初体验
一、HDFS初体验 1. shell命令操作 hadoop fs -mkdir /itcast hadoop fs -put zookeeper.out /itcast hadoop fs -ls / 2. Web UI页面操作 结论: HDFS本质就是一个文件系统有目录树结构 和Linux类似,分文件、文件夹为什么上传一个小文件也这…...
深入解析C++26 Execution Domain:设计原理与实战应用
一、Domain设计目标与核心价值 Domain是C26执行模型的策略载体,其核心解决两个问题: 执行策略泛化:将线程池、CUDA流等异构调度逻辑抽象为统一接口策略组合安全:通过类型隔离避免不同执行域的策略污染 // Domain类型定义示例&a…...
基于Flask的租房信息可视化系统的设计与实现
【Flask】基于Flask的租房信息可视化系统的设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 随着互联网的快速发展,租房市场日益繁荣,信息量急剧增加ÿ…...
TensorFlow v2.16 Overview
TensorFlow v2.16 Overview 一、模块 Modules二、类 Classes三、函数 Functions TensorFlow v2.16.1 Overview 一、模块 Modules 模块是TensorFlow中组织代码的一种方式,将相关的功能和类封装在一起,方便用户使用和管理。每个模块都提供了特定领域的公共…...
网页版的俄罗斯方块
1、新建一个txt文件 2、打开后将代码复制进去保存 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>俄…...
Vue3 状态管理 - Pinia
目录 1. 什么是Pinia 2. 手动添加Pinia到Vue项目 3. Pinia的基础使用 4. getters实现 5. action异步实现 6. storeToRefs工具函数 7. Pinia的调试 8. Pinia的持久化插件 1. 什么是Pinia Pinia 是 Vue 专属的最新状态管理库 ,是 Vuex 状态管理工具的替代品 …...
Arduino 第十六章:pir红外人体传感器练习
Arduino 第十六章:PIR 传感器练习 一、引言 在 Arduino 的众多有趣项目中,传感器的应用是非常重要的一部分。今天我们要学习的主角是 PIR(被动红外)传感器。PIR 传感器能够检测人体发出的红外线,常用于安防系统、自动…...
伯克利 CS61A 课堂笔记 10 —— Trees
本系列为加州伯克利大学著名 Python 基础课程 CS61A 的课堂笔记整理,全英文内容,文末附词汇解释。 目录 01 Trees 树 Ⅰ Tree Abstraction Ⅱ Implementing the Tree Abstraction 02 Tree Processing 建树过程 Ⅰ Fibonacci tree Ⅱ Tree Process…...
Springboot 高频面试题
以下是Spring Boot的高频面试题及答案和底层原理解释: 基础概念 什么是Spring Boot,其主要特点是什么? 答案: Spring Boot本质上是一个建立在Spring框架之上的快速应用开发框架。其主要特点包括: 启动器:一…...
从零开始玩转TensorFlow:小明的机器学习故事 2
你好,TensorFlow!——从零开始的第一个机器学习程序 1. 为什么要写这个“Hello, TensorFlow!”? 无论学习什么新语言或新框架,“Hello World!”示例都能帮助我们快速确认开发环境是否就绪,并掌握最基本的使用方式。对…...
第四届图像、信号处理与模式识别国际学术会议(ISPP 2025)
重要信息 会议官网:www.icispp.com 会议时间:2025年3月28-30日 会议地点:南京 简介 由河海大学和江苏大学联合主办的第四届图像、信号处理与模式识别国际学术会议(ISPP 2025) 将于2025年3月28日-30日在中国南京举行。会议主…...
阿里云通过docker安装skywalking及elasticsearch操作流程
系统 本文使用系统为 Alibaba Cloud Linux 3.2104 LTS 64位 配置为 4核8G PS:最低配置应为2核4G,配置过低无法启动 安装docker 1.卸载旧版本docker yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-…...
Linux·spin_lock的使用
自旋锁 内核当发生访问资源冲突的时候,可以有两种锁的解决方案选择: 一个是原地等待一个是挂起当前进程,调度其他进程执行(睡眠) Spinlock 是内核中提供的一种比较常见的锁机制,自旋锁是“原地等待”的方…...
企业内部真题
文章目录 前端面试题:一个是铺平的数组改成树的结构问题一解析一问题一解析二前端面试题:for循环100个接口,每次只调3个方法一:使用 `async/await` 和 `Promise`代码解释(1):代码解释(2):1. `fetchApi` 函数2. `concurrentFetch` 函数3. 生成 100 个接口地址4. 每次并…...
MySQL基本操作——包含增删查改(环境为Ubuntu20.04,MySQL5.7.42)
1.库的操作 1.1 创建数据库 语法: 说明: 大写的表示关键字 [] 是可选项 CHARACTER SET: 指定数据库采用的字符集 COLLATE: 指定数据库字符集的校验规则 1.2 创建案例 创建一个使用utf8字符集的db1数据库 create database db1 charsetutf8; …...
程序代码篇---Python指明函数参数类型
文章目录 前言简介一、函数参数的类型指定1. 基本类型提示2. 默认参数3. 可变参数4. 联合类型(Union)5. 可选类型(Optional)6. 复杂类型 二、返回值的类型指定1. 基本返回类型2. 无返回值(None)3. 返回多个…...
AIGC视频扩散模型新星:SVD——稳定扩散的Video模型
大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细介绍慕尼黑大学携手 NVIDIA 等共同推出视频生成模型 Video LDMs。NVIDIA 在 AI 领域的卓越成就家喻户晓,而慕尼黑大学同样不容小觑,…...
MySql面试宝典【刷题系列】
文章目录 一、Mysql 的存储引擎 myisam 和 innodb 的区别。二、MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?三、对于大流量的网站,您采用什么样的方法来解决各页面访问量统计问题?四、锁的优化策略…...
银河麒麟系统安装mysql5.7【亲测可行】
一、安装环境 cpu:I5-10代; 主板:华硕; OS:银河麒麟V10(SP1)未激活 架构:Linux 5.10.0-9-generic x86_64 GNU/Linux mysql版本:mysql-5.7.34-linux-glibc2.12-x86_64.ta…...
CTF-内核pwn入门1: linux内核模块基础原理
本文由A5rZ在2025-2-18-21:00编写 1.可加载内核模块是什么? 内核可加载模块(*.ko 文件)是内核的一种扩展机制,可以在不重启系统的情况下加载和卸载代码。它们允许动态地向内核添加新的功能或支持。 以下是一些内核模块常见的功能&…...
第4章 4.1 Entity Framework Core概述
4.1.1 什么是ORM ORM (object tralstional mapping ,对象关系映射)中的“对象”指的就是C#中的对象,而“关系”是关系型数据库,“映射”指搭建数据库与C#对象之间的“桥梁”。 比如使用ORM ,可以通过创建C#对象的方式把数据插入数据库而不需…...
【C语言】自定义类型:联合体和枚举
1. 联合体 1.1 联合体类型的声明 像结构体一样,联合体也是由一个或者多个成员构成,这些成员可以是不同的类型。 但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用同一块内存空间。所以联合体也叫:共用体。 给联合…...
企业组网IP规划与先关协议分析
目录 一、IP编址 1、IP地址组成 2、IP地址表达 3、IP 地址分类 4、IP地址类型 5、IP网络通信 6、子网掩码 7、默认子网掩码 8、IP 地址规划 9、有类IP编制缺陷 10、VLSM 11、变长子网掩码案例 12、网关 13、无类域间路由 一、IP编址 网络层位于数据链路层与传输层之间…...
数据结构之【顺序表简介】
1.顺序表的概念 顺序表 是 用一段物理地址连续的存储单元 依次 存储数据元素的线性结构 一般情况下采用数组存储 2.顺序表的结构 既然顺序表可以用来存储数据元素, 那就少不了 增删查改 的操作 此时,单一地只创建数组满足不了上述操作 创建相应的结构…...
如何调用 DeepSeek API:详细教程与示例
目录 一、准备工作 二、DeepSeek API 调用步骤 1. 选择 API 端点 2. 构建 API 请求 3. 发送请求并处理响应 三、Python 示例:调用 DeepSeek API 1. 安装依赖 2. 编写代码 3. 运行代码 四、常见问题及解决方法 1. API 调用返回 401 错误 2. API 调用返回…...
一周学会Flask3 Python Web开发-flask3模块化blueprint配置
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 我们在项目开发的时候,多多少少会划分几个或者几十个业务模块,如果把这些模块的视图方法都写在app.py…...
vxe-table实现动态列
vxe-table实现动态列 1.动态列解释2.解决步骤2.1将后端返回的动态列表头,按照格式拼接在固定列表头上2.2将后端返回的列表数据按照键值对格式组装 1.动态列解释 正常列表是有固定的列;我的需求是,最初只知道表格的固定两列,查询数…...
day16_推荐系统和总结
文章目录 day16_推荐系统和总结一、推荐实现1、基于流行度推荐(掌握)1.1 近期热门商品推荐1.2 个人热门商品推荐 2、基于隐语义模型的协同过滤推荐(了解)2.1 ALS算法介绍2.2 推荐代码 3、基于物品的协同过滤推荐(了解&…...
Scifinder数据库专利检索实操教程
在上期的内容里,我为大家分享了查询专利的数据库。发出后有小伙伴问,怎么没有大佬Scifinder!这不,应大家的呼声,今天就来给大家好好讲讲 Scifinder专利检索!! SciFinder,由美国化学会…...
Linux下 <用户名> is not in the sudoers file
参考链接 https://blog.csdn.net/weixin_49192027/article/details/114702099 原因 当前的用户没有加入到sudo的配置文件里 解决方案 切换到root用户 su 编辑配置文件 vim /etc/sudoers 如果没有安装vim 运行命令 sudo apt-get install vim vim的使用教程 参考链接…...
Linux下基本指令(4)
Linux权限的概念 Linux下有两种用户:超级用户(root)、普通用户。 超级用户:可以再linux系统下做任何事情,不受限制 普通用户:在linux下做有限的事情。 超级用户的命令提示符是“#”,普通用户…...
【算法与数据结构】字典树(Trie)详解
目录 一,字典树的定义 二,字典树的代码实现 完整代码详细注释: 测试用例测试结果: 三,处理其他字符 四,内存优化与扩展 1. 内存优化 2. 扩展功能 五,扩展功能支持通配符匹配 六&…...
el-table树状表格,默认展开第一个节点的每一层
效果如图 <template><el-table:data"tableData"style"width: 100%":tree-props"{ children: children, hasChildren: hasChildren }":expand-row-keys"expandRowKeys"row-key"id"expand-change"handleExpan…...
RPA-实例(UiPath )
UiPath 是一个流行的机器人流程自动化(RPA)工具,用于自动化重复性任务。以下是一个简单的实例,展示如何使用 UiPath 自动化一个常见的任务:从 Excel 文件中读取数据并将其输入到网页表单中。 实例:从 Excel 读取数据并自动填写网页表单 步骤 1:准备工作 安装 UiPath S…...
【RabbitMQ业务幂等设计】RabbitMQ消息是幂等的吗?
在分布式系统中,RabbitMQ 自身不直接提供消息幂等性保障机制,但可通过业务逻辑设计和技术组合实现消息处理的幂等性。以下是 8 种核心实现方案及最佳实践: 一、消息唯一标识符 (Message Deduplication) 原理 每条消息携带全局唯一IDÿ…...
Spring Boot项目开发常见问题及解决方案(上)
启动相关问题 问题 1:项目启动时报错“找不到主类” 在使用 Spring Boot 打包成可执行 JAR 文件后启动,有时会遇到这个头疼的问题。通常是因为打包配置有误或者项目结构不符合要求。 解决方案: 首先,检查 pom.xml(Ma…...
具有整合各亚专科医学领域知识能力的AI智能体开发纲要(2025版)
整合各亚专科医学领域知识能力的AI代理的开发与研究 一、引言 1.1 研究背景 在科技飞速发展的当下,人工智能(AI)已成为推动各行业变革的关键力量,医疗领域也不例外。近年来,AI 在医疗行业的应用取得了显著进展,从医学影像诊断到疾病预测,从药物研发到个性化医疗,AI 技…...
Selenium实战案例1:论文pdf自动下载
在上一篇文章中,我们介绍了Selenium的基础用法和一些常见技巧。今天,我们将通过中国科学:信息科学网站内当前目录论文下载这一实战案例来进一步展示Selenium的web自动化流程。 目录 中国科学:信息科学当期目录论文下载 1.网页内…...
进程的介绍--进程状态/切换
1.冯 • 诺依曼体系结构 1.1 体系结构 冯•诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。数学家冯•诺依曼提出了计算机制造的三个基本原则,即采用二进制逻辑、程序存储执行以及计算机由五个部分组成&#x…...
一文详解U盘启动Legacy/UEFI方式以及GPT/MBR关系
对于装系统的老手而说一直想研究一下装系统的原理,以及面对一些问题时的解决思路,故对以前的方法进行原理上的解释,主要想理解其底层原理。 引导模式 MBR分区可以同时支持UEFI和Legacy引导,我们可以看一下微pe制作的启动盘&#…...
【面试】Redis 常见面试题
一、介绍一下什么是 Redis,有什么特点? Redis 是一个高性能的 key-value 内存数据库。 不同于传统的 MySQL 这样的关系型数据库,Redis 主要使用内存存储数据(当然也支持持久化存储到硬盘上),并非是使用 “表” 这样…...
扩散模型中,Flow Matching的训练方式相比于 DDPM 训练方法有何优势?
在扩散模型中,Flow Matching(FM)相比DDPM(Denoising Diffusion Probabilistic Models)的训练方法具有以下核心优势: 1. 更简单的训练目标 DDPM:通过逐步预测噪声来间接优化数据分布的变分下界(ELBO),需要设计多步的噪声调度策略,训练目标依赖马尔可夫链的分解。Flow…...
Unity FBXExport导出的FBX无法在Blender打开
将FBX转换为obj: Convert 3D models online - free and secure...
【无标题】基于Unity写一个DelayInvoke方法
没想到来得这么块,程序员可能比司机先失业了。。。。。。。。 //测试过一定要这么调用??奇怪的是,不能(mono 直接引用)??///但AI还是给出了能用的代码 MonoBehaviourExtensions.DelayInvoke(this,()=> { },3); /* 方案一,使用示例(): public class ExampleUsag…...
JavaScript 语言基础之标签语句
标签语句的语法 label: statement label 表示标签名,可以是任何合法的标识符,但不能是 JavaScript 中的保留字。statement 表示被标记的语句块,可以是任何合法的 JavaScript 语句。 用法 标签语句的主要用途是在代码中进行跳转࿰…...