Spring Boot | Spring Boot “缓存管理“

目录:

    • 一、Spring Boot 默认 "缓存" 管理 :
      • 1.1 基础环境搭建
        • ① 准备数据
        • ② 创建项目
        • ③ 编写 "数据库表" 对应的 "实体类"
        • ④ 编写 "操作数据库" 的 Repository接口文件
        • ⑤ 编写 "业务操作列" Service文件
        • ⑥ 编写 "application.properties配置文件"
        • ⑦ 项目测试 ( 实际开发中的"问题突显",用 "缓存技术" 能解决这个问题 )
      • 1.2 Spring Boot "默认缓存体验"
        • (1) 使用 "@EnableCaching" 注解 开始 “缓存管理”
        • (2) 使用 "@Cacheable( )" 注解对 "数据操作方法" 进行 “缓存管理” ( 将该注解放在service类的“操作方法”上,让其对"查询结果" 进行 “缓存” )
        • (3) Spring Boot默认缓存测试
    • 二、Spring Boot "缓存注解" 介绍 :
      • @EnableCaching 注解 ( 用在 "主程序启动类" 上)
      • @Cacheable( ) 注解 ( 作用于"类" 或 "方法",通常用在 "数据查询" 方法上 )
      • CachePut 注解 ( 作用于"类" 或 "方法",通常用在 "数据更新" 方法上 )
      • @CacheEvict 注解 ( 作用于"类" 或 "方法",通常用在 "数据删除" 方法上 )
      • @Caching注解 ( 作用于"类" 或 "方法" )
      • @CacheConfig注解 ( 作用于"类" )

作者简介 :一只大皮卡丘,计算机专业学生,正在努力学习、努力敲代码中! 让我们一起继续努力学习!

该文章参考学习教材为:
《Spring Boot企业级开发教程》 黑马程序员 / 编著
文章以课本知识点 + 代码为主线,结合自己看书学习过程中的理解和感悟 ,最终成就了该文章

文章用于本人学习使用 , 同时希望能帮助大家。
欢迎大家点赞👍 收藏⭐ 关注💖哦!!!

(侵权可联系我,进行删除,如果雷同,纯属巧合)


  • 缓存分布式系统中的重要组件,主要 解决数据厍数据高并发访问问题。在实际开发中,尤其是用户访问量较大网站,为了提高服务器访问性能减少数据库的压力提高用户体验,使用 缓存 显得 尤为重要Spring Boot缓存提供了良好的支持

一、Spring Boot 默认 “缓存” 管理 :

  • Spring框架支持透明地应用程序添加缓存并对缓存进行管理,其管理缓存核心是将缓存 应用于操作数据的方法中,从而
    减少操作 数据的次数同时不会对程序本身造成任何干扰
  • Spring Boot继承了Spring框架缓存管理功能,通过使用 @EnableCaching注解 开启 基于注解缓存支持Spring Boot可以启动缓存管理自动化配置。

1.1 基础环境搭建

  • 使用缓存主要目的减少数据库数据访问压力提高用户体验,下面代码例子将结合数据库访问操作Spring Boot缓存管理讲行演示说明
① 准备数据

先创建了一个 数据库springbootdata,然后创建了两个表 t_articlet_comment ,并向表中插入数据。
其中评论表t_commenta_id 与文章表t_article主键id 相关联 ( t_article主键作为t_comment表外键)。

springbootdata.sql

② 创建项目

创建项目,引入相关依赖
在这里插入图片描述

③ 编写 “数据库表” 对应的 “实体类”
  • 编写t_comment表对应的 实体类Comment,并用 JPA相关注解配置映射关系 :

    Comment.java

    package com.myh.chapter_14.domain;
    
    import jakarta.persistence.*;
    
    //指定该实现类映射的数据库表
        @Entity(name = "t_commet") //设置ORM实体类, 并指定对应的表明
    public class Comment {
    
        //表示数据库表中主键对应的属性
        @Id
        @GeneratedValue(strategy= GenerationType.IDENTITY) //设置主键的生成策略 (主键自增)
        private Integer id;
    
        @Column(name = "content") //指定映射的表字段名
        private String content;
    
        @Column(name = "author")
        private String author;
    
        @Column(name = "a_id")
        private Integer aId;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    
        public String getAuthor() {
            return author;
        }
    
        public void setAuthor(String author) {
            this.author = author;
        }
    
        public Integer getaId() {
            return aId;
        }
    
        public void setaId(Integer aId) {
            this.aId = aId;
        }
    
        @Override
        public String toString() {
            return "Comment{" +
                    "id=" + id +
                    ", content='" + content + '\'' +
                    ", author='" + author + '\'' +
                    ", aId=" + aId +
                    '}';
        }
    }
    
④ 编写 “操作数据库” 的 Repository接口文件
  • 项目中创建 repository包,在该包创建一个用于操作数据库自定义Repository接口该接口 继承JpaRepository
    ( Repository接口 中为 操作数据库方法 )


    CommentRepository.java

    package com.myh.chapter_14.Repository;
    
    import com.myh.chapter_14.domain.Comment;
    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.data.jpa.repository.Query;
    
    //Repository接口中为操作数据库的方法
    /*
      继承了JpaRepository接口,其中有操作数据库的curd方法,也用方法关键字的形式来操作数据库,或者使用@Query注解的方式来操作数据库
     */
    public interface CommentRepository extends JpaRepository<Comment,Integer> {
    
        //根据评论id来修改评论作者author
        //通过updateComment()方法对应的@Query注解来操作数据库
        @Query("update t_commet c set c.author = ?1 where c.id = ?2") //通过该标签来操作数据库
        public int updateComment(String author, Integer id);
    }
    
⑤ 编写 “业务操作列” Service文件
  • 项目中创建 service包,在该包创建一个用于操作Comment相关业务操作Service实体类

    CommentController.java

    package com.myh.chapter_14.controller;
    
    import com.myh.chapter_14.domain.Comment;
    import com.myh.chapter_14.service.CommentService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.bind.annotation.RestController;
    
    //@ResponseBody注解 : 将方法的返回值转换为"指定类型",存入响应体中,然后响应给“前端”
    @RestController // 该注解等于 @ResponseBody 注解 + @Controller注解
    public class CommentController {
    
        @Autowired
        private CommentService commentService;
    
        /**
         * findById()方法
         */
        @GetMapping("/get/{id}") //路径变量,用@PathVariable()注解来接受路径变量
        public Comment findById(@PathVariable("id") int comment_id) {
            Comment comment = commentService.findById(comment_id);
            return comment;
        }
    
        /**
         * updateComment()方法
         */
        @GetMapping("/update/{id}/{author}") //路径变量,用@PathVariable()注解来接受路径变量
        public Comment updateComment(@PathVariable("id") int comment_id,@PathVariable("author") String author) {
            Comment comment = commentService.findById(comment_id);
            comment.setAuthor("张三");
            Comment updateComment = commentService.updateComment(comment);
            return updateComment;
        }
    
        /**
         * deleteComment()方法
         */
        @GetMapping("/delete/{id}}") //路径变量,用@PathVariable()注解来接受路径变量
        public void deleteComment(@PathVariable("id") int comment_id) {
            commentService.deleteComment(comment_id);
        }
    
    }
    
⑥ 编写 “application.properties配置文件”
  • application.properties

    #配置数据库信息
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.datasource.url=jdbc:mysql://localhost:3306/springbootdata?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT&nullCatalogMeansCurrent=true
    spring.datasource.username=root
    spring.datasource.password=root
    
    #显示使用JPA进行"数据库查询"的SQL语句,用于展示操作的Sql语句
    #这个属性决定了是否应该在控制台打印出SQL查询语句
    spring.jpa.show-sql=true
    
⑦ 项目测试 ( 实际开发中的"问题突显",用 “缓存技术” 能解决这个问题 )
  • 启动项目项目启动成功后,在浏览器上访问 http://localhost:8080/get/1 查询 id为1用户评论信息,此时 假设在浏览器一直刷新访问这个 网址,就会有以下 这种情况:

    浏览器每刷新访问一次服务器端控制台就会输出一条sql语句同时会再执行一次sql操作页面显示还是那一条数据 。( 存在一个实际开发中的问题,这个问题会消耗数据库的性能消耗服务器资源,同时数据库性能下降也会影响 用户的体验 ,这是一个要被解决的问题 )


    在这里插入图片描述


在这里插入图片描述

  • 之所以出现上面两图情况,这是因为 没有Spring Boot项目开启缓存管理。在没有缓存管理情况下,虽然数据表中数据没有发生变化,但是 每执行
    一次查询操作本质执行同样的SQL 语句),都会访问一次数据库并执行一次SQL 语句随着时间的积累,系统的用户不断增加数据规模越来越大
    数据库的操作会直接影响用户的使用体验,此时使用缓存往往是解决这一问题非常好的一种手段

1.2 Spring Boot “默认缓存体验”

  • 前面搭建Web应用 基础上,开启Spring Boot默认支持缓存体验Spring Boot缓存使用效果
(1) 使用 “@EnableCaching” 注解 开始 “缓存管理”
  • 使用 @EnableCaching注解开启 基于注解缓存支持 ,在 项目启动类加入该注解即可 :

    @SpringBootApplication
    @EnableCaching //开启SpringBoot基于注解的"缓存管理"支持
    public class Chapter14Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Chapter14Application.class, args);
        }
    }
    
(2) 使用 “@Cacheable( )” 注解对 “数据操作方法” 进行 “缓存管理” ( 将该注解放在service类的“操作方法”上,让其对"查询结果" 进行 “缓存” )
  • 使用 “@Cacheable ( )注解对 “数据操作方法” 进行 “缓存管理”。 将 @Cacheable( )注解标注Service类查询方法上,对查询结果进行缓存 :


    在这里插入图片描述


CommentService.java :

package com.myh.chapter_14.service;

import com.myh.chapter_14.Repository.CommentRepository;
import com.myh.chapter_14.domain.Comment;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;

import java.util.Optional;

/**
 * 使用 @Cacheable()注解开启“缓存管理” : 将查询到的结果存储到“缓存空间”中,下次访问该方法时,不会再去查数据库,而是从“缓存空间”中拿数据
 */
@Service //将该类加入到ioc容器中
public class CommentService { //业务操作类 : 关于操作Comment类相关的业务的CommentService业务类 ( 该类执行业务操作代码 )

    @Autowired
    private CommentRepository commentRepository;

/**
     *  调用CrudRepository接口中的findById()方法来操作数据库
     */
    /*
       ①@Cacheable()注解的作用 :
       添加该注解后,Spring在执行该方法之前会检查缓存中是否有“该查询”的结果,如果有则从其中取出结果,如果没有才去数据库查询
       ②@Cacheable("comment") 中的comment为该"缓存空间"的名称,用区分不同的缓存

       key = "comment_id" 设置该缓存数据的key(“缓存数据”的唯一标识),key属性的值默认为: 方法中参数的值
       key : 表示"缓存数据"的唯一标识
     */
    //
    @Cacheable(cacheNames = "comment",key = "comment_id") //开启“缓存管理”,缓存空间名称为: comment
public Comment findById(int comment_id) { //comment_id的值默认为 该“缓存”的唯一标识( "缓存数据"对应的“key”)
        //调用CrudRepository接口中的findById()方法来操作数据库,有一个返回值类型为Optional<T>类型的对象
        Optional<Comment> optional = commentRepository.findById(comment_id);
        if (optional.isPresent()) { //用于检查Optional对象"是否包含"一个"值"
            return  optional.get(); //返回这个Optional对象包含的"值"
        }
        return null;
    }

}

上述代码中,在CommentService类中的 findByld( int comment_id )方法上添加了 @Cacheable( )注解,该注解作用
查询结果 : Comment 存放
Spring Boot默认缓存 中 名称为 : comment名称空间 中。

对应缓存唯一标识 ( 即缓存数据对应的主键 key ) 默认方法参数comment_id的值

(3) Spring Boot默认缓存测试
  • 启动项目,通过浏览器继续访问 “http:/localhost:8080/get/1” 查询id1用户评论信息。此时不论浏览器刷新多少次访问同一个用户评论信息页面的查询结果会显示同一条数据,但**重点**是 后端不用进行多次数据库操作了,此时后端只进行了一次数据库操作


    在这里插入图片描述


    在这里插入图片描述

二、Spring Boot “缓存注解” 介绍 :

  • 上面的内容我们通过使用 @EnableCaching@Cacheable 注解实现了 Spring Boot默认基于注解缓存管理,除此之外,还有更多的 缓存注解以及注解属性可以配置优化缓存管理

@EnableCaching 注解 ( 用在 “主程序启动类” 上)

  • @EnableCaching 注解 是由 Spring框架提供的,Spring Boot框架该注解进行了 继承,该注解需要 配置在类上(在Spring Boot中 ,通常 配置项目启动类上),用于 开启基于注解缓存支持

@Cacheable( ) 注解 ( 作用于"类" 或 “方法”,通常用在 “数据查询” 方法上 )

  • @Cacheable 注解也是由 Spring 框架提供的,可以作用于类或方法通常用数据查询查法上),用于 对方法的查询结果 进行 缓存存储 ( 将查询结果 存储在 “缓存空间” 中 )。

  • @Cacheable( )注解执行顺序是,先进行"缓存查询" ( 即在缓存空间查询是否有符合要求数据 ) ,如果 为空进行 “方法查询”如果不为空,则直接使用缓存数据 ( 此时不再进行"方法查询" )

  • @Cacheable( )注解多个属性,用于对“缓存存储”进行相关配置具体属性 及 说明 如下表所示

    属性名说明
    value / cacheNames指定缓存空间名称必配属性。这两个属性 二选一使用
    ps :
    如果 @Cacheable( ) 注解 只有 valuecacheNames( )一个属性时,则该属性的属性名可省略
    key指定==缓存数据key== ( 该“缓存”的 唯一标识),默认使用 方法参数值,可以使用SpEL表达式
    keyGenerator指定 缓存数据key生成器与key属性二选一使用
    cacheManager指定 缓存管理器
    cacheResolver指定 缓存解析器,与 cacheManager属性二选一使用。
    condition指定符合某条件“进行” 数据缓存
    unless指定符合某条件下“不进行” 数据缓存
    sync指定 是否使用 “异步缓存”默认 false

value / cacheNames 属性 ( 指定存储"缓存数据"的 “空间的名称” )

  • value属性cacheNames 属性 作用相同,用于 指定缓存名称空间 ( 指定“缓存空间”的 名称 ),可以同时指定多个名称空间(例如 @Cacheable ( cacheNames = {“comment1”,“comment2”} ) )。
  • 如果 @Cacheable( ) 注解 只有 valuecacheNames( )一个属性时,则该属性的属性名可省略,例如 @Cacheable(“comment”)指定了缓存的名称空间为 comment

key 属性 ( 指定“缓存数据” 对应的 “key / 唯一标识” , 通过这个key就能找到“缓存数据” )

  • key属性作用是指定 缓存数据 对应的 唯一标识默认使用注解标记的方法参数值也可以使用 SpEL表达式

  • 缓存数据本质Map类型数据key用于 指定唯一标识value用于指定缓存数据
    如果缓存数据时,没有指定key属性Spring boot默认提供的
    配置类 SimpleKeyGenerator会通过 generateKey( Object…params)方法参数生成key值默认情况下,如果 generateKey( )方法有一个参数参数值就是key属性的值

    如果generateKey( )方法没有参数,那么key属性是一个空参SimpleKey[]对象,如果有多个参数,那么 key属性是一个带参SimpleKey[params1],[param2,…]]对象

  • 除了使用默认key属性值外,还可以 手动指定key属性值,或者是使用Spring框架提供的SpEL表达式。关于 缓存中支持SpEL表达式说明下表所示 :

    名称位置描述
    methodNameroot对象当前被调用方法名#root.methodName
    methodroot对象当前被调用方法#root.method.name
    targetroot对象当前被调用的 目标对象实例#root.target
    targetClassroot对象当前被调用的目标对象#root.targetClass
    argsroot 对象当前 被调用的方法参数列表#root.args[0]
    cachesroot对象当前 被调用的方法缓存列表#root.caches[0].name
    Argument执行上下文当前 被调用方法参数,可以用#参数名或者#a0、#p0的形式表示
    ( 0代表参数索引,从0开始 )
    #comment_id、#a0、#p0
    result执行上下文当前方法执行后返回结果#result

keyGenerator属性

keyGenerator属性kev属性 本质作用 相同,都是用于指定缓存数据key,只不过 keyGenerator 属性指定的不是具休的 key值,而是 key值生成器规则其中 指定的生成器生成 具体key 。使用时, kevGenerator属性与key属性要二者选一。关于自定义key值生成器定义,可以参考Sprina Boot默认配置类SimoleKavGenerator的定义方式。

cacheManager / cacheResolver属性

cacheManaaercacheResolver属性分别用于指定缓存管理器缓存解析器,这两个属性也是二选一使用,默认情况不需要配置,如果存在多个缓存管理器(如 RedisEhcache 等 ),可以 使用这两个属性分别指定

condition 属性

condition属性用于对数据进行 有条件的选择性存储,只有当指定条件true时才会对查询结果进行缓存,可以使用 SpEL表达式指定属性值
例如@Cacheable(cacheNames = “comment ,condition =”#comment_id>10") 表示方法参数comment_id值大于10才会对结果数据进行缓存

unless属性

unless属性作用condition属性相反,当指定的条件true时,方法的返回值不会被缓存unless属性可以使用SpEL表达式指定
例如@Cacheable(cacheNames = "comment ,unless= “#result==nul”) 表示只有查询结果不为空才会对结果数据进行缓存存储

sync属性

sync属性表示数据缓存过程是否使用异步模式默认值false

CachePut 注解 ( 作用于"类" 或 “方法”,通常用在 “数据更新” 方法上 )

  • @CachePut注解是由Spring框型提供的,可以作用于 方法 ( 通常用在"数据更新" 方法 上),该 注解的作用 是 : "更新"缓存数据
  • CachePut 注解执行顺序先进行 “方法调用”,然后将"方法结果" 更新到缓存中。
  • @CachePut注解提供了多个属性,这些属性@Cacheable注解属性完全相同

@CacheEvict 注解 ( 作用于"类" 或 “方法”,通常用在 “数据删除” 方法上 )

  • @CacheEvict 注解是由Spring框架提供的,可以作用于 方法(通常用在 “数据删除” 方法上),该 注解的作用"删除" 缓存数据

  • @CacheEvict 注解默认执行顺序是 : 先进行方法调用然后清除缓存

  • @CacheEvict注解提供了多个属性,这些属性@Cacheable注解属性基本相同除此之外@CacheEvic注解额外提供了两个特殊属性 : allEntriesbeforelnvocation其说明如下 :


    (1) allEntries属性

    allEntries属性表示是否清除指定缓存空间中的所有缓存数据默认值false ( 即 默认只删除指定key对应缓存数据 )。
    例如 :
    @CacheEvict (cacheNames = “comment” , allEntries = true ) 表示 : 方法执行后删除缓存空间 comment中**所有的数据**。


    (2 beforelnvocation属性
    beforeInvocation属性表示 是否 在 ==方法执行之前进行 缓存清除默认值为 false ( 即默认执行方法后 再进行缓存清除==)。
    例如 : @CacheEvict ( cacheNames = “comment” , beforelnvocation = true) 表示在方法执行之前 进行 缓存清除

    需要注意的是 :
    如果将
    @CacheEvict 注解beforelnvocation属性
    设置为 true,会 存在一定的弊端

    例如进行数据删除方法中发生了 异常,这会导致实际数据并没有被删除,但是缓存数据被提前清除了。

@Caching注解 ( 作用于"类" 或 “方法” )

  • 如果 处理复杂规则数据缓存 可以使用 @Caching 注解注解 作用于 ****或者 方法

  • @Caching注解包含 cacheableputevict 三个属性,他们的 作用等同于 @Cacheable@CachePut@CacheEvict实例代码如下 :

    /**
    * 使用@Caching注解
    */
        @Caching(cacheable = {@Cacheable(cacheNames = "comment",key = "#id")},
                put = {@CachePut(cacheNames = "comment",key = "#result.author")})
        public Comment getComment(int comment_id) {
            return commentRepository.findById(comment_id).get(); //将从数据库中获得数据,作为"返回值"return
        }
    

    上述代码中,根据id执行查询操作,并将查询到Comment对象进行 缓存管理。从代码中可以看出,@Caching注解作用于 getComment( )方法上,并在 @Caching注解中使用了 cacheableput两个属性 ,并且cacheable 和 put两个属性 嵌套引入 @Cacheable和 @CachePut两个注解,在两个注解中 分别使用#id#result.author 缓存key的值

@CacheConfig注解 ( 作用于"类" )

  • @CacheConfig注解作用于,主要用于 统筹管理类中所有使用@CacheableCacheEvict@CacheEvict 注解标注方法中的 公共属性,这些公共属性包括 : cacheNameskeyGeneratorcacheManagercacheResolver示例代码如下 :

    CommentService.java

    package com.myh.chapter_14.service;
    
    import com.myh.chapter_14.Repository.CommentRepository;
    import com.myh.chapter_14.domain.Comment;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cache.annotation.CacheConfig;
    import org.springframework.cache.annotation.CachePut;
    import org.springframework.cache.annotation.Cacheable;
    import org.springframework.cache.annotation.Caching;
    import org.springframework.stereotype.Controller;
    import org.springframework.stereotype.Service;
    
    import java.util.Optional;
    
    
    @Service //将该类加入到ioc容器中
    /**
    
     * 统筹该类下的所有使用@Cacheable()注解、@CachePut()注解、@CacheEvict()注解 , 比如此处统筹其下的方法的“缓存空间”都统一设置为"comment"
       */
         @CacheConfig(cacheNames = "comment")
         public class CommentService {  
    
       @Autowired
       private CommentRepository commentRepository;
    
    
        @Cacheable(cacheNames = "comment",key = "comment_id") 
        public Comment findById(int comment_id) { 
            Optional<Comment> optional = commentRepository.findById(comment_id);
            if (optional.isPresent()) { 
                return  optional.get();
            }
            return null;
        }
    
    }
    
    

    上述代码中,CommentService 类上标注了 @CacheConfig注解,同时使用 cacheNames属性缓存空间统一设置为 comment,这样在 该类中所有方法 上使用 缓存注解时 可以省略相应cacheNames属性


    需要说明的是 :如果在类上使用了 @CacheConfig 注解定义了某个属性(例如 cacheNames同时又在该类方法中使用缓存注解定义相同的属性,那么该属性值会使用“就近原则”,方法上注解中的属性值为准

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue2进阶之Vue2高级用法

Vue2高级用法 mixin示例一示例二 plugin插件自定义指令vue-element-admin slot插槽filter过滤器 mixin 示例一 App.vue <template><div id"app"></div> </template><script> const mixin2{created(){console.log("mixin creat…

美团财务科技后端一面:如何保证数据一致性?延时双删第二次失败如何解决?

更多大厂面试内容可见 -> http://11come.cn 美团财务科技后端一面&#xff1a;项目内容拷打 美团财务科技后端一面&#xff1a;项目相关面试题&#xff0c;主要包含 Zset、延时双删失败重试、热点数据解决、ThreadLocal 这几个方面相关的内容 由于前几个问题是对个人项目的…

展览展会媒体媒体邀约执行应该怎么做?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 展览展会邀请媒体跟其他活动邀请媒体流程大致相同&#xff0c;包括 制定媒体邀约计划&#xff0c;准备新闻稿&#xff0c;发送邀请函&#xff0c;确认媒体参会&#xff0c;现场媒体接待及…

神经网络中正则化和正则化率的含义

在神经网络中&#xff0c;正则化是一种用于防止模型过拟合的技术。过拟合是指模型在训练数据上表现得很好&#xff0c;但是对于未见过的新数据&#xff0c;其泛化能力却很差。正则化通过在损失函数中添加一个额外的项来惩罚模型的复杂度&#xff0c;从而鼓励模型学习更加简单、…

OpenHarmony UI动画-lottie

简介 lottie是一个适用于OpenHarmony的动画库&#xff0c;它可以解析Adobe After Effects软件通过Bodymovin插件导出的json格式的动画&#xff0c;并在移动设备上进行本地渲染。 下载安裝 ohpm install ohos/lottieOpenHarmony ohpm 环境配置等更多内容&#xff0c;请参考如何…

浅写个登录(无js文件)

全部代码如下&#xff0c;无需编写wxss文件&#xff0c;渲染都在style里面&#xff1a; <view style"height: 250rpx;width: 100%;"> <!-- 背景图片 --><view style"position: absolute; background-color: antiquewhite; height: 250rpx;width…

Java学习-Module的概念和使用、IDEA的常用设置及常用快捷键

Module的概念和使用 【1】在Eclipse中我们有Workspace (工作空间)和Project (工程)的概念&#xff0c;在IDEA中只有Project (工程)和Module (模块)的概念。 这里的对应关系为: IDEA官网说明: An Eclipse workspace is similar to a project in IntelliJ IDEA An Eclipse pr…

2、MATLAB入门常用命令

一、退出和中断 exit和quit&#xff1a;结束MATLAB会话。程序完成&#xff0c;如果没有明确保存&#xff0c;则变量中的数据丢失。 Ctrl c&#xff1a;中断一个MATLAB任务。例如&#xff0c;当MATLAB正在计算或打印时&#xff0c;中断一个任务&#xff0c;但会话并没有结束。…

TensorFlow 1.x的学习

.为什么还有很多人都选择使用TensorFlow 1.x 兼容性问题: TensorFlow 1.x在一些旧项目中已经得到了广泛应用&#xff0c;这些项目可能依赖于1.x版本的特定API或行为。升级到2.x可能需要大量的代码修改和测试工作&#xff0c;对于一些已经稳定运行的项目&#xff0c;维护者可能…

【观察】容器化部署“再简化”,云原生体验“再升级”

自2013年云原生概念被提出以来&#xff0c;云原生技术和架构在过去十多年得到了迅速的发展&#xff0c;并对数字基础设施、应用架构和应用构建模式带来了深刻的变革。根据IDC预测&#xff0c;到2024年&#xff0c;新增的生产级云原生应用在新应用的占比将从2020年的10%增加到60…

HTML5+JavaScript实现本地视频/音频播放器

HTML5JavaScript实现本地视频/音频播放器 HTML5 提供了本地视频和音频播放器的支持&#xff0c;通过 <video> 和 <audio> 标签&#xff0c;这些标签支持多种媒体格式&#xff0c;并且可以通过 JavaScript 进行控制&#xff0c;实现功能比较完整的本地视频音频播放器…

车载终端丨车载平板丨车载平板电脑丨提升车队管理水平

随着电商、互联网和智能制造等行业的快速发展&#xff0c;物流需求不断增加&#xff0c;车载终端作为物流企业管理的重要工具&#xff0c;具有广泛的市场需求。车载平板是一种集成了计算机和显示屏的设备&#xff0c;可以用于车辆管理、车队调度、运输监控等方面&#xff0c;可…

探索Java世界中的七大排序算法(上)

文章目录 排序的概念直接插入排序希尔排序( 缩小增量排序)选择排序堆排序冒泡排序 在计算机科学中&#xff0c;排序算法是一类重要的算法&#xff0c;它们用于将一组元素按照一定的顺序进行排列。在Java编程中&#xff0c;我们经常需要对数组或集合进行排序操作。本文将介绍Jav…

React Ant Design 简单实现如何选中图片

效果&#xff1a; 代码&#xff1a; 定义的初始值和方法 const [selected, setSelected] useState(0); // 表示当前选中的图片索引const handleClick (index) > {if (selected index) {setSelected(null); // 如果点击的是已选中的图片&#xff0c;则取消选中状态} else…

单节锂离子/锂聚合物电池保护IC SDG3JX

SDG3JX内置高精度电压检测电路和延迟电路&#xff0c;适用于锂离子/锂聚合物可充电电池的保护IC。SDG3JX 最适合于对单节锂离子/锂聚合物可充电电池组的过充电、过放电和过电流的保护。 特点  内置高精度电压检测电路 * 过充电检测电压:4.28V0.025V&#xff1b; * 过充电解除…

小例子Flask网站开发—Cookies(四)

Cookies是服务器保存在用户浏览器端的数据片段&#xff0c;用于跟踪和识别用户。Cookies是当您浏览网站时&#xff0c;网站可以在您的计算机或移动设备上存储的小型文本文件。它们通常以键值对&#xff08;key/value&#xff09;的形式存储信息&#xff0c;并且每次您访问特定网…

.Net RabbitMQ(消息队列)

文章目录 一.RabbitMQ 介绍以及工作模式1.RabbitMQ的介绍&#xff1a;2.RabbitMQ的工作模式&#xff1a; 二.RabbitMQ安装1.安装Erlang语言环境2.安装RabbitMQ 三.在.Net中使用RabbitMQ1.HelloWorld模式2.工作队列模式3.发布订阅模式4.Routing路由模式和Topics通配符模式 一.Ra…

安全开发实战(4)--whois与子域名爆破

目录 安全开发专栏 前言 whois查询 子域名 子域名爆破 1.4 whois查询 方式1: 方式2: 1.5 子域名查询 方式1:子域名爆破 1.5.1 One 1.5.2 Two 方式2:其他方式 总结 安全开发专栏 安全开发实战​​http://t.csdnimg.cn/25N7H 前言 whois查询 Whois 查询是一种用…

java.lang.OutOfMemoryError: WrappedJavaFileObject --idea启动项目内存溢出解决

java.lang.OutOfMemoryError 解决方案 现象 项目开发时&#xff0c;启动idea&#xff0c;报内存溢出错误&#xff0c;如下&#xff1a; java: java.lang.OutOfMemoryError: WrappedJavaFileObject.....解决 通过 调整idea 的 配置参数 来调整 jvm 大小解决。 -Xmx8192m-Xm…

C++进修——C++基础入门

初识C 书写HelloWorld #include <iostream> using namespace std;int main() {cout << "HelloWorldd" << endl;system("pause");return 0; }注释 作用&#xff1a;在代码中加一些说明和解释&#xff0c;方便自己或其他程序员阅读代码…