Spring Boot | Spring Boot 实现 “Redis缓存管理“

目录 :

  • Spring Boot 实现 "Redis缓存管理" :
    • 一、Spring Boot 支持的 "缓存组件" ( 如果 “没有” 明确指定使用自定义的 "cacheManager "或 "cacheResolver" ,此时 SpringBoot会按照“预先定义的顺序” 启动一个默认的 “缓存组件” 来进行 "缓存管理" )
    • 二、基于 "注解" 的 "Redis缓存管理" :
        • ① 准备数据
        • ② 创建项目 + 开启Mysql服务 + 开启Redis服务
        • ③ 在配置"全局配置文件" 中 "配置信息"
        • ④ 在配置"主程序启动类" 中开启 "基于注解" 的 "缓存支持"
        • ⑤ 编写 “数据库表” 对应的 “实体类” ( 要实现"序列化" )
        • ⑥ 编写 “操作数据库” 的 Repository接口文件 ( 通过该接口中的方法来 操作“Mysql数据库” )
        • ⑦ 编写 "控制器层"的 controller 对象
        • ⑧ 编写 "业务操作层"的 service 对象
        • ⑨ 基于 "注解" 的 "缓存管理" 测试
    • 三、基于 "API" ( RedisTemplate类 ) 的 "Redis缓存管理"
      • 31. "RedisTemplate类"的 功能介绍 ( 通过该类可以在Java中 "操作Redis数据库 " )
      • 3.2 基于 "API" ( RedisTemplate类 ) 的 "Redis缓存管理" - 案例演示 :
        • ① 准备数据
        • ② 创建项目 + 开启Mysql服务 + 开启Redis服务
        • ③ 在配置"全局配置文件" 中 "配置信息"
        • ④ 编写 “数据库表” 对应的 “实体类” ( 要实现"序列化" )
        • ⑤ 编写 “操作数据库” 的 Repository接口文件 ( 通过该接口中的方法来 操作“Mysql数据库” )
        • ⑥ 编写 "控制器层"的 controller 对象
        • ⑦ 编写 "业务操作层"的 service 对象
        • ⑧ 基于 API ( RedisTemplate类 ) 的 "缓存管理" 测试

在这里插入图片描述

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

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

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

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


Spring Boot 实现 “Redis缓存管理” :

一、Spring Boot 支持的 “缓存组件” ( 如果 “没有” 明确指定使用自定义的 "cacheManager "或 “cacheResolver” ,此时 SpringBoot会按照“预先定义的顺序” 启动一个默认的 “缓存组件” 来进行 “缓存管理” )

  • Spring Boot 中,数据的 "管理存储"依赖于 Spring 框架中 cache ( 缓存 ) 相关的 :
    org.springframework.cache.
    Cache

    org.springframework,cache.CacheManager ( 缓存管理器 )。

  • 如果程序中 没有 定义类型cacheManager ( 缓存管理器 ) 的 Bean 组件或者是 没有 名为 cacheResolver ( 缓存解析器 ) ,
    Spring Boot按照以下的顺序选择并启动 缓存组件

  • 选择并启用以下缓存组件( 按照指定的顺序 ) :

    Generic

    JCache (JSR -107 ) ( EhCache 3HazelcastInfinispan等 )

    EhCache 2.x

    Hazelcast

    (5) Infinispan

    (6) Couchbase

    (7) Redis

    (8) Caffeine

    (9) Simple ( 默认"缓存组件" , SpringBoot 默认使用该“缓存组件” 来 进行 “缓存管理” )


    上面我们按照 Spring Boot 缓存组件加载顺序 列举了 支持的9种缓存组件,在项目中 添加某个缓存管理组件 (例如 Redis) Spring Boot 项目会
    选择并启用对应的缓存管理器

  • 如果项目中 同时添加多个缓存组件,且 没有指定缓存管理器 /缓存解析器( cacheManager/cacheResolver ),那么 Spring Boot 按照 “指定的顺序” 来 选择使用 其中的一个 “缓存组件” 并进行“缓存管理” 。

  • Spring Boot默认的 “缓存管理” 项目 文章讲解Spring Boot默认缓存管理中,没有添加 任何缓存管理组件却能实现缓存管理。这是因为开启缓存管理后
    如果 没有指定具体的"cacheManager "或 “cacheResolver,SpringBoot 将按照 指定的顺序选择并使用缓存组件” 。

  • 如果没有任何缓存组件,会 默认使用最后一个Simple 缓存组件进行管理Simple 缓存组件Spring Boot默认缓存管理组件,它默认使用内存ConcurrentHashMap 进行 缓存存储,所以在没有添加任何第三方缓存组件的情况下也可以实现内存中的缓存管理

二、基于 “注解” 的 “Redis缓存管理” :

① 准备数据

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

springbootdata.sql

② 创建项目 + 开启Mysql服务 + 开启Redis服务
  • 在这里插入图片描述


    项目目录结构 为 :
    在这里插入图片描述

③ 在配置"全局配置文件" 中 “配置信息”
  • 在配置"全局配置文件" : application.properties 中 “配置信息” :

    application.properties

    # mysql服务信息
    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语句
    spring.jpa.show-sql=true
    
    #Redis服务地址
    spring.data.redis.host=127.0.0.1
    #Redis服务器连接端口
    spring.data.redis.port=6379
    #Reids服务器连接密码(默认为空)
    spring.data.redis.password=123456
    
    #对基于注解的Redis缓存数据统一设置"有效期"为 1分钟,单位为"毫秒"
    spring.cache.redis.time-to-live= 60000
    
④ 在配置"主程序启动类" 中开启 “基于注解” 的 “缓存支持”
  • 在配置"主程序启动类" 中开启 “基于注解” 的 “缓存支持


    在这里插入图片描述

    Chapter19Application.properties

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cache.annotation.EnableCaching;
    
    @SpringBootApplication
    @EnableCaching //开启 基于 注解的缓存支持
    public class Chapter19Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Chapter19Application.class, args);
        }
    
    }
    
⑤ 编写 “数据库表” 对应的 “实体类” ( 要实现"序列化" )
  • 编写 “数据库表” 对应的 “实体类” ( 要实现"序列化" ) :

    Comment.java

    import jakarta.persistence.*;
    
    import java.io.Serializable;
    
    //指定该实现类映射的数据库表
    @Entity(name = "t_Comment") //设置ORM实体类, 并指定对应的表明
    /*
       SpringBoot中的 Redis缓存管理 默认情况下使用的序列化机制为: JDK序列化机制
       ①JDK序列化机制需要在实体类中实现 Serializable序列化接口
     */
    public class Comment implements Serializable { // implements Serializable : 进行序列化,存储数据进Redis数据库时需要
    
        //表示数据库表中主键对应的属性
        @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接口文件 ( 通过该接口中的方法来 操作“Mysql数据库” )
  • 编写 “操作数据库” 的 Repository接口文件 :

    CommentRepository.java

    import com.myh.chapter_17.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> {
    
    }
    
⑦ 编写 "控制器层"的 controller 对象
  • 编写 "控制器层"的 controller 对象 :

    CommentController.java

    import com.myh.chapter_19.domain.Comment;
    import com.myh.chapter_19.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;
    
    
    @Controller //将该类加入到IOC容器中
    @ResponseBody //将方法的返回值转换为指定的类型 存储到响应体中
    public class CommentController { //控制层操作类
    
        @Autowired
        private CommentService commentService;
    
        /**
         * 查询数据
         */
        @GetMapping("/findById/{id}") //传递的参数为: 路径变量
        public Comment findById(@PathVariable("id")  int comment_id) {
            Comment comment = commentService.findById(comment_id);
            return comment;
        }
    
    
        /**
         * 更新数据
         */
        @GetMapping("/updateComment/{id}/{author}")
        public Comment updateComment(@PathVariable("id")  int comment_id,@PathVariable("author")  String author) {
            Comment comment = commentService.updateComment(comment_id, author);
            return comment;
        }
    
        /**
         * 删除数据
         */
        @GetMapping("/deleteComment/{id}")
        public void deleteComment(@PathVariable("id")  int comment_id) {
            commentService.deleteComment(comment_id);
        }
    
    }
    
⑧ 编写 "业务操作层"的 service 对象
  • 编写 "业务操作层"的 service 对象 :

    CommentService.java

    import com.myh.chapter_19.domain.Comment;
    import com.myh.chapter_19.repository.CommentRepository;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cache.annotation.CacheEvict;
    import org.springframework.cache.annotation.CachePut;
    import org.springframework.cache.annotation.Cacheable;
    import org.springframework.stereotype.Service;
    
    import java.util.Optional;
    
    @Service //加入到ioc容器中
    public class CommentService {
    
        @Autowired
        private CommentRepository commentRepository;
    
        /**
         * 查询数据
         */
        @Cacheable(cacheNames = "comment",key = "#comment_id")
        public Comment findById(int comment_id) {
            Optional<Comment> option = commentRepository.findById(comment_id);
            //判断其中是否有数据
            if (option.isPresent()) {
                //获得该数据
                return  option.get();
            }
            return null;
        }
    
        /**
         *  更新数据
         */
        @CachePut(cacheNames = "comment",key = "#result.id") //key为更新的结果的主键id
        public Comment updateComment(int commentId, String author) {
            Comment comment = findById(commentId);
            comment.setAuthor(author);
    
            comment = commentRepository.save(comment);
            return comment;
        }
    
        /**
         *  删除数据
         */
        @CacheEvict(cacheNames = "comment",key = "#commentId") //用SpEL表达式来赋值
        public void deleteComment(int commentId) {
            System.out.println("指定id的数据库数据删除成功!");
            //commentRepository.deleteById(commentId);
        }
    }
    
⑨ 基于 “注解” 的 “缓存管理” 测试
  • 基于"注解" 的 “缓存管理” 测试 :
    访问 controller类 中的 url进行测试即可


    启动项目访问成功后可以在Redis可视化界面 上看到存储的”缓存数据 , 如下图所示

    在这里插入图片描述

三、基于 “API” ( RedisTemplate类 ) 的 “Redis缓存管理”

  • SpringBoot 整合 Redis 缓存实现中,除了基于注解形式Redis 缓存实现外,还有一个开发中常用的方式基于 “API” 的 “Redis缓存实现” ,下面将通过 Redis API 的方式讲解 SpringBoot 整合 Redis缓存具体实现

31. "RedisTemplate类"的 功能介绍 ( 通过该类可以在Java中 "操作Redis数据库 " )

  • RedisTemplate类 ( Redis模板类 )是 Spring 框架提供的用于与 Redis 数据库进行交互工具类 ( 通过 该类 可以在 Java 中 "操作Redis数据库 " ) 。
  • RedisTemplate 类Spring Data Redis 提供的 直接进行Redis操作Java API ( 通过该操作Redis数据库 ),可以直接注入使用,相比于Jedis 更加简便
  • RedisTemplate 可以 操作 <Object,Object >对象类型 数据,而其子类 StringRedisTemplate则是专门针对<String,String>字符串类型 的数据进行操作
  • RedisTemplate 类中提供了很多操作Redis数据库方法, 可以进行数据缓存查询缓存更新缓存修改缓存删除以及设置缓存有效期等。

3.2 基于 “API” ( RedisTemplate类 ) 的 “Redis缓存管理” - 案例演示 :

① 准备数据

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

springbootdata.sql

② 创建项目 + 开启Mysql服务 + 开启Redis服务
  • 在这里插入图片描述


    项目目录结构 为 :
    在这里插入图片描述

③ 在配置"全局配置文件" 中 “配置信息”
  • 在配置"全局配置文件" : application.properties 中 “配置信息” :

    application.properties

    # mysql服务信息
    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语句
    spring.jpa.show-sql=true
    
    #Redis服务地址
    spring.data.redis.host=127.0.0.1
    #Redis服务器连接端口
    spring.data.redis.port=6379
    #Reids服务器连接密码(默认为空)
    spring.data.redis.password=123456
    
④ 编写 “数据库表” 对应的 “实体类” ( 要实现"序列化" )
  • 编写 “数据库表” 对应的 “实体类” ( 要实现"序列化" ) :

    Comment.java

    import jakarta.persistence.*;
    
    import java.io.Serializable;
    
    //指定该实现类映射的数据库表
    @Entity(name = "t_Comment") //设置ORM实体类, 并指定对应的表明
    /*
       SpringBoot中的 Redis缓存管理 默认情况下使用的序列化机制为: JDK序列化机制
       ①JDK序列化机制需要在实体类中实现 Serializable序列化接口
     */
    public class Comment implements Serializable { // implements Serializable : 进行序列化,存储数据进Redis数据库时需要
    
        //表示数据库表中主键对应的属性
        @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接口文件 ( 通过该接口中的方法来 操作“Mysql数据库” )
  • 编写 “操作数据库” 的 Repository接口文件 :

    CommentRepository.java

    import com.myh.chapter_17.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> {
    
    }
    
⑥ 编写 "控制器层"的 controller 对象
  • 编写 "控制器层"的 controller 对象 :

    ApiCommentController.java

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;
    
    @RestController // 将该类加入到IOC容器中 + 将方法的返回值转换为指定的类型 存储到响应体中
    @RequestMapping("/api")
    public class ApiCommentController { //控制层操作类
    
        @Autowired
        private ApiCommentService apiCommentService;
    
        /**
         * 查询数据
         */
        @GetMapping("/get/{id}") //传递的参数为: 路径变量
        public Comment findById(@PathVariable("id")  int comment_id) {
            Comment comment = apiCommentService.findById(comment_id);
            return comment;
        }
    
        /**
         * 更新数据
         */
        @GetMapping("/update/{id}/{author}")
        public Comment updateComment(@PathVariable("id")  int comment_id,@PathVariable("author")  String author) {
            Comment updateComment = apiCommentService.updateComment(comment_id, author);
            return updateComment;
        }
    
        /**
         * 删除数据
         */
        @GetMapping("/delete/{id}")
        public void deleteComment(@PathVariable("id")  int comment_id) {
           apiCommentService.deleteComment(comment_id);
        }
    
    
    }
    
⑦ 编写 "业务操作层"的 service 对象
  • 编写 "业务操作层"的 service 对象 :

    ApiCommentService.java

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.core.ValueOperations;
    import org.springframework.stereotype.Service;
    
    import java.util.Optional;
    import java.util.concurrent.TimeUnit;
    
    @Service //加入到IOC容器中
    public class ApiCommentService { //业务操作类
    
        @Autowired
        private CommentRepository commentRepository;  //该接口继承了JPA相关的接口,通过其中的方法可操作Mysql数据库
    
        @Autowired
        private RedisTemplate redisTemplate; //通过该类可在Java中操作Redis数据库
    
        /**
           从Mysql数据库中查询到数据后,将该数据存储到缓存中 (存储到Redis数据库中 )
         */
       public Comment findById(int comment_id) {
           //从Redis数据库中获取"缓存数据"
           ValueOperations valueOperations = redisTemplate.opsForValue();
           Object object = valueOperations.get(comment_id);
           if (object != null) {//如果在Redis数据库中查询数据则返回
               return (Comment) object;
           } else {
               //Reids中(缓存中)没有,进行数据库查询
               Optional<Comment> optional = commentRepository.findById(comment_id);
               //判断从数据库中是否查询到数据
               if (optional.isPresent()) {
                   //获得该数据
                   Comment comment = optional.get();
                   //将从Mysql数据库中的查询结果进行"缓存" ( 缓存到Redis数据库中 ) , 设置有效期为1天
                   //设置的为Redis中的字符串数据
                   valueOperations.set(comment_id, comment, 1, TimeUnit.DAYS); //有效期为1天
                   return comment;
               } else {
                   return null;
               }
           }
       }
    
    
        /**
          更新Mysql数据库中的数据后,也更新缓存中的数据 (即同时也更新Redis数据库中的数据)
         */
        public Comment updateComment(int comment_id,String author) {
            Comment comment = findById(comment_id);
            comment.setAuthor(author);
            comment = commentRepository.save(comment);
    
            //更新Mysql数据库中数据后,同时也更新缓存中的数据 ( 即更新Redis中的数据 )
            ValueOperations valueOperations = redisTemplate.opsForValue();
            valueOperations.set(comment_id,comment);
    
            return comment;
        }
    
    
        /**
         * 删除Mysql数据库中数据后,也删除Redis中的缓存数据
         */
        public void deleteComment(int comment_id) {
            //commentRepository.deleteById(comment_id);
            System.out.println("Mysql数据库中对应的数据删除成功.....");
    
            //删除Mysql数据库中数据后,也删除Redis数据库中的"缓存数据"
            Boolean commentId = redisTemplate.delete(comment_id);
            if (commentId) {
                System.out.println("Redis数据库中对应的缓存数据-删除成功.....");
            }
        }
    
    }
    
⑧ 基于 API ( RedisTemplate类 ) 的 “缓存管理” 测试
  • 基于 API ( RedisTemplate类 ) 的 “缓存管理” 测试 :
    访问 controller类 中的 url进行测试即可


    启动项目访问成功后可以在Redis可视化界面 上看到存储的”缓存数据 , 如下图所示

    在这里插入图片描述

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

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

相关文章

免费SSL证书和付费SSL证书区别在哪

SSL证书免费和付费的区别有&#xff1a; 1.证书类型不同&#xff0c;免费SSL证书只有域名验证性型&#xff0c;付费SSL证书有域名验证型、企业验证型和组织验证型&#xff1b; 2.使用限制不同&#xff0c;免费SSL证书只能绑定单个域名、不支持通配符域名、多域名等&#xff0…

4.28java项目小结

这几天完成了用户修改资料模块的功能&#xff0c;实现了修改用户头像&#xff0c;昵称等信息&#xff0c;并且对数据库进行了操作&#xff0c;大致画了好友资料的页面的内容&#xff0c;这两天尽量完成表的创建&#xff0c;建立多对多的关系&#xff0c;实现好友的添加功能。

代码随想录:二叉树29-30

目录 701.二叉搜索树中的插入操作 题目 代码&#xff08;迭代法走一边&#xff09; 代码&#xff08;递归法走一边&#xff09; 450.删除二叉搜索树中的节点 题目 代码&#xff08;递归法走一边&#xff09; 701.二叉搜索树中的插入操作 题目 给定二叉搜索树&#xff…

centos7 openresty lua 自适应webp和缩放图片

目录 背景效果图准备安装cwebp等命令&#xff0c;转换文件格式安装ImageMagick&#xff0c;压缩文件下载Lua API 操控ImageMagick的依赖包 代码参考 背景 缩小图片体积&#xff0c;提升加载速度&#xff0c;节省流量。 效果图 参数格式 &#xff1a; ?image_processformat,…

在IDEA中使用.env文件导入系统配置的图文教程

JetBrains的IDEA是一款功能强大的集成开发环境&#xff0c;为开发人员提供了丰富的功能和工具。使用.env文件来管理配置信息在IDEA中非常简单。 旧版本默认支持&#xff0c;新版本idea需要安装插件才可以。 这里我们可以安装EnvFile插件&#xff0c;步骤如下&#xff1a; 在弹…

centos 7 安装 JDK 和Rockmq

1、版本说明 CentOS版本&#xff1a;使用 cat /etc/redhat-release 命令查看centos版本。 本次版本是&#xff1a;CentOS Linux release 7.9.2009 (Core) JDK版本是&#xff1a;jdk-8u401-linux-x64.tar.gz RockeqMQ版本&#xff1a;rocketmq-all-4.9.2-bin-release.zip …

Vue 组件单元测试深度探索:细致解析与实战范例大全

Vue.js作为一款广受欢迎的前端框架&#xff0c;以其声明式的数据绑定、组件化开发和灵活的生态系统赢得了广大开发者的心。然而&#xff0c;随着项目规模的增长&#xff0c;确保组件的稳定性和可靠性变得愈发关键。单元测试作为软件质量的守护神&#xff0c;为Vue组件的开发过程…

人脸识别系统架构

目录 1. 系统架构 1.1 采集子系统 1.2 解析子系统 1.3 存储子系统 1.4 比对子系统 1.5 决策子系统 1.6 管理子系统 1.7 应用开放接口 2. 业务流程 2.1 人脸注册 2.2 人脸验证 2.2.1 作用 2.2.2 特点 2.2.3 应用场景 2.3 人脸辨识 2.3.1 作用 2.3.2 特点 2.3.3…

学习STM32第二十天

低功耗编程 一、修改主频 STM32F4xx系列主频为168MHz&#xff0c;当板载8MHz晶振时&#xff0c;系统时钟HCLK满足公式 H C L K H S E P L L N P L L M P L L P HCLK \frac{HSE \times PLLN}{PLLM \times PLLP} HCLKPLLMPLLPHSEPLLN​&#xff0c;在文件stm32f4xx.h中可修…

HTML 学习笔记

html 超文本标记语言&#xff08;英语&#xff1a;HyperText Markup Language&#xff0c;简称&#xff1a;HTML&#xff09;是一种用于创建网页的标准标记语言。 1.HTML文档的后缀名 (1) .html (2) .htm 这里更推荐使用 ".html "&#xff0c;命名应该遵从含义清…

FPGA 以太网概念简单学习

1 MAC和PHY 从硬件的角度来说&#xff0c;以太网接口电路主要由 MAC &#xff08; Media Access Control &#xff09;控制器和物理层接口 PHY&#xff08;Physical Layer &#xff0c; PHY &#xff09;两大部分构成。 MAC 指媒体访问控制子层协议&#xff0c;它和 PHY 接…

SpringMVC进阶(自定义拦截器以及异常处理)

文章目录 1.自定义拦截器1.基本介绍1.说明2.自定义拦截器的三个方法3.流程图 2.快速入门1.Myinterceptor01.java2.FurnHandler.java3.springDispatcherServlet-servlet.xml配置拦截器4.单元测试 3.拦截特定路径1.拦截指定路径2.通配符配置路径 4.细节说明5.多个拦截器1.执行流程…

刷代码随想录有感(49):找树左下角的值

题干&#xff1a; 用层序遍历方便些&#xff0c;因为只需要把res不断替换成每一层第一个节点值即可&#xff0c;代码如下&#xff1a; class Solution { public:int findBottomLeftValue(TreeNode* root) {queue<TreeNode*>que;if(root ! NULL)que.push(root);int res …

逆向案例三十——webpack登录某游戏

网址&#xff1a;aHR0cHM6Ly93d3cuZ205OS5jb20v 步骤&#xff1a; 进行抓包分析&#xff0c;找到登录接口&#xff0c;发现密码有加密 跟栈分析&#xff0c;从第三个栈进入&#xff0c;打上断点&#xff0c;再次点击登录 明显找到password,它由o赋值&#xff0c;o由a.encode(…

【哈希】Leetcode 面试题 01.02. 判定是否互为字符重排

题目讲解 面试题 01.02. 判定是否互为字符重排 算法讲解 直观的想法&#xff1a;我们找到一个字符串的全排列&#xff0c;然后对比当前的排列是否等于另一个字符串。如果两个字符串如果互为排列&#xff0c;所以我们知道两个字符串对应的字符出现的个数相同&#xff0c;那么…

在config.json文件中配置出来new mars3d.graphic.PolylineCombine({大量线合并渲染类型的geojson图层

在config.json文件中配置出来new mars3d.graphic.PolylineCombine({大量线合并渲染类型的geojson图层 问题场景&#xff1a; 1.浏览官网示例的时候图层看到大量线数据合并渲染的示例 2.矢量数据较大量级的时候&#xff0c;这种时候怎么在config.json文件中尝试配置呢&#x…

高并发内存池: 介绍

一.功能介绍 功能: 用于实现高效的多线程内存管理(替代系统的内存分配相关的函数(malloc, free)) 性能的提升: 池化技术, 锁竞争的减小处理内存碎片: 内碎片, 外碎片 池化技术: 概念:预先向系统申请过量的资源, 自己管理.->提高性能(每次申请资源都有较大的开销, 提前申…

数字文旅重塑旅游发展新生态:以数字化转型为契机,推动旅游产业的创新发展,提升旅游服务的智能化、网络化和个性化水平

目录 一、引言 二、数字化转型推动旅游产业创新发展 1、数字化转型提升旅游产业效率 2、数字化转型拓展旅游产业边界 3、数字化转型促进旅游产业可持续发展 三、提升旅游服务智能化、网络化和个性化水平 1、智能化提升旅游服务体验 2、网络化拓宽旅游服务渠道 3、个性…

OpenHarmony实战开发-多层级手势事件

多层级手势事件指父子组件嵌套时&#xff0c;父子组件均绑定了手势或事件。在该场景下&#xff0c;手势或者事件的响应受到多个因素的影响&#xff0c;相互之间发生传递和竞争&#xff0c;容易出现预期外的响应。 本章主要介绍了多层级手势事件的默认响应顺序&#xff0c;以及…

【大学生电子竞赛题目分析】——2023年H题《信号分离装置》

今年的大赛已临近落幕&#xff0c;笔者打算陆续对几个熟悉领域的题目作一番分析与讨论&#xff0c;今天首先分析H题。 网上有一些关于H题的分析&#xff0c;许多都是针对盲信号分析的。然而本题具有明确的信号频率范围&#xff0c;明确的信号可能频率&#xff0c;明确的信号波…