java开发——程序性能的优化方法

news2024/11/25 16:54:09

java开发——程序性能的优化方法

  • 1、算法逻辑优化
  • 2、redis缓存优化
  • 3、异步编排
  • 4、MQ削峰填谷
  • 5、预加载
  • 6、sql调优
  • 7、jvm调优
  • 8、集群搭建

后端开发必须学习的优化思想!

1、算法逻辑优化

(1) 什么算法优化?
算法优化的思想就是,对于同一个问题,选择更好的办法去解决。

(2) 算法优化的详细解释

  算法优化可以说是性能优化的关键点,一个好的算法和常规算法往往有一个数量级的差别,比如暴力的O(n2)和优化后的O(n*log(n)),在1000的数据量下差大概1000倍,在1000000的数据量下差的是1000000倍,性能的差距是幂次上升的,数据量越大,差距越明显。

  本来1秒能出结果的,现在需要1000000秒约12天才能出结果,可以看到,不做算法优化的话这个服务基本是不可用的

  算法千变万化,对于不同的问题需要采取不一样的方法,一些复杂的逻辑问题往往是需要专门的算法工程师去设计解决方案的,

2、redis缓存优化

(1) redis缓存优化的原理
  把用户第一次查询的结果缓存起来,下次再查询的时候就不再跑程序,直接取缓存中的数据
在这里插入图片描述

  在查询数据时往往不止一次查询数据库,而且在封装数据的时候可能需要经过一定的算法处理。所以在在redis缓存中直接取数据会比查询数据库获取数据要快得多

(2) redis缓存优化的小例子
1、创建一个spring boot项目,导入web和redis依赖,配置application.yml文件,配置MyCacheConfig.java文件

pom文件依赖如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.wu</groupId>
    <artifactId>hello</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>hello</name>
    <description>hello</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
<!--        lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
<!--        热部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
<!--        web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
<!--        spring使用缓存-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>
<!--        redis-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
    </dependencies>


</project>

在这里插入图片描述

application.yml文件配置如下:

server:
  port: 8080

spring:
  redis:
    host: 47.115.230.86
    port: 6379

  cache:
    type: redis
    redis:
      time-to-live: 300000
      cache-null-values: true
ribbon:
  eager-load:
    enabled: true
    clients: eureka-provider

MyCacheConfig.java文件配置如下:

package com.wu.hello.config;

import org.springframework.boot.autoconfigure.cache.CacheProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;


@EnableConfigurationProperties(CacheProperties.class)
@Configuration
@EnableCaching
public class MyCacheConfig {
    
    @Bean
    RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties){

        RedisCacheConfiguration config  = RedisCacheConfiguration.defaultCacheConfig();
        //设置key用string类型保存,value用json格式保存
        config = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()));
        config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));

        CacheProperties.Redis redisProperties = cacheProperties.getRedis();
        //使配置文件中所有的配置都生效
        if (redisProperties.getTimeToLive() != null) {
            config = config.entryTtl(redisProperties.getTimeToLive());
        }
        if (redisProperties.getKeyPrefix() != null) {
            config = config.prefixKeysWith(redisProperties.getKeyPrefix());
        }
        if (!redisProperties.isCacheNullValues()) {
            config = config.disableCachingNullValues();
        }
        if (!redisProperties.isUseKeyPrefix()) {
            config = config.disableKeyPrefix();
        }

        return config;
    }

}

2、创建HelloController程序并启动项目

package com.wu.hello.controller;


import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

//    springCacheable可以是实现查询redis,如果有直接返回数据,没有再查
    @Cacheable(value ={"HelloApplication"},key = "#root.methodName" )
    @RequestMapping("hello")
    public String hello() throws InterruptedException {
        System.out.println("要等十秒咯");
        Thread.sleep(10000);//睡眠十秒
        return "你好啊!";
    }
}

在这里插入图片描述

3、使用可视化工具连接redis
在这里插入图片描述
4、第一次访问发现需要等十秒
在这里插入图片描述
在这里插入图片描述
5、发现redis多了个数据,后面再请求时以下就请求到了!
在这里插入图片描述
在这里插入图片描述

3、异步编排

(1) 什么异步编排?
  一个程序在不改变原本结果的情况下让其以异步的方式运行
在这里插入图片描述
在这里插入图片描述

(2) 异步的编排的小例子
1、接着redis例子往下做,配置application.properties文件


ikun-thread.core-size=20
ikun-thread.max-size=200
ikun-thread.keep-alive-time=10

在这里插入图片描述

2、添加ThreadPoolConfigProperties.java配置文件

package com.wu.hello.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@ConfigurationProperties(prefix = "ikun-thread")
@Component
@Data
public class ThreadPoolConfigProperties {
    private Integer coreSize;
    private Integer maxSize;
    private Integer keepAliveTime;
}

在这里插入图片描述

3、添加MyThreadConfig.java配置文件

package com.wu.hello.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

@Configuration
public class MyThreadConfig {

    @Bean
    public ThreadPoolExecutor threadPoolExecutor(ThreadPoolConfigProperties pool){
        return new ThreadPoolExecutor(pool.getCoreSize(), pool.getMaxSize(), pool.getKeepAliveTime(), TimeUnit.SECONDS,
                new LinkedBlockingDeque<>(100000),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy());
    }


}

在这里插入图片描述

5、HelloController.java修改为以下程序

package com.wu.hello.controller;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;

import javax.xml.crypto.Data;
import java.util.Date;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ThreadPoolExecutor;

@RestController
public class HelloController {


    @Autowired
    ThreadPoolExecutor executor;

    @RequestMapping("hello1")
    public String hello1() throws InterruptedException {
        Date date1 = new Date();
        Thread.sleep(5000);
        Thread.sleep(5000);
        Thread.sleep(5000);
        Thread.sleep(5000);
        Date date2 = new Date();
        long t = (date2.getTime() - date1.getTime())/1000;
        return "您一共等待了"+t+"秒";
    }

    @RequestMapping("hello2")
    public String hello2() {


        Date date1 = new Date();
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();

        CompletableFuture<Void> sleep1 = CompletableFuture.runAsync(() -> {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }, executor);
        CompletableFuture<Void> sleep2 = CompletableFuture.runAsync(() -> {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }, executor);
        CompletableFuture<Void> sleep3 = CompletableFuture.runAsync(() -> {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }, executor);
        CompletableFuture<Void> sleep4 = CompletableFuture.runAsync(() -> {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }, executor);
        CompletableFuture.allOf(sleep1,sleep2,sleep3,sleep4).join();
        Date date2 = new Date();
        long t = (date2.getTime() - date1.getTime())/1000;
        return "您一共等待了"+t+"秒";
    }

}

在这里插入图片描述

6、看传统和异步的区别
在这里插入图片描述
在这里插入图片描述
可以看到传统需要20秒,异步只需要5秒

4、MQ削峰填谷

(1) MQ优化原理
  MQ(Message Queue)消息队列,把紧急的资源先处理了,不需要立马处理的请求先放到消息队列里面,空闲的时候再处理。
  举个例子,淘宝京东等商品秒杀,瞬时间流量太大,如果开单、减库存、更新用户积分数据等等全部流程都跑完,那么用户那边就会感觉很卡顿,那么久还没有反馈信息。MQ优化之后就是,用户提交的信息我收到了,就立马和用户说我收到了,然后把请求的数据存到消息队列中,等服务器流量少的时候再去开单、减库存、更新用户积分数据。

(2) MQ优化的小例子
1、延时队列,假设秒杀活动1分钟结束,那么可以等一分钟之后再执行开单、减库存、更新用户积分数据

2、添加消息队列依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

在这里插入图片描述

3、添加MQ配置文件MyRabbitConfig.java

package com.wu.ikun.skill.config;

import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;

@Configuration
public class MyRabbitConfig {

    @Autowired
    RabbitTemplate rabbitTemplate;

    @PostConstruct
    public void initRabbitTemplate(){
        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
            @Override
            public void confirm(CorrelationData correlationData, boolean b, String s) {
//                System.out.println("confirm...correlation["+correlationData+"]==>ack["+b+"]");
            }
        });

        rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
            @Override
            public void returnedMessage(Message message, int i, String s, String s1, String s2) {

            }
        });
    }


    @Bean
    public MessageConverter messageConverter(){
        return new Jackson2JsonMessageConverter();
    }
}

4、添加MQ配置文件MyCacheConfig.java

package com.wu.hello.config;

import org.springframework.boot.autoconfigure.cache.CacheProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;


@EnableConfigurationProperties(CacheProperties.class)
@Configuration
@EnableCaching
public class MyCacheConfig {

    @Bean
    RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties){

        RedisCacheConfiguration config  = RedisCacheConfiguration.defaultCacheConfig();
        //设置key用string类型保存,value用json格式保存
        config = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()));
        config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));

        CacheProperties.Redis redisProperties = cacheProperties.getRedis();
        //使配置文件中所有的配置都生效
        if (redisProperties.getTimeToLive() != null) {
            config = config.entryTtl(redisProperties.getTimeToLive());
        }
        if (redisProperties.getKeyPrefix() != null) {
            config = config.prefixKeysWith(redisProperties.getKeyPrefix());
        }
        if (!redisProperties.isCacheNullValues()) {
            config = config.disableCachingNullValues();
        }
        if (!redisProperties.isUseKeyPrefix()) {
            config = config.disableKeyPrefix();
        }

        return config;
    }

}

5、修改配置文件application.yml

server:
  port: 8080

spring:
  redis:
    host: 47.115.230.86
    port: 6379

  cache:
    type: redis
    redis:
      time-to-live: 300000
      cache-null-values: true


  rabbitmq:
    host: 47.115.230.86
    port: 5672
    virtual-host: /
    template:
      mandatory: true
    publisher-returns: true
    publisher-confirm-type: simple
    listener:
      simple:
        acknowledge-mode: manual


ribbon:
  eager-load:
    enabled: true
    clients: eureka-provider

6、修改HelloController.java

package com.wu.hello.controller;

import com.rabbitmq.client.Channel;
//import io.seata.spring.annotation.GlobalTransactional;
import org.springframework.amqp.core.AmqpAdmin;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.util.Date;

@RestController
public class HelloController {

    @Autowired
    RabbitTemplate rabbitTemplate;



    @RabbitListener(queues = "order.release.order.queue")
    public void listener(String msg, Channel channel, Message message) throws IOException {
        System.out.println("秒杀时间过来,开始开单、减库存、更新用户积分数据"+msg+ "----" + new Date().toString());
        channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);

    }

    @ResponseBody
    @RequestMapping("/create/order")
    public String createOrderEntity(){

        for (int i = 0; i < 10; i++) {
            rabbitTemplate.convertAndSend("order-event-exchange","order.create.order",i + " " + new Date().toString());
        }
        return "创建10个订单成功!";
    }

}

7、启动服务,发现MQ已经创建好配置的交换机、队列等等
在这里插入图片描述

8、模拟用户发单
在这里插入图片描述
9、1分钟后,后台收到用户信息,并开始开单等等
在这里插入图片描述

5、预加载

(1) 预加载优化原理
  猜测出用户会发出请求,趁用户不注意先把数据查出来,放到缓存中,用户真正去请求数据的时候会感觉非常快!
在这里插入图片描述

6、sql调优

(1) sql调优原理
这个优化有很多方面:
sql代码方面: 坚决不使用联表查询
sql存储方面: 建索引,实际上就是底层用空间换时间,b+树把时间复杂度从O(n)优化到了O(log(n)),优化了一个数量级
编程方面: 坚决不循环查表,需要单个单个数据的时候,可以把数据先全部取出,存到map里面,用的时候在map里查,这样可以把时间复杂度从O(n2)优化到了O(n*log(n)),优化了一个数量级,并且优化的了数据库的连接时间

7、jvm调优

(1) jvm调优原理
  找出最符合目前情况的jvm运行参数,最主要的就是分配内存。内存配过小,垃圾回收机制(Garbage Collection)会被频繁触发,导致程序性能下降。内存分配过大,资源浪费严重。

(2) jvm简介
jvm(Java Virtual Machine),java虚拟机

Java虚拟机是一个想象中的机器,在实际的计算机上通过软件模拟来实现。Java虚拟机有自己想象中的硬件,如处理器、堆栈、寄存器等,还具有相应的指令系统。

jvm的内存模型:
在这里插入图片描述

堆的垃圾回收分区:
在这里插入图片描述

gc流程:
在这里插入图片描述

(3) jvm调优步骤
1、预测服务的平均被访问量,例如为300次

2、设置服务最大内存100M
在这里插入图片描述

3、编写一个接口,睡眠两秒,并启动服务

在这里插入图片描述

4、使用测试工具JMeter对hello接口发起300个线程,每个线程无限请求
在这里插入图片描述

5、使用jvisualvm查看服务gc的情况
在这里插入图片描述

在这里插入图片描述

可以看到gc数据,堆的内存变化等,根据压力测试的结果不断去找到一组合适的jvm参数

在这里插入图片描述
在JMeter可以看到请求的一些信息,请求吞吐量、错误率等等,可以更好地分析哪个地方可以优化

8、集群搭建

(1) 集群搭建优化原理
  在服务器上启动多个相同的服务,这些服务都可以做相同的事情。用户请求过来的时候可以根据代理算法分配到较为空闲的服务上执行,解决服务器压力问题。
在这里插入图片描述

测试项目源码链接: https://pan.baidu.com/s/11LUO38lmnp7lBQTQaxCRcw?pwd=fkdu
提取码: fkdu

觉得还不错就点个赞吧!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ll 内容详解

linux的数据存储是以block&#xff08;块&#xff09;为单位的 &#xff1a; 1个block 4 KB 4096 字节 1KB 1024 字节[rootCTF-RHCSA-2 ~]# ll -sh total 76K &#xff08;列表中 所有文本文件 总共占用磁盘空间的KB大小 &#xff09;&#xff08;root用户家目录中…

cortex A7核按键中断实验

cortex A7核按键中断实验 一、分析电路图 实验目的&#xff1a;完成板子三个按键操作 1.1 电路图IO口 KEY1------>PF9 KEY2------>PF7 KEY3------>PF8 1.2 工作原理 KEY1 ------> PF9 ------> 按键触发方式&#xff1a;下降沿触发 KEY2 ------> PF7 …

ElasticSearch安装与介绍

目录 ElasticSearch安装与介绍Elastic Stack简介ElasticsearchLogstashKibanaBeats ElasticSearch快速入门简介下载单机版安装启动ElasticSearch 错误分析错误情况1错误情况2错误情况3 ElasticSearch-Head可视化工具通过Docker方式安装通过Chrome插件安装 ElasticSearch中的基本…

docker部署prometheus+grafana+alertmanager+dingtalk实现钉钉告警

目录 docker安装准备工作镜像拉取容器启动启动node-exporter启动prometheus启动grafana启动webhook-prometheus-dingtalk启动alertmanager所有容器启动成功如下 将prometheus和alertmanager进行关联在prometheus目录下新建一个rules.yml文件的告警规则修改prometheus.yml文件&a…

NLP学习笔记十二-skip-gram模型求解

NLP学习笔记十一-skip-gram模型求解 上一篇文章&#xff0c;我们见到了skip-gram模型的原理&#xff0c;这里我们在陈述一下skip-gram模型其实是基于分布相似性原理来设计的&#xff0c;在skip-gram模型中&#xff0c;他认为一个词的内涵可以由他的上下文文本信息来概括&#…

AcWing 837. 连通块中点的数量

题目如下&#xff1a; 给定一个包含 n个点&#xff08;编号为 1∼ n&#xff09;的无向图&#xff0c;初始时图中没有边。 现在要进行 m 个操作&#xff0c;操作共有三种&#xff1a; C a b&#xff0c;在点 a和点 b之间连一条边&#xff0c;a 和 b 可能相等&#xff1b;Q1 …

【iMessage苹果日历推真机群控】使用虚拟化平台创建一个 macOS 虚拟机

PC 虚拟机上部署群控推送并模拟苹果 iMessage 推送消息是比较复杂的任务。由于苹果的 iMessage 服务是基于苹果设备和操作系统的&#xff0c;模拟 iMessage 推送需要考虑苹果的生态系统和安全机制。 以下是一种可能的方法&#xff0c;但请注意这是一个高级设置&#xff0c;需要…

chatgpt赋能python:Python编程中的放大代码技巧

Python 编程中的放大代码技巧 Python 是一门广泛应用于各个领域的编程语言。由于它易学易用、可移植性好、开发效率高等特点&#xff0c;使其在人工智能、大数据分析、网站开发等领域被广泛应用。在实际编程中&#xff0c;随着代码量的增加&#xff0c;需要更好地组织和管理代…

BFS 广度优先搜索

广度优先搜索BFS&#xff08;Breadth First Search&#xff09;也称为宽度优先搜索&#xff0c;它是一种先生成的结点先扩展的策略&#xff0c;类似于树的层次遍历。 在广度优先搜索算法中&#xff0c;解答树上结点的扩展是按它们在树中的层次进行的。首先生成第一层结点&#…

TS系列之keyof详解,示例

文章目录 前言一、keyof是什么总结 前言 如果你用过TS的工具类型&#xff0c;Partial、Required、Pick、Record。那么你可能看过他们内部实现都有共同点就是keyof关键字。即使没有见过&#xff0c;那么下面就一起来了解一下&#xff0c;keyof关键字的详细作用吧。 一、keyof是…

Filebeat详细介绍,下载和启动,日志读取和模块设置等

目录 Filebeat介绍为什么要用Filebeat&#xff1f;架构下载启动读取文件自定义字段输出到ElasticSearch Filebeat工作原理harvesterprospectorinput启动命令参数说明 部署Nginx读取Nginx中的配置文件Modulenginx module 配置配置filebeat测试错误1错误2 Filebeat 介绍 Filebe…

Java开发中的常见问题和解决方法:如何解决常见的性能和bug问题

章节一&#xff1a;引言 在Java开发中&#xff0c;我们经常会面临各种各样的问题&#xff0c;包括性能问题和Bug。这些问题可能会导致应用程序的运行变慢、不稳定甚至崩溃。本文将介绍一些常见的Java开发问题&#xff0c;并提供解决这些问题的方法和技巧&#xff0c;帮助开发人…

ElasticSearch集群8.0版本搭建、故障转移

目录 ElasticSearch集群集群节点搭建集群分片和副本 故障转移将data节点停止将master节点停止 分布式文档路由文档的写操作 搜索文档全文搜索搜索&#xff08;query&#xff09;取回 fetch ElasticSearch集群 集群节点 ELasticsearch的集群是由多个节点组成的&#xff0c;通过…

SSM学习记录9:SpringBoot整合SSM(注解方式)

SSM学习记录9&#xff1a;SpringBoot整合SSM&#xff08;注解方式&#xff09; 1.首先创建新项目&#xff0c;选择Spring Initializr&#xff0c;type为Maven 2.接着依赖选择Spring Web 3.无需繁琐配置&#xff0c;即可运行编写的controller类 启动SpringBootDemoApplication↓…

利用人工智能模型学习Python爬虫

爬虫是一种按照一定的规则&#xff0c;自动地抓取万维网信息的程序或者脚本。 网络爬虫(又称为网页蜘蛛&#xff0c;网络机器人)是其中一种类型。 爬虫可以自动化浏览网络中的信息&#xff0c;当然浏览信息的时候需要按照我们制定的规则进行&#xff0c;这些规则我们称之为网络…

UE4/5样条线学习(一):基础的样条线使用

目录 效果展示&#xff1a; 制作&#xff1a; 组件 逻辑 效果展示&#xff1a; 注&#xff1a;按住alt拉轴可以拉出多一个点 制作&#xff1a; 第一步我们创建一个蓝图&#xff0c;命名为BP_Sline&#xff1a; 组件 之后我们开始找组件&#xff0c;输入bill&#xff0c;我…

使用 docker 创建 mongodb 副本集, 和调整副本集优先级

mongod 本地创建副本集 mongod --port 27017 --dbpath /srv/mongodb/db0 --replSet rs0 --bind_ip localhost,<hostname(s)|ip address(es)> –dbpath 指向数据存放地址 –replSet 后面为 副本集的名。 rs.initiate() 启动新的副本集 rs.conf() 查看副本集的配置 rs.stat…

chatgpt赋能python:Python实现多关键词搜索PDF文件

Python实现多关键词搜索PDF文件 概述 在今天的数字化社会中&#xff0c;很多信息都以数字化的形式存储在PDF文件中。这让我们在搜索特定信息时面临很多挑战&#xff0c;特别是当我们需要同时搜索多个PDF文件并集中检索这些文件时。 在这篇文章中&#xff0c;我们将介绍如何使…

HTTP协议,带你了解HTTP协议

目录 1、HTTP 协议介绍 2、HTTP 协议的工作过程 HTTP 协议的工作过程可以分为以下几个步骤&#xff1a; 3、Fiddler 抓包工具介绍 3.1 抓包工具的使用 3.2 抓包结果 3.3 抓包工具原理 4、HTTP 协议格式总览 5、HTTP 请求&#xff08;Request&#xff09; 5.1 认识 URL…

Seata分布式事务实现

docker方式搭建seata-server(推荐) 参考官方文档: 使用 Docker 部署 Seata Server docker run -d --name seata-server -p 8091:8091 -p 7091:7091 seataio/seata-server:1.6.1 根据版本情况使用不同版本的镜像: https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7…