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

在 Spring 中使用 @EhCache 注解作为缓存

文章目录

    • 项目概况
    • 项目设置
    • 一个简单的 RESTful Web 服务
      • Spring 整合 EhCache
      • 第 1 步:更新依赖项以使用 EhCache Spring 注解
      • 第 2 步:设置自定义缓存管理器
      • 第 3 步:配置 EhCache
      • 第 4 步:测试缓存
    • 刷新缓存
    • 总结
    • 推荐阅读文章

EhCache 是一种广泛使用的纯 Java 缓存,可以轻松地与大多数流行的 Java 框架集成,例如 SpringHibernate

它通常被认为是 Java 应用程序最方便的选择,因为它可以轻松集成到项目中。EhCache Spring Annotations 允许无缝集成到任何 Spring 应用程序中,只需向可缓存方法添加注释即可,而无需修改方法实现。本文重点介绍如何使用 EhCache Spring Annotations 提升您的 Spring 应用程序。


EhCache 是一种广泛使用的纯 Java 缓存,可以轻松地与大多数流行的 Java 框架集成,例如 SpringHibernate。它通常被认为是 Java 应用程序最方便的选择,因为它可以轻松集成到项目中。特别:

  • 只需将 JAR 包含在项目中即可。无需额外的安装步骤。
  • 与应用程序在相同的进程中运行,因此速度很快。无需其他服务即可运行。

简而言之,EhCache 是任何纯 Java 应用程序的绝佳选择。

在这里插入图片描述

虽然 EhCache 提供了简单、丰富的 API 来以编程方式操作缓存,但本文主要关注使用 EhCache Spring Annotations 以侵入性较小的方式提升 Spring 应用程序。我们将设置一个 Spring MVC 项目,并在 Tomcat 中部署一个 RESTful Web 服务。然后,EhCache 将集成到 Web 服务中。

项目概况

我们将在示例项目的上下文中演示 EhCache Annotations。我们将设置一个托管在 Tomcat 8 服务器上的基于 Spring MVC 的 Web 服务。

我在 Eclipse 中开发了该项目,可以按照Eclipse下载的说明进行安装。

当然,这些特定平台不是 EhCache 的要求;您始终可以选择自己喜欢的 IDE 和服务器。

EhCache Spring Annotations JAR 可Spring-EhCache下载获得。正如我们所看到的,每个版本都有两个 JAR:一个有依赖项,一个没有依赖项。具有依赖项的还包括 EhCache 2 和 Spring 3,它们是 EhCache 注解工作所必需的。如果我们下载带有依赖项的那个并将其添加到我们的构建路径中,则设置起来会更容易。

EhCache Spring Annotations 也与 Spring 4 兼容,但必须单独配置。目前尚不清楚该项目是否会在不久的将来支持 EhCache 3。对于正在使用或打算使用 EhCache 3 的用户,不建议使用本文中讨论的注释方法。

最后,我们将使用 Maven 来管理所有内容。Maven 预装在大多数 Eclipse 安装中,但也可以Maven官网获取。Spring MVCEhCache Spring Annotations 依赖项可以相当容易地添加,如本文后面所示。

项目设置

如果您以前从未设置过 Spring 项目,您可能还会发现 SpringMVC搭建过程提供了丰富的信息。

在本演示中,我们将使用 Maven官网 maven-archetype-webapp 设置一个基本项目。整体文件结构将如下所示:

在这里插入图片描述

创建一个目录 src/main/java,其中包含三个包:com.toptal.blogcom.toptal.blog.cachecom.toptal.blog.service。我们的应用程序源将进入这些包中,如下所述。

让我们在 web.xml 中定义一个名为 “springrest” 的 Tomcat servlet:

<web-app>...<servlet><servlet-name>springrest</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springrest</servlet-name><url-pattern>/*</url-pattern></servlet-mapping>
</web-app>

除非另有明确说明,否则 Spring MVC DispatcherServlet 将在目录 WEB-INF 中查找名为 {servlet-name}-servlet.xml 的 XML 配置文件。让我们创建一个名为 springrest-servlet.xml 的配置文件。要启用带有 @RequestMapping 注释的 Spring 进程控制器方法,我们只需将 <mvc:annotation-driven /> 添加到此文件中即可。此外,让我们定义 Spring 的基本包,以便通过添加 <context:component-scan base-package="com.toptal.blog" /> .springrest-servlet.xml 配置将变为:

<beans ... ><mvc:annotation-driven /><context:component-scan base-package="com.toptal.blog" />
</beans>

一个简单的 RESTful Web 服务

现在,我们的项目已正确配置,让我们实现一个简单的 “消息服务” API。在我们的基础包 project.toptal.blog 中,我们将添加 SpringRestControllerWithEhCache.java ,其中包含一个按 ID 获取消息的 GET 方法,以及一个按 ID 设置消息的 POST 方法:

@RestController  
@RequestMapping( "/" )
public class SpringRestControllerWithEhCache {@AutowiredMessageService messageService;@RequestMapping( value = "/message/{id}", method = RequestMethod.GET )public String getMessage( @PathVariable Integer id ) {String message = messageService.getMessage( id );System.out.println( "get message ["+message+"] at "+new Date() );return message;}@RequestMapping( value = "/message/set/{id}/{message}", method = RequestMethod.POST )public String setMessage( @PathVariable Integer id, @PathVariable String message ) { System.out.println( "set message ["+message+"] at "+new Date() );messageService.setMessage( id, message );return message;  }
}

我们将在 com.toptal.blog.service 中定义 MessageService 类。它将访问存储在我们的记录系统 (SOR) 中的消息。在生产应用程序中,SOR 类似于关系数据库。为简单起见,我们将使用 HashMap

@Service
public class MessageService {private ConcurrentHashMap<Integer, String> messages= new ConcurrentHashMap<Integer, String>();public String getMessage( Integer id ) {System.out.println( "Getting data from SOR......" );return messages.get( id );}public void setMessage( Integer id, String message ){messages.put( id, message );}
}

现在,如果我们将项目导出为 WAR 并将其部署到 Tomcat 中,我们应该能够通过在 中创建 HTTP POST 请求来为 ID=1 设置一条消息,例如“test_message http://localhost:8080/EhCacheExample/message/set/1/test_message ”。然后,我们应该能够通过 HTTP GET 请求的 “test_message” 返回 http://localhost:8080/EhCacheExample/message/1 。我使用 Insomnia 作为方便的 REST 客户端来进行测试。

Spring 整合 EhCache

现在让我们让 EhCache 为我们工作。只需几个快速步骤即可配置我们的项目以正确运行 EhCache。

在这里插入图片描述

第 1 步:更新依赖项以使用 EhCache Spring 注解

在 Maven 的 pom.xml中添加 EhCache Spring Annotations 依赖项:

<!-- ehcache -->
<dependency><groupId>com.googlecode.ehcache-spring-annotations</groupId><artifactId>ehcache-spring-annotations</artifactId><version>1.2.0</version>
</dependency>

第 2 步:设置自定义缓存管理器

Spring 有一个内置的 EhCache 缓存管理器 org.springframework.cache.ehcache.EhCacheManagerFactoryBean 。这适用于大多数缓存情况,但我发现定义自定义缓存管理器非常有用,因为它允许我使用相同的缓存管理器以编程方式或通过注释控制缓存。本文重点介绍 annotations,但让我们继续定义一个自定义缓存管理器,以便在需要时做好准备。如果您更喜欢坚持使用 默认缓存管理器 ,您可以跳过此步骤。

我们将在 : com.toptal.blog.cache.CustomCacheManager

public class CustomCacheManager extends net.sf.ehcache.CacheManager{public CustomCacheManager(){super();}/* Add your own cache methods here.* * public void myCustomCacheMethod(){*    // your code here* }* */
}

通过更新springrest-servlet.xml来启用它,如下所示:

   ...<ehcache:annotation-driven cache-manager="customCacheManager" /><bean id="customCacheManager"class="com.toptal.blog.cache.CustomCacheManager"scope="singleton"></bean>...

第 3 步:配置 EhCache

最后,在 Classpath 中创建 EhCache 配置文件ehcache.xml。默认情况下,Eclipse 将在 classpath 中包含 src/main/resources,我们将文件放在这里。此文件是 EhCache 正常运行所必需的。它定义缓存名称和每个缓存的一些属性,例如 timeToLiveSeconds

<ehcache xmlms:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd"><diskStore path="cache" /><cachename="messageCache"maxElementsInMemory="10000"eternal="false"timeToIdleSeconds="0"timeToLiveSeconds="10"overflowToDisk="false"memoryStoreEvictionPolicy="LFU" />      
</ehcache>

第 4 步:测试缓存

现在,一切都设置好了,使用 EhCache 应该是一件简单而愉快的工作。我们可以简单地将 @Cacheable 添加到我们想要缓存的方法或类中。例如,我将 @Cacheable 添加到 MessageService 中的 getMessage 方法中。就是这么简单!

@Cacheable( cacheName = "messageCache" )
public String getMessage( Integer id ) {System.out.println( "Getting data from SOR......" );return messages.get( id );
}

要测试我们的缓存是否正常工作,我们可以通过在 处 http://localhost:8080/EhCacheExample/message/set/1/newMessage 发出 HTTP POST 请求来创建一条 ID=1 的消息,然后多次获取 ID=1 的消息,并向 . http://localhost:8080/EhCacheExample/message/1 如下面的控制台输出所示,Web 服务在我们第一次请求消息时要求 SOR 获取消息,但在接下来的两个请求中不请求,而是返回缓存的消息。由于我们将 timeToLiveSeconds 定义为 10,因此 Web 服务会在 10 秒后调用 SOR 再次获取消息:

set message [newMessage] at Sun Dec 06 23:55:39 MST 2015
get message [newMessage] at Sun Dec 06 23:55:42 MST 2015
Getting data from SOR......
get message [newMessage] at Sun Dec 06 23:55:47 MST 2015
get message [newMessage] at Sun Dec 06 23:55:49 MST 2015
get message [newMessage] at Sun Dec 06 23:55:54 MST 2015
Getting data from SOR......

刷新缓存

现在,我们正在享受缓存给我们带来的速度和便利,而且 EhCache 足够好,每 10 秒自行刷新一次。但是,如果我们想在 SOR 更新后立即刷新它,该怎么办?EhCache Spring Annotation 提供了@TriggersRemove,以便在调用带注释的方法时从缓存中删除指定的键。在我们的消息服务 API 中,当调用 setMessage 时,应该从缓存中删除缓存的消息。因此,下次收到 getMessage 请求时,缓存将从 SOR 中获取新记录:

@Cacheable(cacheName = "messageCache",keyGenerator = @KeyGenerator (                             // method name is not included in cache key to work with @TriggersRemovename = "HashCodeCacheKeyGenerator",properties = @Property( name="includeMethod", value="false" )))  
public String getMessage( Integer id ) {System.out.println( "Getting data from SOR......" );return messages.get( id );
}@TriggersRemove(cacheName = "messageCache",keyGenerator = @KeyGenerator (name = "HashCodeCacheKeyGenerator",properties = @Property( name="includeMethod", value="false" )))
public void setMessage( @PartialCacheKey Integer id, String message ) {messages.put( id, message );
}

缓存管理器使用密钥生成器来生成缓存密钥。可在此处找到预定义的缓存密钥生成器列表。默认情况下,@KeyGenerator 使用方法名称和传入的参数来生成缓存键。但是,由于我们希望 setMessage 方法生成与 getMessage 相同的 key,并删除与该 key 关联的缓存值,因此我们必须仅使用消息 ID 作为 key,并消除生成 key 的方法名称。因此,我们将这两个方法的密钥生成器的 includeMethod 属性设置为 false。此外,由于 setMessage 有两个参数,我们在 id 参数上使用 EhCache 的 @PartialCacheKey 注解来指定它是密钥生成器唯一应该使用的参数。最后,回想一下,我们为此资源类型配置了专用缓存 messageCache,因此仅使用键的 ID 不会与其他资源类型发生冲突。

现在,如果我们对 ID=1 的消息执行多个 HTTP 请求,如下所示:

HTTP POST:  http://localhost:8080/EhCacheExample/message/set/1/newMessage1
HTTP GET:http://localhost:8080/EhCacheExample/message/1
HTTP POST: http://localhost:8080/EhCacheExample/message/set/1/newMessage2
HTTP GET:http://localhost:8080/EhCacheExample/message/1

控制台将显示:

set message [newMessage1] at Tue Dec 08 17:53:44 MST 2015
get message [newMessage1] at Tue Dec 08 17:53:47 MST 2015
Getting data from SOR......
set message [newMessage2] at Tue Dec 08 17:53:50 MST 2015
get message [newMessage2] at Tue Dec 08 17:53:53 MST 2015
Getting data from SOR......

总结

最终的项目结构如下所示:

在这里插入图片描述

在此示例中,我们首先创建了一个简单的 Spring MVC RESTful Web 应用程序。无需修改现有应用程序代码的哪怕一行,我们就可以使用 EhCache Spring Annotations 将 EhCache 无缝集成到应用程序中。我们已经证明 EhCache Spring Annotations 既易于安装(通过添加其 Maven 依赖项)又易于使用(通过向方法添加注释)。

推荐阅读文章

1、使用 Spring 框架构建 MVC 应用程序:初学者教程
2、有缺陷的 Java 代码:Java 开发人员最常犯的 10 大错误
3、如何理解应用 Java 多线程与并发编程?
4、Java Spring 中常用的 @PostConstruct 注解使用总结
5、线程 vs 虚拟线程:深入理解及区别
6、深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别
7、10大程序员提升代码优雅度的必杀技,瞬间让你成为团队宠儿!
8、“打破重复代码的魔咒:使用 Function 接口在 Java 8 中实现优雅重构!”
9、Java 中消除 If-else 技巧总结
10、线程池的核心参数配置(仅供参考)
11【人工智能】聊聊Transformer,深度学习的一股清流(13)

相关文章:

在 Spring 中使用 @EhCache 注解作为缓存

文章目录 项目概况项目设置一个简单的 RESTful Web 服务Spring 整合 EhCache第 1 步&#xff1a;更新依赖项以使用 EhCache Spring 注解第 2 步&#xff1a;设置自定义缓存管理器第 3 步&#xff1a;配置 EhCache第 4 步&#xff1a;测试缓存 刷新缓存总结推荐阅读文章 EhCache…...

npm install进度卡在 idealTree:node_global: sill idealTree buildDeps

ping一下源&#xff1a;ping http://registry.npm.taobao.org/ ping不通&#xff0c;原因&#xff1a;原淘宝npm永久停止服务&#xff0c;已更新新域名~~震惊&#xff01;&#xff01;&#xff01; 重新安装&#xff1a;npm config set registry https://registry.npmmirror.c…...

力扣1031. 两个非重叠子数组的最大和

力扣1031. 两个非重叠子数组的最大和 题目解析及思路 题目要求找到两段长分别为firstLen 和 secondLen的子数组&#xff0c;使两段元素和最大 图解见灵神 枚举第二段区间的右端点&#xff0c;在左边剩余部分中找出元素和最大的第一段区间&#xff0c;并用前缀和优化求子数组…...

【Unity实战篇】 接入百度翻译,实现文本自动翻译功能

前言【Unity实战篇】 接入百度自动翻译,实现文本自动翻译功能一、获取百度翻译开发平台的APPID和密钥二、Unity中接入自动翻译功能三、Unity中实现自动翻译文本Text功能总结前言 日常在做项目的过程中,游戏本地化几乎已经成为必不可少的一步。本篇文章将演示怎样在Unity中接入…...

ubuntu samba

参考&#xff1a; 基于Ubuntu22.04的Samba服务器搭建教程&#xff08;新手保姆级教程&#xff09;_ubuntu samba-CSDN博客 当时按照这个不行&#xff1a; 主要做了这些修改 1、ufw 打开端口 这些都打开了 Samba服务使用的端口和协议如下1234: Port 137 (UDP) - NetBIOS 名…...

Linux系统和数据库常用的命令2

Linux系统和数据库常用的命令2 1、两台Linux机器ssh免密登录 client端登录server端需要免密&#xff0c;只需把公钥发送到server就可&#xff0c;会在server端生成一个authorized_keys文件 # 108机器上[rootclient ~]# ssh-keygen -t rsa // 非对称算法 Generating public/…...

Golang | Leetcode Golang题解之第468题验证IP地址

题目&#xff1a; 题解&#xff1a; func validIPAddress(queryIP string) string {if sp : strings.Split(queryIP, "."); len(sp) 4 {for _, s : range sp {if len(s) > 1 && s[0] 0 {return "Neither"}if v, err : strconv.Atoi(s); err …...

mermaid 图表相关

1.mermaid图表的代码 1.1 flowchart 流程图代码 flowchart TDA[Christmas] -->|Get money| B(Go shopping)B --> C{Let me think}C -->|One| D[Laptop]C -->|Two| E[iPhone]C -->|Three| F[fa:fa-car Car]1.2 sequece 时序图代码 sequenceDiagramAlice->&…...

Unity接入人工智能

在Unity接入人工智能中&#xff0c;本篇实现了接入百度智能云ai进行npc智能对话&#xff0c;通过http方式&#xff0c;并非插件&#xff0c;适合于所有支持Http链接的Unity版本。对于Chartgpt可以参考本篇内容的实现过程。 1-4节讲解测试&#xff0c;第5节讲解Unity中的实现&a…...

C语言笔记 14

函数原型 函数的先后关系 我们把自己定义的函数isPrime()写在main函数上面 是因为C的编译器自上而下顺序分析你的代码&#xff0c;在看到isPrime的时候&#xff0c;它需要知道isPrime()的样子——也就是isPrime()要几个参数&#xff0c;每个参数的类型如何&#xff0c;返回什么…...

Cpp::STL—list类的模拟实现(上)(13)

文章目录 前言一、结点类的实现二、迭代器类的实现迭代器类的存在意义迭代器类的模板参数构造函数运算符的重载--运算符的重载、!运算符的重载*运算符的重载->运算符的重载 总结 前言 注意本篇难度偏高&#xff0c;其主要体现在迭代器类的实现&#xff01;   什么&#xf…...

ListView的Items绑定和comboBox和CheckBox组合使用实现复选框的功能

为 ListView 控件的内容指定视图模式的方法&#xff0c;参考官方文档。 ComboBox 样式和模板 案例说明&#xff1a;通过checkBox和ComboBox的组合方式实现下拉窗口的多选方式&#xff0c;同时说明了ListView中Items项目的两种绑定方式. 示例&#xff1a; 设计样式 Xaml代码…...

PetaLinux工程的常用命令——petalinux-build

petalinux-build&#xff1a;编译项目或指定组件。 注&#xff1a;有些命令我没用过&#xff0c;瞎翻译有可能会翻译错了。 用法: petalinux-build [options] 可选参数: -h, --help 显示函数用法。 -p, --project <PROJECT> PetaLinuxSDK项目的路径。默认…...

【Qt】窗口预览(1)—— 菜单栏

窗口预览&#xff08;1&#xff09; 1. QMainWindow2. QMenuBar——菜单栏2.1 创建菜单栏/将菜单栏添加到widget中2.2 addMenu——在菜单栏中添加菜单2.3 在菜单中添加选项2.4 添加快捷键2.5 支持嵌套添加菜单2.6 添加信号2.7 添加分割线 1. QMainWindow Qt窗口是通过QMainWin…...

揭秘酱香型白酒中的6大劣质酒的特点,守好你的健康与钱包

你知道吗&#xff1f;居然有 90%的人都喝过这 6 种劣质酱香型白酒&#xff0c;今天酱酒亮哥就带大家一起揭开它们的真面目&#xff0c;看看你中招了没有&#xff01; 先说那种有很浓的生粮味的酱酒&#xff0c;就像刚磨出来还没烧开的豆浆味&#xff0c;喝起来那叫一个难受。想…...

C#拓展方法

定义 扩展方法使你能够向现有类型“添加”方法&#xff0c;而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法是一种静态方法&#xff0c;但可以像扩展类型上的实例方法一样进行调用。 对于用 C#、F# 和 Visual Basic 编写的客户端代码&#xff0c;调用扩…...

02.顺序表、链表简述+对比

目录 一、线性表 二、顺序表 三、链表 四、顺序表和链表的区别 一、线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列&#xff08;相同特性指都为整型int、字符型char或其它类型&#xff09;。 线性表是一种在实际中广泛使用的数据…...

前端布局与响应式设计综合指南(三)

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Css篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Css篇专栏内容:前端布局与响应式设计综合指南(三) 目录 42、px/em/rem有什么区别&#xff1f;为什么通常给font-s…...

当今SNARKs全景

1. 引言 前序博客有&#xff1a; ZKP历史总览SNARK原理示例SNARK性能及安全——Prover篇SNARK性能及安全——Verifier篇Transparent 且 Post-quantum zkSNARKsSNARK DesignRollup项目的SNARK景观 SNARKs因&#xff1a; proof size证明时长验证时长密码学信任假设是否需要tr…...

PMP敏捷专题课:敏捷原则与理念

信息发射源、看板是敏捷相关的词汇。 需求不明确&#xff1a;敏捷的关键词。 明确的端对端工作范围是传统项目管理的关键词。所以&#xff0c;应该采用&#xff1a;混合的&#xff0c;多轨制&#xff0c;瀑布态这样的声明周期 STACEY矩阵。 敏捷价值观指引者我们敏捷的实现。…...

有两个水桶,容量分别为5升和3升,请问如何使用这两个桶得到4升的水?

网上看到的一个面试的题目&#xff0c;感觉挺有意思的记录一下 可以按照以下步骤使用这两个桶得到 4 升的水&#xff1a; 将 5 升水桶装满水&#xff0c;倒入 3 升水桶中&#xff0c;此时 5 升水桶中还剩下 2 升水。将 3 升水桶中的水全部倒掉&#xff0c;然后将 5 升水桶中的…...

pytorch_lightning笔记

Debug 1. 快速运行一次所有的代码 (fast_dev_run) 训练了好长时间但是在训练or 验证的时候崩溃了 使用 fast_dev_run运行5个batch 的 training validation test and predication 查看是否存在错误&#xff1a; train Trainer(fast_dev_runTrue) # True 时为5 train Train…...

从零开始了解云WAF,您的网站安全升级指南

网站安全对任何线上业务来说至关重要&#xff0c;尤其是在网络威胁不断升级的今天。无论是流量高峰期还是日常运营&#xff0c;确保数据安全与服务稳定是每个网站运营者最关心的事情。云WAF&#xff08;Web应用防火墙&#xff09;作为一种高效的安全防护手段&#xff0c;正逐渐…...

Python脚本爬取目标网站上的所有链接

一、爬取后txt文件保存 需要先pip install requests和BeautifulSoup库 import requests from bs4 import BeautifulSoup# 定义要爬取的新闻网站URL url https://www.chinadaily.com.cn/ # China Daily 网站# 发送请求获取页面内容 response requests.get(url)# 检查请求是否…...

Linux下以编译源码的方式安装Qt5与Qt6及其使用

文章目录 概要资源下载依赖安装编译Qt5Qt6 遇到的问题qtchooser使用 概要 自 Qt 5.15 开始&#xff0c;不再提供 open source offline installers&#xff0c;也就是原来的 .run 的安装文件&#xff0c;只能通过源码编译来安装了参考文章 资源下载 源码网址&#xff0c;链接…...

替换掉js后重启nginx 页面加载后js还是原来的 解决方法.【js版本号】【js不生效】【js失效】

原文&#xff1a; 替换掉js后重启nginx 页面加载后js还是原来的 解决方法.【js版本号】【js不生效】【js失效】 产品升级&#xff0c;部署js后&#xff0c;前端页面加载不生效&#xff0c;F12 NetWork查看js源码还是原来的内容。但是查看前端服务器上js已经是最新版本。 &…...

SHELL脚本之输出语句的使用

shell脚本能够给用户显示一些信息&#xff0c;就需要输出语句的使用。 1.echo语句 如上图所示&#xff0c;中英文都可以&#xff0c; 如上图所示&#xff0c;在shell脚本中对于转义符的使用应该加上-e的选项&#xff0c;\n表示换行&#xff0c;\t表示电脑键盘上使用tab键隔开的…...

《大规模语言模型从理论到实践》第一轮学习--Fine-tuning微调

第一轮学习目标&#xff1a;了解大模型理论体系 第二轮学习目标&#xff1a;进行具体实操进一步深入理解大模型 从大语言模型的训练过程来理解微调 大预言模型训练主要包含四个阶段&#xff1a;预训练、有监督微调、奖励建模、强化学习。 预训练&#xff08;Pretraining&…...

XGBoost回归预测 | MATLAB实现XGBoost极限梯度提升树多输入单输出

回归预测 | MATLAB实现XGBoost极限梯度提升树多输入单输出 目录 回归预测 | MATLAB实现XGBoost极限梯度提升树多输入单输出预测效果基本介绍模型描述程序设计参考资料预测效果 基本介绍 XGBoost的全称是eXtreme Gradient Boosting,它是经过优化的分布式梯度提升库,旨在高效、…...

【翻译】在 Python 应用程序中使用Qt Designer的UI文件

原文地址&#xff1a;Using a Designer UI File in Your Qt for Python Application 直接上图&#xff0c;上代码 将UI文件转为Python 为了演示&#xff0c;我们使用 Qt Widgets 简单示例说明。 这个应用程序由一个源文件 easing.py、一个 UI 文件 form.UI、一个资源文件 ea…...