ElasticSearch基本使用

概述

安装

关于ES的安装不做重点讲解,这里提供一个k8s基于sts创建以及ingress访问的模板文件。

---
apiVersion: apps/v1
kind: StatefulSet
metadata:labels:app: elasticsearchcomponent: masterrelease: elasticsearchname: elasticsearch-masternamespace: es
spec:podManagementPolicy: OrderedReadyreplicas: 3revisionHistoryLimit: 10selector:matchLabels:app: elasticsearchserviceName: elasticsearch-mastertemplate:metadata:labels:app: elasticsearchcomponent: masterrelease: elasticsearchspec:affinity:podAntiAffinity:preferredDuringSchedulingIgnoredDuringExecution:- podAffinityTerm:labelSelector:matchLabels:app: elasticsearchcomponent: masterrelease: elasticsearchtopologyKey: kubernetes.io/hostnameweight: 1containers:- env:- name: NODE_DATAvalue: 'true'- name: NODE_MASTERvalue: 'true'- name: NODE_INGRESTvalue: 'true'- name: DISCOVERY_SERVICEvalue: elasticsearch-discovery- name: PROCESSORSvalueFrom:resourceFieldRef:divisor: '0'resource: limits.cpu- name: ELASTICSEARCH_USERNAMEvalue: elastic- name: ELASTIC_PASSWORDvalue: your_password- name: ES_JAVA_OPTSvalue: '-Djava.net.preferIPv4Stack=true -Xms512m -Xmx512m '- name: MINIMUM_MASTER_NODESvalue: '2'image: 'your_image'imagePullPolicy: IfNotPresentname: elasticsearchports:- containerPort: 9300name: transportprotocol: TCP- containerPort: 9200name: httpprotocol: TCPreadinessProbe:failureThreshold: 3httpGet:path: /_cluster/health?local=trueport: 9200scheme: HTTPinitialDelaySeconds: 5periodSeconds: 10successThreshold: 1timeoutSeconds: 1resources:limits:cpu: '1'requests:cpu: 25mmemory: 512MiterminationMessagePath: /dev/termination-logterminationMessagePolicy: FilevolumeMounts:- mountPath: /usr/share/elasticsearch/dataname: data- mountPath: /usr/share/elasticsearch/config/elasticsearch.ymlname: configsubPath: elasticsearch.ymldnsPolicy: ClusterFirstimagePullSecrets:- name: registry-secretinitContainers:- command:- sysctl- '-w'- vm.max_map_count=262144image: 'your_image'imagePullPolicy: IfNotPresentname: sysctlsecurityContext:privileged: trueterminationMessagePath: /dev/termination-logterminationMessagePolicy: File- command:- /bin/bash- '-c'- >-chown -R elasticsearch:elasticsearch /usr/share/elasticsearch/data&& chown -R elasticsearch:elasticsearch/usr/share/elasticsearch/logsimage: 'your_image'imagePullPolicy: IfNotPresentname: chownsecurityContext:runAsUser: 0terminationMessagePath: /dev/termination-logterminationMessagePolicy: FilevolumeMounts:- mountPath: /usr/share/elasticsearch/dataname: datarestartPolicy: AlwaysschedulerName: default-schedulersecurityContext:fsGroup: 1000serviceAccount: elasticsearch-masterserviceAccountName: elasticsearch-masterterminationGracePeriodSeconds: 30volumes:- configMap:defaultMode: 420name: elasticsearchname: configupdateStrategy:type: RollingUpdatevolumeClaimTemplates:- metadata:name: dataspec:accessModes:- ReadWriteOnceresources:requests:storage: 3GivolumeMode: Filesystem---
apiVersion: v1
kind: Service
metadata:labels:app: elasticsearchcomponent: masterrelease: elasticsearchname: elasticsearchnamespace: es
spec:ports:- name: httpport: 9200protocol: TCPtargetPort: httpselector:app: elasticsearchcomponent: masterrelease: elasticsearchtype: ClusterIP---
apiVersion: v1
kind: Service
metadata:labels:app: elasticsearchcomponent: masterrelease: elasticsearchname: elasticsearch-discoverynamespace: es
spec:clusterIP: Noneports:- port: 9300protocol: TCPtargetPort: transportselector:app: elasticsearchcomponent: masterrelease: elasticsearchtype: ClusterIP---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:name: esnamespace: es
spec:rules:- host: your_domainhttp:paths:- backend:serviceName: elasticsearchservicePort: 9200path: /

基本概念

索引

类型

文档

映射

字段

集群

分片

DSL

使用

在了解完ES的使用场景和基本概念后,接下来开发进行一些准备工作,进入到ES的基本使用环节。

客户端工具

ES的服务端安装完成后,以及对基本概念有一定的了解,进一步使用肯定要借助一些客户端,由于ES的使用都是基于REST风格的API,因此可以使用支持HTTP请求的REST API调用工具都可以进行服务端操作,例如PostMan,这里推荐几个常用的工具如Kibana,或者Edge浏览器中可以使用的扩展插件Elasticvue、ES-client等。

基础语法

类比于关系型数据库查询的SQL语言,在ES中使用DSL语言与服务器进行交互。ES中关于数据的操作交互可以分为两大类,索引(index)操作和文档(document)操作。接下来关于REST API的调用使用Elasticvue工具进行演示。使用REST请求,因此查用的请求类型也分别对应POST、PUT、GET、DELETE。

操作索引

创建索引(映射)

索引和映射可以同时创建,也可以先创建索引,再进行映射的创建。

{"mappings": {"message": {"properties": {"messageId": {"type": "keyword"},"msgContent": {"type": "text"},"msgTitle": {"type": "text"},"receiveDate": {"type": "date","format": "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || yyyy-MM-dd HH:mm"},"subject": {"type": "text"},"userId": {"type": "keyword"},"userUrl": {"type": "keyword"}}}}
}

image

删除索引
DELETE message_idx

image

重建索引

一般创建索引时也就意味着数据结构已经确定,如果需要修改mapping信息时,那就需要对索引进行重建。

POST _reindex
{"source": {"index": "test_index"},"dest": {"index": "test_index_new"}
}

image
如果重建时间可能太长,可以添加参数?wait_for_completion=false直接返回taskId。

别名

索引别名是用于引用一个或多个现有索引的辅助名称。简单来说就是,一个索引可以通过别名进行调用,也可以使用本身的名称进行调用。一个索引可以绑定多个别名,一个别名也可以绑定多个索引。使用别名的好处主要有以下几点:

  1. 索引切换:通过使用别名,可以将一个别名绑定到一个或多个索引上。这样,在索引切换或滚动升级时,可以更新别名的绑定,而不需要修改应用程序中对索引的引用。这使得索引维护和数据迁移更加灵活和无缝。

  2. 查询分发:别名可以作为查询的目标,将查询请求分发到多个索引上。这对于在多个索引上执行相同的查询非常有用,尤其是当索引按时间进行分割或分片时。通过使用别名,可以将查询发送到所有相关的索引,而不需要显式指定每个索引的名称。

  3. 索引别名过滤:别名还可以与过滤器结合使用,以将查询限制为特定的索引或索引模式。通过为别名定义过滤条件,可以创建只包含满足特定条件的文档的虚拟索引视图。这对于数据分区、安全性和权限控制非常有用。

  4. 索引重命名:通过修改别名的绑定,可以实现索引的重命名操作。这在需要更改索引名称或将索引从一个集群迁移到另一个集群时非常有用。

通过使用别名,可以提供更灵活、更抽象的索引命名和查询操作,使得索引的管理和使用更加方便和可靠。

别名的操作使用POST _aliases,使用如下所示:

绑定/解绑别名
  1. 绑定
POST _aliases
{"actions" : [{ "add" : { "index" : "test_index", "alias" : "test_index_aliases" } }]
}
  1. 解绑
POST /_aliases
{"actions" : [{ "remove" : { "index" : "test_index", "alias" : "test_index_aliases" } }]
}
更换别名
POST /_aliases
{"actions" : [{ "remove" : { "index" : "test_index", "alias" : "test_index_aliases" } },{ "add" : { "index" : "test_index", "alias" : "test" } }]
}
绑定多个别名
POST /_aliases
{"actions" : [{ "add" : { "index" : "test_index_1", "alias" : "test" } },{ "add" : { "index" : "test_index_2", "alias" : "test" } }]
}

操作文档

文档操作可以说是ES中使用最多的操作类型了,通常也是使用相应的REST请求。这里主要介绍以下几种常用操作。

基本操作

文档的基本操作,相对于传统数据库无非也是CRUD,使用最多的就是PUT和POST操作了,关于二者的区别如下:

在 Elasticsearch 中,"PUT" 和 "POST" 是两种不同的 HTTP 方法,用于向 Elasticsearch 发送请求。

  1. PUT 方法:PUT 方法用于创建或更新文档。如果指定了文档的 ID,它将尝试将提供的文档内容放置在该 ID 对应的位置。如果该 ID 不存在,它将创建一个新的文档。如果没有指定 ID,Elasticsearch 将自动生成一个唯一的 ID,并创建一个新文档。PUT 方法是幂等的,这意味着多次执行相同的 PUT 请求会产生相同的结果。

  2. POST 方法:POST 方法用于在 Elasticsearch 中执行各种操作,包括创建文档、更新文档、搜索等。与 PUT 方法不同,POST 方法不要求指定文档的 ID。如果指定了 ID,它将尝试将提供的文档内容放置在该 ID 对应的位置。如果没有指定 ID,Elasticsearch 将自动生成一个唯一的 ID,并创建一个新文档。POST 方法不是幂等的,这意味着多次执行相同的 POST 请求可能会产生不同的结果。

总结:

  • PUT 方法用于创建或更新文档,需要指定文档的 ID,是幂等的。
  • POST 方法用于执行各种操作,包括创建或更新文档,可以不指定文档的 ID,不是幂等的。
创建文档
  • 使用PUT
    请求路径携带id,如果id不存在会自动创建数据,如果id存在会进行替换。
PUT /message_idx/message/1
{"messageId": "4585499","msgContent": "您有一条审批消息请注意查收","msgTitle": "审批提醒","receiveDate": "2023-10-31 10:00:01","subject": "消息提醒","userId": "12356","userUrl": ""
}

image

请求路径无id,可以看到服务端返回提示这种场景下应该使用POST请求。image

  • 使用POST
POST /message_idx/message
{"messageId": "4585499","msgContent": "您有一条审批消息请注意查收","msgTitle": "审批提醒","receiveDate": "2023-10-31 10:00:01","subject": "消息提醒","userId": "123567","userUrl": ""
}

使用POST可以不携带id,会自定生成id并创建数据。image
通过以上的案例可以说明PUT侧重数据的更新,POST更侧重于数据的创建,如果请求携带了id的时候POST和PUT的处理方式基本一致,区别在于请求没有携带id的场景。

另外需要注意的是:
对于请求路径格式为 POST/PUT /index_name/_doc/document_id,有以下说明

  • index_name: 索引名称
  • _doc: type类型
  • document_id: 文档id

关于_doc(type)引用官方文档有以下说明:

Elasticsearch 是一个开源的分布式搜索和分析引擎,它是基于 Apache Lucene 构建的。在 Elasticsearch 的早期版本中,它使用了一种叫做 "types" 的概念来组织文档。然而,自从 Elasticsearch 6.0 版本发布以来,types 的概念已经被弃用,并且在 Elasticsearch 7.0 版本中完全移除了。
下面是 Elasticsearch 中 type 发展历史的简要概述:

  1. Elasticsearch 1.x:在 Elasticsearch 1.x 版本中,文档被组织在索引(index)之中,并且可以在索引级别下定义多个 types。每个 type 有自己的映射(mapping),它定义了文档的字段和数据类型。这种类型的组织结构使得索引可以存储多种相关但具有不同结构的文档。
  2. Elasticsearch 2.x:随着 Elasticsearch 2.x 版本的发布,Elastic 团队开始逐渐弃用 type 的概念。虽然仍然可以在索引中定义多个 types,但 Elastic 官方建议将所有文档放在单个 type 中。这是为了减少混淆,因为很多用户都误解了 types 的含义和使用方式。
  3. Elasticsearch 6.x:在 Elasticsearch 6.0 版本中,types 被宣布为即将被移除的功能。Elastic 团队鼓励用户在升级到 Elasticsearch 6.x 时移除所有 types,并将所有文档放在单个 type 中。
  4. Elasticsearch 7.x:在 Elasticsearch 7.0 版本中,types 被完全移除。现在,文档只能被组织在一个索引中,而不是在多个 types 中。这意味着每个索引只有一个默认的 type _doc,用于存储所有文档。

总结起来,随着 Elasticsearch 的发展,type 的概念逐渐被弃用并移除。Elasticsearch 7.x 版本及更高版本中,文档被组织在索引中,而不再使用 types。这种变化简化了数据模型,并提高了 Elasticsearch 的性能和可维护性。在使用ES时也要注意版本不同导致API调用的差异,尤其是系统框架升级时更应注意升级带来的影响。

删除文档
DELETE /message_idx/message/1

注意查看返回结果。image

更新文档
POST /message_idx/message/1
{"doc": {"msgContent": "您有一条审批消息请注意查收!"}
}

这里也可以使用PUT请求。

获取文档

这里说获取文档指的是根据id进行查询的方式,关于复杂查询,后续会进行详细介绍。
根据id获取单个文档image
使用POST请求批量获取

POST /message_idx/message/_mget
{"ids": ["2","3"]
}

image

关于文档的创建、更新、删除操作主要做以上演示,在实际使用中需要注意PUT、POST在创建和更新时的细节差别,以及ES版本不同,导致请求REST API在请求路径结构商的不同。

查询操作

查询操作是ES使用中最重要的一部分内容。

Match查询

Match查询用来做基本的模糊查询,会对查询内容做分词,然后根据倒排索引去匹配文档。

  1. match_all
    match_all没有查询条件会查询所有数据,image
  2. match
    基本的匹配查询,对于分词结果只要匹配的内容即可命中。
POST /message_idx/_search
{"query": {"match": {"msgTitle": "提醒驳回"}}
}

对于输入内容提醒驳回进行分词,提醒、驳回,只要匹配这两个词都可以被命中返回数据。image
3. match_phrase
match_phrase的匹配条件较为严苛一点,需要严格匹配,会对输入的短语进行分词,并且要包含所有的分词结果并且顺序一致。

如下案例所示:imageimageimage

如果对于这种场景有特殊需求,刚好输入错误了单词或者字,ES也给出了相应的补救措施,使用slop进行修正

POST /message_idx/_search
{"query": {"match_phrase": {"msgTitle": {"query": "驳回醒","slop": 1}}}
}

image
对比场景image

此外也可以使用match_phrase_prefix进行查询匹配。可以看做match_phrase的一个扩展,他会把query的查询条件进行分词,然后把最后一个单词看做是一个前缀,匹配索引中所有以这个单词为前缀的单词,然后进行返回。

关于更多的查询场景需要,可以去关注multi_match这种match类型的检索。

Term查询

Term查询对查询内容不做分词,直接去倒排索引里去匹配文档。

POST message_idx/_search
{"query": {"term": {"msgTitle": {"value": "审批"}}}
}# 匹配多个term
POST message_idx/_search
{"query": {"terms": {"msgTitle": ["审批","驳回"]}}
}

image

组合查询
翻页查询
聚合查询
范围查询
高亮查询
分组查询
子查询
分词

ES模糊查询的强大之处在于其可以进行分词并且维护成倒排索引,分词功能的实现需要借助于一次分词插件,对于中文支持比较好的分词插件就是IK分词器。基本使用如下所示:image
对于IK分词器常用的模式有以下几种:

POST _analyze
{"analyzer": "ik_smart","text": "中华人民共和国国歌"
}
POST _analyze
{"analyzer": "ik_max_word","text": "中华人民共和国国歌"
}

补充

倒排索引

ES数据操作过程

写入过程

更新过程

删除过程

SpringBoot整合ES版本选择

上述介绍的基于REST API调用的客户端,在实际项目应用中是不能整合到系统集成的,只适合用来检索查看数据使用,Spring提供了一套关于ES的整合方案,并从属于SpringDataElasticsearch模块,针对不同版本的ES,SpringDataElasticsearch也提供了不同的适配方案,并且每个版本支持的客户端也不尽相同。

在使用的时候如果不提前选型或者做足够的了解,会遇到各种各样的坑,这里会对常用的客户端进行简介,并提供整合案例以供参考。

接下来所介绍的内容,主要参考官方文档。

客户端简介

简单来说,客户端存在的意义就是为了更好的使用ES,对服务端的数据进行操作。参考上文所提到的官方文档,目前为止,ES支持的客户端共有,Jest client、Rest client、Transport client、Node client几种,其中Jest和Rest是使用的HTTP协议,Transport client和Node client使用的是Native Elasticsearch binary协议。

在ES5.0之前官方提供的客户端只有Transport client、Node client协议,Jest为非官方支持客户端,ES5.0之后官方主推荐的为Rest客户端。

image
参考官方提醒,以及综上所述,在使用ES时尽可能的使用Rest Client。

关于Spring、SpringBoot、SpringDataElasticsearch版本的选择,可以参考如下官方提供的信息:

image

https://docs.spring.io/spring-data/elasticsearch/reference/index.html

整合案例

接下来使用SpringBoot 2.2.x及ES 6.5.x进行整合演示。

  1. 首先引入整合依赖。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
  1. 整合客户端
    官方文档提供了两种整合方式,命令式和响应式客户端。
  • 命令式
import org.springframework.data.elasticsearch.client.elc.ElasticsearchConfiguration;@Configuration
public class MyClientConfig extends ElasticsearchConfiguration {@Overridepublic ClientConfiguration clientConfiguration() {return ClientConfiguration.builder().connectedTo("localhost:9200").build();}
}
  • 响应式
import org.springframework.data.elasticsearch.client.elc.ReactiveElasticsearchConfiguration;@Configuration
public class MyClientConfig extends ReactiveElasticsearchConfiguration {@Overridepublic ClientConfiguration clientConfiguration() {return ClientConfiguration.builder().connectedTo("localhost:9200").build();}
}

如果有其他特殊配置参数需要,可以设置

import org.springframework.data.elasticsearch.client.ClientConfiguration;
import org.springframework.data.elasticsearch.support.HttpHeaders;import static org.springframework.data.elasticsearch.client.elc.ElasticsearchClients.*;HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("some-header", "on every request")ClientConfiguration clientConfiguration = ClientConfiguration.builder().connectedTo("localhost:9200", "localhost:9291").usingSsl().withProxy("localhost:8888").withPathPrefix("ela").withConnectTimeout(Duration.ofSeconds(5)).withSocketTimeout(Duration.ofSeconds(3)).withDefaultHeaders(defaultHeaders).withBasicAuth(username, password).withHeaders(() -> {HttpHeaders headers = new HttpHeaders();headers.add("currentTime", LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));return headers;}).withClientConfigurer(ElasticsearchClientConfigurationCallback.from(clientBuilder -> {// ...return clientBuilder;})). // ... other options.build();

SpringDataElasticsearch中提供了一个高级API并且整合了客户端配置,也可以呃直接使用High Level REST Client完成整合,更加快速高效。

/*** ES客户端配置* @author starsray* @date 2023/11/01*/
@Configuration
public class RestClientConfig extends AbstractElasticsearchConfiguration {@Override@Beanpublic RestHighLevelClient elasticsearchClient() {final ClientConfiguration clientConfiguration = ClientConfiguration.builder().connectedTo("localhost:9200").build();return RestClients.create(clientConfiguration).rest();}
}
  1. API使用

ES实战应用场景

ES与MySQL的数据一致性问题

https://cloud.tencent.com/developer/article/1583402https://developer.aliyun.com/article/1361781?spm=a2c6h.14164896.0.0.192e47c52jyi7n&scm=20140722.S_community@@文章@@1361781._.ID_1361781-RL_elasticsearch-LOC_searchUNDcommunityUNDitem-OR_ser-V_3-P0_0

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

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

相关文章

「Verilog学习笔记」移位运算与乘法

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 分析 1、在硬件中进行乘除法运算是比较消耗资源的一种方法&#xff0c;想要在不影响延迟并尽量减少资源消耗&#xff0c;必须从硬件的特点上进行设计。根据寄存器的原理&a…

C语言之动态内存管理实现通讯录(完整版)

我们在之前的博客中写过静态版的通讯录&#xff0c;我们今天来写一个动态版的&#xff0c;不需要规定它到底需要多大空间&#xff0c;只要还有内存&#xff0c;我们都可以存放的下&#xff01;同时&#xff0c;函数实现原理&#xff0c;我在通讯录静态版的博客里做了详细的讲解…

操作系统学习笔记(学习中)

计算机系统概述 1.操作系统概念 管理系统软/硬件资源&#xff0c;为程序提供服务 2.发展与分类 3.操作系统的运行环境 运行机制 指令&#xff1a;&#xff08;二进制机器指令&#xff09;&#xff0c;CPU能识别&#xff0c;执行的最基本命令 应用程序&#xff1a;程序员写…

Splunk 创建特色 dashboard 报表

1: 背景: 对原有的dashboard 进行增加点东西,特别是文字部分: 比如: 增加:“this is a guidline for how to use performance". 这段话,就不能写在title, 那样,这段文字,会出现在dashboard 的PDF 文件的分割线的上面,不符合要求。 2: 解决问题: 正确的做法是…

Qt学习:图形视图框架的使用

文章目录 前言一、场景、视图和图形项的介绍二、图形视图框架的坐标系统三、图形视图框架的事件处理四、示例完整代码五、QtCreator官方示例总结 前言 近期重温了一下Qt中的图形视图框架&#xff0c;这里将所学习的内容进行记录总结。这个框架提供了一个基于图形项的模型视图编…

Java配置47-Spring Eureka 未授权访问漏洞修复

文章目录 1. 背景2. 方法2.1 Eureka Server 添加安全组件2.2 Eureka Server 添加参数2.3 重启 Eureka Server2.4 Eureka Server 升级版本2.5 Eureka Client 配置2.6 Eureka Server 添加代码2.7 其他问题 1. 背景 项目组使用的 Spring Boot 比较老&#xff0c;是 1.5.4.RELEASE…

Linux生成静态库

GCC 什么是GCC GCC 是 GNU 编译器集合&#xff08;GNU Compiler Collection&#xff09;的缩写。它是一个开源的编程语言编译器&#xff0c;支持多种编程语言&#xff0c;包括 C、C、Objective-C、Fortran、Ada 和 Go 等。GCC 最初由理查德斯托曼&#xff08;Richard Stallman…

2022最新版-李宏毅机器学习深度学习课程-P32 Transformer

一、 seq2seq 1. 含义 输入一个序列&#xff0c;机器输出另一个序列&#xff0c;输出序列长度由机器决定。 文本翻译&#xff1a;文本至文本&#xff1b;  语音识别&#xff1a;语音至文本&#xff1b;  语音合成&#xff1a;文本至语音&#xff1b;  聊天机器人&#…

WPF布局控件之DockPanel布局

前言&#xff1a;博主文章仅用于学习、研究和交流目的&#xff0c;不足和错误之处在所难免&#xff0c;希望大家能够批评指出&#xff0c;博主核实后马上更改。 概述&#xff1a; DockPanel 位置子控件基于子 Dock 属性&#xff0c;你有 4 个选项停靠&#xff0c;左 (默认) &…

HarmonyOS 数据管理与应用数据持久化(二)

通过键值型数据库实现数据持久化 场景介绍 键值型数据库存储键值对形式的数据&#xff0c;当需要存储的数据没有复杂的关系模型&#xff0c;比如存储商品名称及对应价格、员工工号及今日是否已出勤等&#xff0c;由于数据复杂度低&#xff0c;更容易兼容不同数据库版本和设备…

Gradle笔记 一 Gradle的安装与入门

文章目录 Gradle 入门Gradle 简介学习Gradle 的原因&#xff1a; 常见的项目构建工具Gradle 安装Gradle 安装说明安装JDK 下载并解压到指定目录配置环境变量检测是否安装成功 Gradle 项目目录结构Gradle 创建第一个项目Gradle 中的常用指令修改maven 下载源Wrapper 包装器使用教…

项目管理之如何估算项目工作成本

在项目管理中&#xff0c;如何估算项目工作成本是一个关键问题。为了解决这个问题&#xff0c;我们可以采用自上而下的成本限额估算法和自下而上的成本汇总估算法。这两种方法各有优缺点&#xff0c;但都可以帮助我们准确地估算项目工作成本。 自上而下的成本限额估算法 自上…

InnoDB中Buffer Pool详解

1. 概念及特点 Buffer Pool 是 MySQL 中 InnoDB 存储引擎用来缓存表数据和索引数据的内存区域。这个内存区域被用来存储磁盘上的数据页的副本&#xff0c;这样常用的数据可以在内存中快速被访问&#xff0c;而不必每次都从磁盘中读取。 以下是 Buffer Pool 的一些重要特点&a…

串口通信(6)应用定时器中断+串口中断实现接收一串数据

本文为博主 日月同辉&#xff0c;与我共生&#xff0c;csdn原创首发。希望看完后能对你有所帮助&#xff0c;不足之处请指正&#xff01;一起交流学习&#xff0c;共同进步&#xff01; > 发布人&#xff1a;日月同辉,与我共生_单片机-CSDN博客 > 欢迎你为独创博主日月同…

I/O多路转接之select

承接上文&#xff1a;I/O模型之非阻塞IO-CSDN博客 简介 select函数原型介绍使用 一个select简单的服务器的代码书写 select的缺点 初识select 系统提供select函数来实现多路复用输入/输出模型 select系统调用是用来让我们的程序监视多个文件描述符的状态变化的; 程序会停在s…

unittest 通过TextTestRunner(failfast=True),失败或错误时停止执行case

failfast是unittest.TextTestRunner的一个参数&#xff0c;它用于控制测试运行过程中遇到第一个失败或错误的测试方法后是否立即停止执行。 当failfast设置为True时&#xff0c;一旦发现第一个失败或错误的测试方法&#xff0c;测试运行就会立即停止&#xff0c;并输出相应的失…

sql基础+考点+题

查询&#xff1a;select from 筛选&#xff1a;where and和or 排序&#xff1a;order by&#xff08;降序排列需要指定DESC关键字&#xff09; join&#xff1a;left join 、right join 和inner join 分组聚合&#xff1a;group by ---搭配count , sum , avg 过滤&#x…

安全防御——二、ENSP防火墙实验学习

安全防御 一、防火墙接口以及模式配置1、untrust区域2、trust区域3、DMZ区域4、接口对演示 二、防火墙的策略1、定义与原理2、防火墙策略配置2.1 安全策略工作流程2.2 查询和创建会话 3、实验策略配置3.1 trust-to-untrust3.2 trust-to-dmz3.3 untrust-to-dmz 三、防火墙的区域…

消息中间件-RabbitMQ介绍

一、基础知识 1. 什么是RabbitMQ RabbitMQ是2007年发布&#xff0c;是一个在AMQP(高级消息队列协议)基础上完成的&#xff0c;简称MQ全称为Message Queue, 消息队列&#xff08;MQ&#xff09;是一种应用程序对应用程序的通信方法&#xff0c;由Erlang&#xff08;专门针对于大…

SPSS单因素方差分析

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件请点击此链接下…