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

Spring Boot中集成Guava Cache或者Caffeine

一、在Spring Boot(1.x版本)中集成Guava Cache

  • 注意: Spring Boot 2.x+用户:优先使用Caffeine,性能更优且维护活跃。

1. 添加依赖

pom.xml中添加Guava依赖:

<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>31.0.1-jre</version> <!-- 使用最新版本 -->
</dependency>

2. 启用缓存支持

在启动类上添加@EnableCaching注解:

@SpringBootApplication
@EnableCaching
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

3. 配置Guava缓存管理器

创建配置类定义CacheManager Bean:

@Configuration
public class CacheConfig {@Beanpublic CacheManager cacheManager() {GuavaCacheManager cacheManager = new GuavaCacheManager();cacheManager.setCacheBuilder(CacheBuilder.newBuilder().expireAfterWrite(10, TimeUnit.MINUTES) // 写入10分钟后过期.maximumSize(100) // 最大缓存数量.recordStats()); // 开启统计信息return cacheManager;}
}

4. 使用缓存注解

在Service层使用@Cacheable@CacheEvict等注解:

@Service
public class UserService {// 缓存查询结果,key为id@Cacheable(value = "USER_CACHE", key = "#id")public User getUserById(Long id) {return userRepository.findById(id).orElse(null);}// 更新缓存@CachePut(value = "USER_CACHE", key = "#user.id")public User updateUser(User user) {return userRepository.save(user);}// 删除缓存@CacheEvict(value = "USER_CACHE", key = "#id")public void deleteUser(Long id) {// 删除用户逻辑userRepository.deleteById(id);}}

5. 验证缓存效果

编写测试类或调用接口验证缓存是否生效:

@SpringBootTest
public class UserServiceTest {@Autowiredprivate UserService userService;@Testpublic void testCache() {// 第一次调用,执行方法User user1 = userService.getUserById("123");// 第二次调用,从缓存获取User user2 = userService.getUserById("123");// 验证是否为同一对象(缓存生效)assertThat(user1).isSameAs(user2);}
}

高级配置

  • 多缓存配置:为不同缓存设置不同策略:

    @Bean
    public CacheManager cacheManager() {GuavaCacheManager cacheManager = new GuavaCacheManager();cacheManager.setCacheBuilder(CacheBuilder.newBuilder().expireAfterWrite(30, TimeUnit.MINUTES).maximumSize(500));cacheManager.setCacheBuilder("userCache", CacheBuilder.newBuilder().expireAfterWrite(10, TimeUnit.MINUTES).maximumSize(100));return cacheManager;
    }
    
  • 刷新策略:使用refreshAfterWrite定时刷新(需配合LoadingCache):

    CacheBuilder.newBuilder().refreshAfterWrite(5, TimeUnit.MINUTES).build(CacheLoader.from(key -> loadData(key)));
    
  • 统计信息:通过recordStats()启用统计,使用cache.getStatistics()获取命中率等信息。

常见问题

  1. 缓存未生效

    • 确保启动类有@EnableCaching
    • 检查方法是否为public(注解在私有方法上无效)。
  2. 配置未应用

    • 确认CacheManager Bean正确注册。
    • 检查缓存名称是否匹配@Cacheable(value = "cacheName")
  3. 内存溢出

    • 合理设置maximumSizeexpireAfterAccess/Write

通过以上步骤,即可在Spring Boot中高效使用Guava Cache实现本地缓存,提升应用性能。



二、Spring Boot 2.x及以上版本(推荐使用Caffeine)

在Spring Boot 2.x及以上版本中,Caffeine作为默认的本地缓存组件,取代了Guava Cache,提供了更高的性能和更灵活的配置。


1. 添加依赖

需引入spring-boot-starter-cachecaffeine依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId><version>3.1.8</version> <!-- 推荐使用最新版本 -->
</dependency>

2. 启用缓存支持

在启动类添加@EnableCaching注解:

@SpringBootApplication
@EnableCaching
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

3. 配置Caffeine缓存

方式一:通过配置文件

application.yml中定义全局缓存参数:

spring:cache:type: caffeinecaffeine:spec: maximumSize=500,expireAfterWrite=600s,initialCapacity=100cache-names: userCache, productCache  # 定义缓存名称
  • 常用参数
    • maximumSize:最大缓存条目数
    • expireAfterWrite:写入后过期时间
    • initialCapacity:初始容量。
方式二:通过Java Config类

为不同缓存设置独立策略(推荐多缓存场景):

@Configuration
@EnableCaching
public class CacheConfig {public enum Caches {USER_CACHE(600, 1000),  // 有效期600秒,最大容量1000PRODUCT_CACHE(3600);private final int ttl;private final int maxSize;Caches(int ttl, int maxSize) {this.ttl = ttl;this.maxSize = maxSize;}public int getTtl() {return ttl;}public int getMaxSize() {return maxSize;}}@Beanpublic CacheManager cacheManager() {SimpleCacheManager manager = new SimpleCacheManager();List<CaffeineCache> caches = Arrays.stream(Caches.values()).map(c -> new CaffeineCache(c.name(), Caffeine.newBuilder().expireAfterWrite(c.getTtl(), TimeUnit.SECONDS).maximumSize(c.getMaxSize()).build())).collect(Collectors.toList());manager.setCaches(caches);return manager;}
}

此方式支持为每个缓存单独配置过期时间和容量。


4. 使用缓存注解

在Service层通过注解操作缓存:

@Service
public class UserService {// 缓存查询结果,key为id@Cacheable(value = "USER_CACHE", key = "#id")public User getUserById(Long id) {return userRepository.findById(id).orElse(null);}// 更新缓存@CachePut(value = "USER_CACHE", key = "#user.id")public User updateUser(User user) {return userRepository.save(user);}// 删除缓存@CacheEvict(value = "USER_CACHE", key = "#id")public void deleteUser(Long id) {userRepository.deleteById(id);}
}
  • 注解说明
    • @Cacheable:查询时优先从缓存读取
    • @CachePut:更新数据并刷新缓存
    • @CacheEvict:删除数据时移除缓存。

5. 高级配置

刷新策略(RefreshAfterWrite)

需定义CacheLoader以支持自动刷新:

@Bean
public CacheLoader<Object, Object> cacheLoader() {return new CacheLoader<>() {@Overridepublic Object load(Object key) {return loadDataFromDB(key);  // 初始加载数据}@Overridepublic Object reload(Object key, Object oldValue) {return oldValue;  // 刷新时保留旧值,异步加载新值}};
}

配置文件中需添加refreshAfterWrite=5s,并关联此Bean。

统计与监控

启用统计功能:

Caffeine.newBuilder().recordStats().build();

通过cache.stats()获取命中率、回收数量等指标。


6. 验证缓存效果

通过测试类验证缓存是否生效:

@SpringBootTest
public class CacheTest {@Autowiredprivate UserService userService;@Testpublic void testCache() {User user1 = userService.getUserById(1L);  // 首次查询,存入缓存User user2 = userService.getUserById(1L);  // 二次查询,命中缓存assertThat(user1).isSameAs(user2);}
}

常见问题

  1. 缓存未命中

    • 检查方法是否为public(注解在私有方法无效)
    • 确认缓存名称与配置一致。
  2. 配置冲突

    • 避免同时配置maximumSizemaximumWeight
    • expireAfterWrite优先级高于expireAfterAccess

通过以上步骤,可在Spring Boot 2.x中高效集成Caffeine,实现高性能本地缓存,适用于高频访问但更新较少的数据场景(如配置信息、静态数据)。



三、Caffeine使用场景

Caffeine 作为高性能本地缓存库,适用于多种需要快速数据访问和高效内存管理的场景。以下是其主要使用场景及对应的技术优势分析:


1. 高并发请求缓存

  • 场景描述:适用于高频访问的接口或热点数据,例如用户信息查询、商品详情展示等。Caffeine 通过无锁并发设计和 Window TinyLFU 算法,显著提升缓存命中率,减少数据库压力。
  • 技术优势
    • 高性能:在高并发环境下,Caffeine 的吞吐量远超 Guava Cache,其分段锁机制避免了锁竞争问题。
    • 高命中率:Window TinyLFU 算法结合 LRU 和 LFU 优点,有效保留高频访问数据,命中率比 Guava 提升 10%~20%。
  • 典型应用:Web 应用的 API 接口缓存,如电商平台的商品详情页。

2. 数据库查询缓存

  • 场景描述:用于缓存频繁查询的数据库结果,如用户常用配置、热门商品库存等,减少重复数据库访问。
  • 技术优势
    • 自动过期策略:支持 expireAfterWrite(写入后过期)和 expireAfterAccess(访问后过期),防止数据过时。
    • 内存管理:通过 maximumSize 限制缓存条目数,避免内存溢出,结合惰性删除和定时清理机制优化内存使用。
  • 典型应用:用户登录信息缓存、商品库存实时查询缓存。

3. 复杂计算结果缓存

  • 场景描述:缓存计算密集型操作的结果,如图像处理、大数据聚合分析等,避免重复计算消耗资源。
  • 技术优势
    • 异步加载:通过 AsyncLoadingCache 异步加载数据,减少主线程阻塞,提升系统响应速度。
    • 刷新机制:使用 refreshAfterWrite 定时刷新缓存,保证数据更新后的及时性,同时保留旧数据直至新数据加载完成。
  • 典型应用:推荐系统的实时计算结果缓存、图像处理后的缩略图缓存。

4. 多级缓存架构(L1缓存)

  • 场景描述:在分布式系统中作为一级本地缓存(L1),结合 Redis(L2)和数据库(L3)形成三级缓存,减少跨服务或跨节点的网络延迟。
  • 技术优势
    • 低延迟访问:本地内存访问速度极快,适合对延迟敏感的场景。
    • 灵活集成:通过 CacheLoaderWriter 接口,可无缝与 Redis 等外部缓存联动,实现数据回源和同步。
  • 典型应用:秒杀系统的库存缓存、分布式服务中的配置信息缓存。

5. 需要高灵活性和统计监控的场景

  • 场景描述:对缓存策略有定制化需求(如动态调整过期时间、监听缓存事件)或需监控缓存命中率的场景。
  • 技术优势
    • 灵活配置:支持基于大小、时间、引用等多种淘汰策略,并可自定义过期逻辑。
    • 统计功能:通过 recordStats() 启用统计,获取命中率、淘汰次数等指标,便于性能调优。
  • 典型应用:实时监控系统的缓存健康状态、需要动态调整缓存策略的业务场景。

注意事项

  1. 非分布式场景:Caffeine 仅适用于本地缓存,跨节点数据需结合 Redis 等分布式缓存。
  2. 内存限制:需根据应用内存合理设置 maximumSize 或权重,避免 OOM 问题。
  3. 数据一致性:本地缓存可能导致多实例间数据不一致,需通过过期时间或事件通知机制解决。

总结

Caffeine 凭借其高性能、高命中率和灵活的配置,成为高并发、低延迟场景下的首选本地缓存库。尤其适合作为一级缓存与 Redis 等组成多级缓存架构,或用于需要快速响应和复杂策略管理的业务场景。实际应用中需结合具体需求调整淘汰策略和内存配置,以最大化其优势。

更多用法:

SpringBoot:第五篇 集成Guava(本地缓存+分布式缓存)

相关文章:

Spring Boot中集成Guava Cache或者Caffeine

一、在Spring Boot(1.x版本)中集成Guava Cache 注意&#xff1a; Spring Boot 2.x用户&#xff1a;优先使用Caffeine&#xff0c;性能更优且维护活跃。 1. 添加依赖 在pom.xml中添加Guava依赖&#xff1a; <dependency><groupId>com.google.guava</groupId&…...

全感官交互革命:当 AI 大模型学会 “看、听、说、创”

引言&#xff1a;从 “文字对话” 到 “全感官体验”&#xff0c;AI 正在重塑人类认知边界 当 AI 不再局限于文本对话&#xff0c;而是能 “看懂” 图像、“听懂” 语音、“生成” 视频&#xff0c;并将这些模态无缝融合时&#xff0c;一场关于人机交互的革命已然开启。DeepSe…...

Linux 库文件详解

Linux 库文件详解 一、库文件概述 库文件是预先编译好的方法的集合&#xff0c;它为程序员提供了一种方便的方式来复用代码。在 Linux 系统中&#xff0c;主要有两种类型的库文件&#xff1a;静态库和共享库。 静态库&#xff08;.a 文件&#xff09; 使用静态库&#xff0…...

蒙特卡罗方法(Monte Carlo Method)​​:基于随机采样的数值计算与模拟技术

​​核心思想​​ 蒙特卡罗方法通过​​随机采样​​和​​统计模拟​​解决数学、物理、工程等领域的复杂问题&#xff0c;其核心是利用​​大数定律​​——当样本量足够大时&#xff0c;样本均值会收敛于期望值。 ​​关键特点​​&#xff1a; ​​无维度诅咒​​&#x…...

HTTPS协议:更安全的HTTP

目录 1. 前言 2. HTTP 与 HTTPS&#xff1a;安全的分水岭 2.1 HTTP 的安全隐患 2.2 HTTPS 的安全提升 3. HTTPS 的核心概念 3.1 加密三剑客&#xff1a;对称加密、非对称加密与哈希算法 3.2 SSL/TLS 握手过程&#xff1a;建立安全通道的关键步骤 3.3 数字证书&#xff…...

Flutter BottomNavigationBar 详解

目录 一、引言 二、BottomNavigationBar 的基本用法 三、主要属性 1. 基本配置 2. 导航项配置 3. 导航类型选择 四、高级功能实现 1. 结合 PageView 实现滑动切换 2. 添加徽章提示 3. 自定义凸起按钮&#xff08;FAB融合&#xff09; 4. 渐变背景实现 五、自定义 B…...

吴恩达深度学习作业 RNN模型——字母级语言模型

一. 简单复习一下RNN RNN RNN适用于处理序列数据&#xff0c;令是序列的第i个元素&#xff0c;那么就是一个长度为的序列&#xff0c;NLP中最常见的元素是单词&#xff0c;对应的序列是句子。 RNN使用同一个神经网络处理序列中的每一个元素。同时&#xff0c;为了表示序列的…...

数字时代,如何为个人信息与隐私筑牢安全防线?

首席数据官高鹏律师团队编著 在当今数字化时代&#xff0c;个人信息和隐私保护至关重要。我们在享受数字生活带来的便利时&#xff0c;也面临着个人信息泄露、隐私被侵犯的风险。下面将从先进技术和法律途径两个方面&#xff0c;探讨如何严格保护个人信息和隐私。 一、先进技…...

javascript交换值最好三种

代码 1. 位运算(性能高&#xff0c;但只能用于整数) var a15; var b32; console.log(a) //15 console.log(b) //32 a a ^ b; b a ^ b; a a ^ b; console.log(a) //32 console.log(b) //152. 数组结构(性能高&#xff0c;但要ES6) var a15; var b32; console.log(…...

C++-Lambda表达式

目录 1.什么是 Lambda&#xff1f; 2.例子&#xff1a;打印每个元素&#xff08;和 for_each 一起用&#xff09; 3.捕获外部变量&#xff08;Capture&#xff09; 3.1. 捕获值&#xff08;拷贝&#xff09;&#xff1a;[] 3.2. 捕获引用&#xff1a;[&] 3.3. 指定捕…...

逻辑回归的多分类实战:以鸢尾花数据集为例

文章目录 引言&#xff1a;从二分类到多分类一、多分类问题无处不在二、One-vs-All策略揭秘1. 核心思想2. 数学表达 三、鸢尾花分类完整实现1. 环境准备2. 数据加载与探索3. 数据预处理4. 模型训练与评估5. 决策边界可视化 四、关键参数解析五、总结 引言&#xff1a;从二分类到…...

[面试]SoC验证工程师面试常见问题(一)

SoC验证工程师面试常见问题(一) 摘要:在面试 SoC 验证工程师职位时,面试官通常会重点考察候选人对 SystemVerilog 和 UVM (Universal Verification Methodology) 的掌握程度,因为这两者是现代 IC 验证的核心技能。以下是可能会被问到的常见问题,涵盖 SystemVerilo…...

传统银行服务和 区块链支付无缝融合的一种解决方案

Dragonfly Capital 的合伙人 Alex Pack 曾表示:“DeFi 的目标是重构全球银行体系,并打造开放且无须许可的经营环境。”在 DeFi 的金融世界中,加密资产架构在区块链上,通过各个协议实现资产之间的高效转移和价值的实时流通,如 Metamask 钱包的自托管,Uniswap 的资产交易,…...

大语言模型能力评定探讨

有标准答案的评估&#xff08;选择题&#xff09; 评估语言模型能力的基本思路是准备输入和标准答案&#xff0c;比较不同模型对相同输入的输出 由于AI答题有各种各样答案&#xff0c;因此现在是利用选择题考察。 有一个知名的选择题的基准叫做Massive Multitask Language Und…...

解构区块链身份认证:从ID到零知识证明的实战指南

引言 在数字经济高速发展的今天&#xff0c;数字身份已成为个人与数字世界交互的核心凭证。传统中心化身份系统存在数据孤岛、隐私泄露、单点故障等痛点&#xff0c;而区块链技术凭借​​去中心化、不可篡改、可追溯​​的特性&#xff0c;为数字身份验证提供了革命性解决方案…...

IntelliJ IDEA 使用教程

文章目录 一、创建项目二、创建模块三、创建包四、创建类五、编写代码六、运行代码注意 一、创建项目 二、创建模块 【File】->【New】->【Module…】 三、创建包 【helloword】->【右击 src】->【New】->【Package】 四、创建类 【helloword】->【s…...

HBM的哪些事

命令操作 这也许是DDR往HBM演进的一些奇淫技巧。 本篇内容属于杂谈&#xff0c;关于HBM的奇淫技巧&#xff0c;随后出专题介绍。...

C++ std::initializer_list 详解

std::initializer_list 是 C11 引入的一个轻量级模板类&#xff0c;用于支持花括号初始化列表&#xff08;{1, 2, 3}&#xff09;的语义。它允许函数或构造函数接受任意长度的同类型初始化列表&#xff0c;是实现统一初始化&#xff08;{} 语法&#xff09;的核心组件。 1. 基本…...

网络原理 - 13(HTTP/HTTPS - 4 - HTTPS)

目录 HTTPS 是什么 不得不的策略 - 应对“运营商劫持” “加密” 是什么 分类 对称加密 非对称加密 HTTPS 工作原理 1&#xff09;引入对称加密 2&#xff09; 引入非对称加密 中间人攻击 引入证书 证书的验证过程 完&#xff01; HTTPS 是什么 HTTPS 也是一个应…...

当MCP撞进云宇宙:多芯片封装如何重构云计算的“芯“未来?

当MCP撞进云宇宙:多芯片封装如何重构云计算的"芯"未来? 2024年3月,AMD发布了震撼业界的MI300A/B芯片——这颗为AI计算而生的"超级芯片",首次在单封装内集成了13个计算芯片(包括3D V-Cache缓存、CDNA3 GPU和Zen4 CPU),用多芯片封装(Multi-Chip Pac…...

Kotlin Flow流

一 Kotlin Flow 中的 stateIn 和 shareIn 一、简单比喻理解 想象一个水龙头&#xff08;数据源&#xff09;和几个水杯&#xff08;数据接收者&#xff09;&#xff1a; 普通 Flow&#xff08;冷流&#xff09;&#xff1a;每个水杯来接水时&#xff0c;都要重新打开水龙头从…...

虚拟局域网(VLAN)实验(Cisco Packet Tracer)-路由器、交换机的基本配置

好的&#xff0c;我们来根据你提供的文档&#xff0c;一步步地在 Cisco Packet Tracer 中完成这个跨交换机划分 VLAN 的实验。 实验目标: 配置两台交换机 SW1 和 SW2&#xff0c;划分 VLAN 10 和 VLAN 20&#xff0c;配置 Trunk 链路&#xff0c;并测试同 VLAN 和跨 VLAN 的连…...

【论文速递】2025年09周 (Robotics/Embodied AI/LLM)

目录 LLM-Microscope&#xff1a;揭示标点符号在Transformers的上下文中的隐藏作用英文摘要中文摘要 SurveyX&#xff1a;通过大型语言模型实现学术调查自动化英文摘要中文摘要 数学推理的自我奖励校正英文摘要中文摘要 VideoGrain&#xff1a;调整时空关注以进行多元透明视频编…...

自主机器人模拟系统

一、系统概述 本代码实现了一个基于Pygame的2D自主机器人模拟系统&#xff0c;具备以下核心功能&#xff1a; 双模式控制&#xff1a;支持手动控制&#xff08;WASD键&#xff09;和自动导航模式&#xff08;鼠标左键设定目标&#xff09; 智能路径规划&#xff1a;采用改进型…...

DeepSeek构建非农预测模型:量化关税滞后效应与非线性经济冲击传导

AI分析&#xff1a;非农数据前瞻与关税影响的滞后性 根据AI模型对多维度经济指标的交叉验证&#xff0c;4月非农就业报告或呈现“增速放缓但未失速”的特征。当前市场共识预期为新增就业13.3万人&#xff08;前值22.8万&#xff09;&#xff0c;失业率维持4.2%&#xff0c;时薪…...

前端面经-VUE3篇--vue3基础知识(一)插值表达式、ref、reactive

一、计算属性(computed) 计算属性&#xff08;Computed Properties&#xff09;是 Vue 中一种特殊的响应式数据&#xff0c;它能基于已有的响应式数据动态计算出新的数据。 计算属性有以下特性&#xff1a; 自动缓存&#xff1a;只有当它依赖的响应式数据发生变化时&#xff…...

云原生后端架构的优势与最佳实践

📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 在过去的几年里,随着云计算和容器化技术的迅猛发展,云原生架构逐渐成为现代企业和开发团队构建和运维应用系统的首选方式。云原生架构通过高度的自动化、弹性伸缩、微服务化等特点,使得企业能够在不断变化…...

力扣838.推多米诺随笔

“生活就像海洋&#xff0c;只有意志坚强的人&#xff0c;才能到达彼岸。”—— 马克思 题目 n 张多米诺骨牌排成一行&#xff0c;将每张多米诺骨牌垂直竖立。在开始时&#xff0c;同时把一些多米诺骨牌向左或向右推。 每过一秒&#xff0c;倒向左边的多米诺骨牌会推动其左侧…...

aab转apk

一、 android34升级&#xff1a; 1、升级到安卓34&#xff08;蓝牙、图片&#xff09; 再蓝牙广播的地方加入Context.RECEIVER_EXPORTED 2、废弃了 BluetoothAdapter#enable() 和 BluetoothAdapter#disable()&#xff0c;需要修改 // 以前的蓝牙操作BluetoothManager bluetoo…...

LeetCode 560. 和为 K 的子数组 | 前缀和与哈希表的巧妙应用

文章目录 方法思路&#xff1a;前缀和 哈希表核心思想关键步骤 代码实现复杂度分析示例解析总结 题目描述 给定一个整数数组 nums 和一个整数 k&#xff0c;请统计并返回该数组中和为 k 的子数组的数量。 子数组是数组中连续的非空元素序列。 示例 输入&#xff1a;nums …...

【Hive入门】Hive性能调优:小文件问题与动态分区合并策略详解

目录 引言 1 Hive小文件问题概述 1.1 什么是小文件问题 1.2 小文件产生的原因 2 Hive小文件合并机制 2.1 hive.merge.smallfiles参数详解 2.2 小文件合并流程 2.3 合并策略选择 3 动态分区与小文件问题 3.1 动态分区原理 3.2 动态分区合并策略 3.3 动态分区合并流程…...

基于Springboot+Vue3.0的前后端分离的个人旅游足迹可视化平台

文章目录 0、前言1、前端开发1.1 登录注册页面1.2 首页1.3 足迹管理1.3.1 足迹列表1.3.2 添加足迹1.4 个人中心1.4.1 足迹成就1.4.2 个人信息1.4.3 我的计划2、后端开发2.1 用户接口开发2.2 足迹点接口2.3 旅游计划接口3、完整代码资料下载0、前言 项目亮点: 前端用户权限动态…...

安妮推广导航系统开心版多款主题网址推广赚钱软件推广变现一键统计免授权源码Annie

一、源码描述 这是一套推广导航源码&#xff08;Annie&#xff09;&#xff0c;基于Funadmin框架&#xff08;ThinkPHP8Layui &#xff09;&#xff0c;内置多款主题&#xff0c;可以用于网址推广&#xff0c;或者用于软件推广&#xff0c;PC端软件手机端软件&#xff0c;后台…...

单片机-STM32部分:1、STM32介绍

飞书文档https://x509p6c8to.feishu.cn/wiki/CmpZwTgHhiQSHZkvzjdc6c4Yn1g STM32单片机不是一款芯片&#xff0c;而是一个系列的芯片&#xff1f; STM32系列单片机是ST&#xff08;意法半导体&#xff09;公司开发的一套32位微控制器基于Arm Cortex()-M处理器&#xff0c;它包…...

PHP-session

PHP中&#xff0c;session&#xff08;会话&#xff09;是一种在服务器上存储用户数据的方法&#xff0c;这些数据可以在多个页面请求或访问之间保持。Session提供了一种方式来跟踪用户状态&#xff0c;比如登录信息、购物车内容等。当用户首次访问网站时&#xff0c;服务器会创…...

php artisan resetPass 执行密码重置失败的原因?php artisan resetPass是什么 如何使用?-优雅草卓伊凡

php artisan resetPass 执行密码重置失败的原因&#xff1f;php artisan resetPass是什么 如何使用&#xff1f;-优雅草卓伊凡 可能的原因 命令不存在&#xff1a;如果你没有正确定义这个命令&#xff0c;Laravel 会报错而不是提示”重置密码失败”用户不存在&#xff1a;’a…...

AI大模型-微调和RAG方案选项

在搭建知识库的方向上&#xff0c;有两个落地方案&#xff1a;微调、RAG。两个方案的比对&#xff1a; 方案选型 微调 让大模型&#xff08;LLM&#xff09;去学习现有知识&#xff08;调整大模型的参数&#xff0c;让它学习新的知识&#xff09;&#xff0c;最终生成一个新的…...

MySQL 第一讲---基础篇 安装

前言&#xff1a; 在当今数据驱动的时代&#xff0c;掌握数据库技术已成为开发者必备的核心技能。作为全球最受欢迎的开源关系型数据库&#xff0c;MySQL承载着淘宝双十一每秒50万次的交易请求&#xff0c;支撑着Facebook百亿级的数据存储&#xff0c;更是无数互联网企业的数据…...

【JavaScript-Day 1】从零开始:全面了解 JavaScript 是什么、为什么学以及它与 Java 的区别

Langchain系列文章目录 01-玩转LangChain&#xff1a;从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块&#xff1a;四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain&#xff1a;从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...

C++ 复习

VS 修改 C 语言标准 右键项目-属性 输入输出 //引用头文件&#xff0c;用<>包裹起来的一般是系统提供的写好的代码 编译器会在专门的系统路径中去进行查找 #include <iostream> //自己写的代码文件一般都用""包裹起来 编译器会在当前文件所在的目录中査…...

数字智慧方案5877丨智慧交通项目方案(122页PPT)(文末有下载方式)

篇幅所限&#xff0c;本文只提供部分资料内容&#xff0c;完整资料请看下面链接 https://download.csdn.net/download/2301_78256053/89575494 资料解读&#xff1a;智慧交通项目方案 详细资料请看本解读文章的最后内容。 智慧交通项目方案是一个全面的设计框架&#xff0c;…...

如何封装一个线程安全、可复用的 HBase 查询模板

目录 一、前言&#xff1a;原生 HBase 查询的痛点 &#xff08;一&#xff09;连接管理混乱&#xff0c;容易造成资源泄露 &#xff08;二&#xff09;查询逻辑重复&#xff0c;缺乏统一的模板 &#xff08;三&#xff09;多线程/高并发下的线程安全性隐患 &#xff08;四…...

VLM Qwen2.5VL GRPO训练微调 EasyR1 多机多卡训练(2)

在之前博客进行了简单的训练尝试:https://www.dong-blog.fun/post/2060 在本博客,将会深入进行多机多卡训练,以及调整训练奖励函数。 之前构建了镜像: docker build . -t kevinchina/deeplearning:r1 FROM hiyouga/verl:ngc-th2.6.0-cu126-vllm0.8.4-flashinfer0.2.2-cx…...

基于建造者模式的信号量与理解建造者模式

信号量是什么&#xff1f; AI解释&#xff1a;信号量&#xff08;Semaphore&#xff09;是操作系统中用于 进程同步与互斥 的经典工具&#xff0c;由荷兰计算机科学家 Edsger Dijkstra 在 1965 年提出。它本质上是一个 非负整数变量&#xff0c;通过原子操作&#xff08;P 操作…...

笔试专题(十四)

文章目录 mari和shiny题解代码 体操队形题解代码 二叉树中的最大路径和题解代码 mari和shiny 题目链接 题解 1. 可以用多状态的线性dp 2. 细节处理&#xff1a;使用long long 存储个数 3. 空间优化&#xff1a;只需要考虑等于’s’&#xff0c;‘sh’&#xff0c;shy’的情况…...

2025年五一数学建模A题【支路车流量推测】原创论文讲解

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了2025年五一数学建模A题【支路车流量推测】完整的成品论文。 给大家看一下目录吧&#xff1a; 摘 要&#xff1a; 一、问题重述 二&#xff0e;问题分析 2.1问题一 2.2问题二 2.3问题三 2.4问题四 2.5 …...

Linux系统:进程程序替换以及相关exec接口

本节重点 理解进程替换的相关概念与原理掌握相关程序替换接口程序替换与进程创建的区别程序替换的注意事项 一、概念与原理 进程程序替换是操作系统中实现多任务和资源复用的关键机制&#xff0c;允许进程在运行时动态加载并执行新程序。 1.1 定义 进程程序替换是指用新程…...

STM32复盘总结——芯片简介

1、stm32介绍 STM32是ST公司基于ARM Cortex-M内核开发的32位微控制器 STM32常应用在嵌入式领域&#xff0c;如智能车、无人机、机器人、无线通信、物联网、工业控制、娱乐电子产品等 STM32功能强大、性能优异、片上资源丰富、功耗低&#xff0c;是一款经典的嵌入式微控制器 目…...

安装深度环境anaconda+cuda+cudnn+pycharm+qt+MVS

下载anaconda,链接:link 默认电脑有显卡驱动,没有的话直接进NVIDIA官网:https://www.nvidia.cn/geforce/drivers/ 下载。 下载cuda 链接:https://developer.nvidia.com/cuda-toolkit-archive 下载cudnn安装包,链接:https://developer.nvidia.com/rdp/cudnn-archive 备注:…...

泰迪杯特等奖案例学习资料:基于多模态特征融合的图像文本检索系统设计

(第十二届泰迪杯数据挖掘挑战赛B题特等奖案例解析) 一、案例背景与核心挑战 1.1 应用场景与行业痛点 随着智能终端与社交媒体的普及,图像与文本数据呈现爆炸式增长,跨模态检索需求日益迫切。传统方法面临以下问题: 语义鸿沟:图像与文本的异构特征分布差异显著,导致跨模…...