【Elasticsearch 】 聚合分析:桶聚合

🧑 博主简介:CSDN博客专家历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程高并发设计Springboot和微服务,熟悉LinuxESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。
技术合作请加本人wx(注明来自csdn):foreast_sea

在这里插入图片描述


在这里插入图片描述

【Elasticsearch 】 聚合分析:桶聚合

引言

在当今数据爆炸的时代,如何从海量数据中提取有价值的信息成为了众多开发者和数据分析师面临的重要挑战。Elasticsearch 作为一款强大的分布式搜索引擎,不仅提供了高效的数据存储和检索功能,还具备强大的聚合分析能力,其中桶聚合是其聚合分析功能的核心组成部分。

桶聚合的概念源于数据分析中常见的分组操作,它能够根据特定的条件将数据划分成不同的“桶”,每个桶代表一组具有相同特征的数据集合。通过这种方式,我们可以对数据进行分类、汇总和统计,从而挖掘出数据背后隐藏的模式和规律。

想象一下,你正在处理一个电商平台的销售数据,其中包含了大量的订单信息,如订单时间、商品类别、购买金额等。通过桶聚合,你可以轻松地按照商品类别对订单进行分组,统计每个类别的销售总额,了解哪些商品最受欢迎;或者按照订单时间进行分组,分析不同时间段的销售趋势,为营销策略提供有力支持。

在实际应用中,桶聚合的类型丰富多样,能够满足各种复杂的数据分析需求。常见的桶聚合类型包括 terms 桶聚合、date_histogram 桶聚合、range 桶聚合等。这些不同类型的桶聚合,各自适用于不同的数据特征和分析场景,为我们提供了灵活而强大的数据处理手段。

掌握桶聚合的使用方法,不仅可以帮助我们更好地理解数据,还能为业务决策提供准确的数据支持。无论是在数据分析、数据挖掘还是机器学习等领域,Elasticsearch 的桶聚合都发挥着重要的作用。

在本文,让我们一起深入探索 Elasticsearch 桶聚合的世界,揭开它神秘的面纱,领略其在数据处理中的强大魅力。

一、Elasticsearch 简介

Elasticsearch 是一个基于 Lucene 的分布式、RESTful 风格的搜索和数据分析引擎。它旨在快速存储、搜索和分析大量数据,广泛应用于各种领域,如日志分析、电商搜索、企业搜索等。

(一)核心概念

  1. 索引(Index)
    索引是 Elasticsearch 中存储数据的逻辑容器,类似于关系型数据库中的数据库概念。一个索引可以包含多个文档,每个文档都有一个唯一的标识符。例如,在一个电商应用中,可以创建一个名为 products 的索引来存储所有商品的信息。

  2. 文档(Document)
    文档是 Elasticsearch 中存储的基本数据单元,它是一个 JSON 格式的数据结构。每个文档都属于一个索引,并且可以包含多个字段。以商品文档为例,可能包含 product_idproduct_namepricecategory 等字段。

  3. 类型(Type)
    在早期版本中,类型用于在一个索引中区分不同类型的文档。但从 Elasticsearch 7.x 版本开始,逐渐弱化了类型的概念,一个索引通常只包含一种类型的文档。

  4. 分片(Shard)
    为了处理大规模数据,Elasticsearch 将索引分割成多个分片,每个分片是一个独立的 Lucene 索引。分片可以分布在不同的节点上,从而实现分布式存储和并行处理,提高系统的可扩展性和性能。

  5. 副本(Replica)
    副本是分片的复制,用于提高数据的可用性和读取性能。每个分片可以有多个副本,当某个节点出现故障时,副本可以接管其工作,确保数据的正常访问。

(二)工作原理

Elasticsearch 的工作原理基于分布式架构和 Lucene 的倒排索引技术。当一个文档被索引时,Elasticsearch 会分析文档的内容,将每个字段的值拆分成一个个的词项(Term),并构建倒排索引。倒排索引是一种从词项到文档的映射结构,通过它可以快速定位包含特定词项的文档。

在搜索时,用户发送查询请求到 Elasticsearch 集群,集群中的节点会根据查询条件在倒排索引中查找匹配的文档,并将结果返回给用户。对于聚合分析,Elasticsearch 会在索引数据的基础上,按照指定的聚合规则对数据进行分组和计算。

(三)安装与配置

  1. 下载安装
    可以从 Elasticsearch 官方网站下载适合你操作系统的安装包。解压安装包后,进入安装目录,在 Linux 系统下,可以通过执行 bin/elasticsearch 脚本启动 Elasticsearch 服务;在 Windows 系统下,可以双击 bin\elasticsearch.bat 文件启动。

  2. 配置文件
    Elasticsearch 的配置文件位于 config 目录下,主要配置文件是 elasticsearch.yml。在这里可以配置集群名称、节点名称、网络绑定地址、数据存储路径等参数。例如,修改 network.host 参数可以指定 Elasticsearch 监听的网络地址,以便外部可以访问。

二、Maven 依赖

在使用 Java API 操作 Elasticsearch 进行桶聚合时,需要引入相应的 Maven 依赖。以下是详细的依赖介绍:

(一)Elasticsearch 客户端依赖

<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.17.6</version>
</dependency>

这个依赖提供了高级 REST 客户端,用于与 Elasticsearch 集群进行交互。高级 REST 客户端基于低级 REST 客户端构建,提供了更方便、更面向对象的 API,使得我们可以轻松地发送各种请求,包括索引数据、搜索数据和执行聚合操作等。

(二)Elasticsearch 核心依赖

<dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.17.6</version>
</dependency>

Elasticsearch 核心依赖包含了 Elasticsearch 的核心功能和类库。它是整个 Elasticsearch 运行的基础,提供了数据存储、索引构建、搜索算法等核心功能。在使用 Java API 进行桶聚合时,很多核心的聚合操作类和方法都来自这个依赖。

(三)其他依赖

根据具体的应用场景,可能还需要引入一些其他的依赖。例如,如果需要处理 JSON 数据,可能需要引入 Jackson 相关的依赖:

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.4</version>
</dependency>

Jackson 是一个流行的 JSON 处理库,它可以帮助我们将 Java 对象转换为 JSON 格式,以及将 JSON 数据解析为 Java 对象。在与 Elasticsearch 交互时,数据通常以 JSON 格式传输,因此 Jackson 依赖可以方便我们处理这些数据。

(四)依赖管理

在 Maven 项目中,这些依赖会被自动下载并添加到项目的类路径中。Maven 会根据依赖的版本信息,解析和管理依赖之间的关系,确保项目使用的所有依赖都是兼容的。同时,Maven 还提供了依赖传递的功能,即如果一个依赖依赖于其他的库,Maven 会自动下载这些传递性依赖,使得项目的依赖管理更加方便和高效。

三、常见桶聚合类型

(一)terms 桶聚合

terms 桶聚合是最常用的桶聚合类型之一,它根据指定字段的不同值对文档进行分组。每个不同的值会形成一个独立的桶,每个桶中包含所有该字段值相同的文档。

1. 语法示例

以下是使用 Java API 进行 terms 桶聚合的示例代码:

import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.builder.SearchSourceBuilder;public class TermsAggregationExample {public static void main(String[] args) throws Exception {try (RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")))) {SearchRequest searchRequest = new SearchRequest("your_index_name");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.aggregation(AggregationBuilders.terms("category_agg").field("category"));searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);Terms categoryAgg = searchResponse.getAggregations().get("category_agg");for (Terms.Bucket bucket : categoryAgg.getBuckets()) {System.out.println("Category: " + bucket.getKeyAsString() + ", Doc Count: " + bucket.getDocCount());}}}
}

在上述代码中:

  • 首先创建了一个 RestHighLevelClient 实例,用于与 Elasticsearch 集群进行通信。
  • 然后创建了一个 SearchRequest,指定要查询的索引为 your_index_name
  • 使用 SearchSourceBuilder 构建查询请求,通过 aggregation 方法添加了一个 terms 桶聚合,聚合名称为 category_agg,分组字段为 category
  • 执行搜索请求并获取响应,从响应中获取名为 category_agg 的聚合结果,遍历每个桶并打印出分组的类别和该类别下的文档数量。
2. 应用场景

terms 桶聚合在很多场景下都非常有用。例如在电商数据分析中,可以使用 terms 桶聚合按照商品类别对订单进行分组,统计每个类别的订单数量,从而了解哪些商品类别最受欢迎。在日志分析中,可以按照日志级别对日志进行分组,统计不同级别日志的数量,以便快速定位系统中出现问题的频率。

(二)date_histogram 桶聚合

date_histogram 桶聚合用于按照日期范围对文档进行分组。它可以根据指定的时间间隔(如秒、分钟、小时、天等)将日期数据划分为不同的桶,每个桶包含在该时间范围内的文档。

1. 语法示例
import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.datehistogram.DateHistogram;
import org.elasticsearch.search.builder.SearchSourceBuilder;public class DateHistogramAggregationExample {public static void main(String[] args) throws Exception {try (RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")))) {SearchRequest searchRequest = new SearchRequest("your_index_name");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.aggregation(AggregationBuilders.dateHistogram("date_agg").field("order_date").calendarInterval(DateHistogram.Interval.DAY).format("yyyy-MM-dd"));searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);DateHistogram dateAgg = searchResponse.getAggregations().get("date_agg");for (DateHistogram.Bucket bucket : dateAgg.getBuckets()) {System.out.println("Date: " + bucket.getKeyAsString() + ", Doc Count: " + bucket.getDocCount());}}}
}

在这段代码中:

  • 同样创建了 RestHighLevelClientSearchRequest
  • 使用 SearchSourceBuilder 添加了一个 date_histogram 桶聚合,聚合名称为 date_agg,分组字段为 order_date
  • 通过 calendarInterval 方法指定时间间隔为一天,format 方法指定日期的显示格式为 yyyy-MM-dd
  • 执行查询后,从响应中获取聚合结果并遍历每个桶,打印出日期和该日期下的文档数量。
2. 应用场景

date_histogram 桶聚合在分析时间序列数据时非常有用。比如在电商销售数据分析中,可以按照每天的订单时间进行分组,统计每天的订单数量,从而分析销售趋势。在服务器日志分析中,可以按照日志记录的时间进行分组,了解系统在不同时间段的活动情况,以便进行性能优化和故障排查。

(三)range 桶聚合

range 桶聚合根据数值范围对文档进行分组。可以指定多个数值范围,每个范围形成一个桶,文档根据其指定字段的值落入相应的桶中。

1. 语法示例
import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.range.Range;
import org.elasticsearch.search.builder.SearchSourceBuilder;public class RangeAggregationExample {public static void main(String[] args) throws Exception {try (RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")))) {SearchRequest searchRequest = new SearchRequest("your_index_name");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.aggregation(AggregationBuilders.range("price_range_agg").field("price").addUnboundedTo(100).addRange(100, 200).addUnboundedFrom(200));searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);Range priceRangeAgg = searchResponse.getAggregations().get("price_range_agg");for (Range.Bucket bucket : priceRangeAgg.getBuckets()) {System.out.println("Price Range: " + bucket.getKeyAsString() + ", Doc Count: " + bucket.getDocCount());}}}
}

在上述代码中:

  • 创建了必要的客户端和请求对象。
  • 使用 SearchSourceBuilder 添加了一个 range 桶聚合,聚合名称为 price_range_agg,分组字段为 price
  • 通过 addUnboundedToaddRangeaddUnboundedFrom 方法定义了三个价格范围:小于等于 100、100 到 200 之间、大于 200。
  • 执行查询后,获取聚合结果并遍历每个桶,打印出价格范围和该范围内的文档数量。
2. 应用场景

range 桶聚合在数据分析中常用于对数值数据进行分段统计。例如在电商商品价格分析中,可以按照不同的价格区间对商品进行分组,了解不同价格段商品的销售情况。在用户年龄分析中,可以按照年龄范围对用户进行分组,分析不同年龄段用户的行为特征。

(四)嵌套桶聚合

在实际的数据分析中,往往需要对数据进行多层次的分组和分析,这时候就可以使用嵌套桶聚合。嵌套桶聚合是指在一个桶聚合的基础上,再在每个桶内进行另一个桶聚合,从而实现更复杂的数据分组和洞察。

接下来是具体的示例:

import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.ParsedTerms;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;import java.io.IOException;public class NestedBucketAggregationExample {public static void main(String[] args) throws IOException {RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));SearchRequest searchRequest = new SearchRequest("your_index_name");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();// 外层桶聚合,按产品类别分组TermsAggregationBuilder outerAggregation = AggregationBuilders.terms("product_categories").field("category.keyword");// 内层桶聚合,在每个产品类别桶内按子类别分组TermsAggregationBuilder innerAggregation = AggregationBuilders.terms("sub_categories").field("sub_category.keyword");// 在内层桶聚合中计算总销售额innerAggregation.subAggregation(AggregationBuilders.sum("total_sales").field("sales_amount"));outerAggregation.subAggregation(innerAggregation);searchSourceBuilder.aggregation(outerAggregation);searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);// 解析结果ParsedTerms outerTerms = searchResponse.getAggregations().get("product_categories");for (Terms.Bucket outerBucket : outerTerms.getBuckets()) {String category = outerBucket.getKeyAsString();System.out.println("Category: " + category);ParsedTerms innerTerms = outerBucket.getAggregations().get("sub_categories");for (Terms.Bucket innerBucket : innerTerms.getBuckets()) {String subCategory = innerBucket.getKeyAsString();double totalSales = innerBucket.getAggregations().get("total_sales").getValue();System.out.println("  Sub - Category: " + subCategory + ", Total Sales: " + totalSales);}}client.close();}
}
复杂多层次嵌套场景

在实际应用中,可能会遇到更复杂的多层次嵌套需求。例如,在分析用户行为数据时,我们可能需要按日期、用户所在地区、用户年龄段进行多层次分组,然后分析每个分组下用户的平均浏览时长。

// 按日期分组
TermsAggregationBuilder dateAggregation = AggregationBuilders.terms("by_date").field("date.keyword");// 在日期分组桶内按地区分组
TermsAggregationBuilder regionAggregation = AggregationBuilders.terms("by_region").field("region.keyword");// 在地区分组桶内按年龄段分组
TermsAggregationBuilder ageGroupAggregation = AggregationBuilders.terms("by_age_group").field("age_group.keyword");// 在年龄段分组桶内计算平均浏览时长
ageGroupAggregation.subAggregation(AggregationBuilders.avg("avg_browse_time").field("browse_time"));regionAggregation.subAggregation(ageGroupAggregation);
dateAggregation.subAggregation(regionAggregation);searchSourceBuilder.aggregation(dateAggregation);

通过这样的多层次嵌套,可以深入了解不同时间、不同地区、不同年龄段用户的行为模式,为产品优化和营销策略制定提供有力的数据支持。

注意事项
  1. 性能问题:随着嵌套层次的增加,聚合操作的性能开销会显著增大。因为每个桶聚合都需要对数据进行一次遍历和分组。在设计嵌套聚合时,要充分考虑数据量和性能需求,避免不必要的嵌套。
  2. 内存使用:Elasticsearch 在进行聚合操作时会占用一定的内存来存储中间结果。对于大规模数据的复杂嵌套聚合,可能会导致内存不足的问题。可以通过合理设置 shard_size 等参数来控制内存使用。
  3. 数据倾斜:如果某些桶中的数据量过大,会影响聚合的性能和结果的准确性。在进行嵌套聚合前,需要对数据分布有一定的了解,必要时可以通过数据预处理来平衡数据分布。

四、总结

Elasticsearch 的桶聚合功能为我们提供了强大的数据分组和分析能力,尤其是嵌套桶聚合能够帮助我们深入挖掘数据的内在结构和分布规律。通过合理设计嵌套层次和聚合操作,结合实际业务需求,我们可以从海量数据中获取有价值的信息,为决策提供有力支持。无论是在电商、金融、日志分析还是其他领域,桶聚合都有着广泛的应用前景。

五、参考资料文献

  1. Elasticsearch 官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
  2. 《Elasticsearch in Action》,作者:Jeff Markham
  3. Elasticsearch 官方博客:https://www.elastic.co/blog/ ,其中包含了许多关于 Elasticsearch 各种功能使用和优化的文章。

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

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

相关文章

tensorflow源码编译在C++环境使用

https://tensorflow.google.cn/install/source?hlzh-cn查看tensorflow和其他需要下载软件对应的版本&#xff0c;最好一模一样 1、下载TensorFlow源码 https://github.com/tensorflow/tensorflow 2、安装编译protobuf&#xff08;3.9.2&#xff09; protobuf版本要和TensorFlo…

使用 F12 查看 Network 及数据格式

在浏览器中&#xff0c;F12 开发者工具的 “Network” 面板是用于查看网页在加载过程中发起的所有网络请求&#xff0c;包括 API 请求&#xff0c;以及查看这些请求的详细信息和响应数据的。以下以常见的 Chrome 浏览器为例&#xff0c;介绍如何使用 F12 控制台查看 Network 里…

Redis 2.6.12在Win10系统上的安装教程

诸神缄默不语-个人CSDN博文目录 这个版本的安装包是跟同事要的&#xff0c;em&#xff0c;如果真的需要这个版本的话可以跟我要&#xff1a; 解压后双击第一个bat文件&#xff0c;即可挂起Redis服务&#xff1a;

分布式数据库中间件(DDM)的使用场景

华为云分布式数据库中间件&#xff08;DDM&#xff09;是一款专注于解决数据库分布式扩展问题的中间件服务&#xff0c;突破了传统数据库的容量和性能瓶颈&#xff0c;能够实现海量数据的高并发访问。以下是九河云总结的DDM的典型使用场景&#xff1a; 1. 互联网应用 在电商、…

Ubuntu16.04 安装OpenCV4.5.4 避坑

Ubuntu16.04 安装C版OpenCV4.5.4 Ubuntu16.04 VSCode下cmakeclanglldb调试c 文章目录 Ubuntu16.04 安装C版OpenCV4.5.41. 下载Opencv压缩包2. 安装Opencv-4.5.43. 配置OpenCV的编译环境4.测试是否安装成功 1. 下载Opencv压缩包 下载Opencv压缩包&#xff0c;选择source版本。…

RabbitMQ集群安装rabbitmq_delayed_message_exchange

1、单节点安装rabbitmq安装延迟队列 安装延迟队列rabbitmq_delayed_message_exchange可以参考这个文章&#xff1a; rabbitmq安装延迟队列-CSDN博客 2、集群安装rabbitmq_delayed_message_exchange 在第二个节点 join_cluster 之后&#xff0c;start_app 就会报错了 (CaseC…

QT开发:事件循环与处理机制的概念和流程概括性总结

事件循环与处理机制的概念和流程 Qt 事件循环和事件处理机制是 Qt 框架的核心&#xff0c;负责管理和分发各种事件&#xff08;用户交互、定时器事件、网络事件等&#xff09;。以下是详细透彻的概念解释和流程讲解。 1. 事件循环&#xff08;Event Loop&#xff09;的概念 …

博客搭建 — GitHub Pages 部署

关于 GitHub Pages GitHub Pages 是一项静态站点托管服务&#xff0c;它直接从 GitHub 上的仓库获取 HTML、CSS 和 JavaScript 文件&#xff0c;通过构建过程运行文件&#xff0c;然后发布网站。 本文最终效果是搭建出一个域名为 https://<user>.github.io 的网站 创建…

网络通信---MCU移植LWIP

使用的MCU型号为STM32F429IGT6&#xff0c;PHY为LAN7820A 目标是通过MCU的ETH给LWIP提供输入输出从而实现基本的Ping应答 OK废话不多说我们直接开始 下载源码 LWIP包源码&#xff1a;lwip源码 -在这里下载 ST官方支持的ETH包&#xff1a;ST-ETH支持包 这里下载 创建工程 …

【MySQL】存储引擎有哪些?区别是什么?

频率难度60%⭐⭐⭐⭐ 这个问题其实难度并不是很大&#xff0c;只是涉及到的相关知识比较繁杂&#xff0c;比如事务、锁机制等等&#xff0c;都和存储引擎有关系。有时还会根据场景选择不同的存储引擎。 下面笔者将会根据几个部分尽可能地讲清楚 MySQL 中的存储引擎&#xff0…

【系统环境丢失恢复】如何恢复和重建 Ubuntu 中的 .bashrc 文件

r如果你遇到这种情况&#xff0c;说明系统环境的.bashrc 文件丢失恢复&#xff1a; 要恢复 ~/.bashrc 文件&#xff0c;可以按照以下几种方式操作&#xff1a; 恢复默认的 ~/.bashrc 文件 如果 ~/.bashrc 文件被删除或修改&#xff0c;你可以恢复到默认的版本。可以参考以下…

Element修改表格结构样式集合(后续实时更新)

场景 修改前端Element组件el-table样式 实现 线表格 <div class"tablepro"><el-table:data"tableData":header-cell-style"{ textAlign:center}"class"tablepro-table"borderstyle"width: 100%;height:100%"&g…

基于Redis实现短信验证码登录

目录 1 基于Session实现短信验证码登录 2 配置登录拦截器 3 配置完拦截器还需将自定义拦截器添加到SpringMVC的拦截器列表中 才能生效 4 Session集群共享问题 5 基于Redis实现短信验证码登录 6 Hash 结构与 String 结构类型的比较 7 Redis替代Session需要考虑的问题 8 …

60,【1】BUUCF web [RCTF2015]EasySQL1

先查看源码 1&#xff0c;changepwd&#xff08;修改密码&#xff09; <?php // 开启会话&#xff0c;以便使用会话变量 session_start();// 设置页面的内容类型为 HTML 并使用 UTF-8 编码 header("Content-Type: text/html; charsetUTF-8");// 引入配置文件&…

高并发内存池_CentralCache(中心缓存)和PageCache(页缓存)申请内存的设计

三、CentralCache&#xff08;中心缓存&#xff09;_内存设计 &#xff08;一&#xff09;Span的创建 // 页编号类型&#xff0c;32位下是4byte类型&#xff0c;64位下是8byte类型 // #ifdef _WIN64 typedef unsigned long long PageID; #else _WIN32 typedef size_t PageI…

2024年终总结-行到水穷处,坐看云起时

依然是——关于我 我&#xff0c;坐标山东青岛&#xff0c;一位无名的Java Coder&#xff0c;你可以叫我Debug.c亦或者种棵代码技术树。在此不过多赘述关于我&#xff0c;更多的关于我请移步我的2023年年终总结。 2023年终总结-轻舟已过万重山 2024年OKR完成情况 2023年年末…

AI编程工具使用技巧:在Visual Studio Code中高效利用阿里云通义灵码

AI编程工具使用技巧&#xff1a;在Visual Studio Code中高效利用阿里云通义灵码 前言一、通义灵码介绍1.1 通义灵码简介1.2 主要功能1.3 版本选择1.4 支持环境 二、Visual Studio Code介绍1.1 VS Code简介1.2 主要特点 三、安装VsCode3.1下载VsCode3.2.安装VsCode3.3 打开VsCod…

1月21日星期二今日早报简报微语报早读

1月21日星期二&#xff0c;农历腊月廿二&#xff0c;早报#微语早读。 1、多地官宣&#xff1a;2025年可有序、限时或在限定区域燃放烟花爆竹&#xff1b; 2、TikTok恢复在美服务&#xff1b;特朗普提出继续运营TikTok方案&#xff0c;外交部&#xff1a;若涉及收购中国企业应…

计算机组成原理——数据表示(一)

生活是一道长长的旅程&#xff0c;充满了挑战和困难。然而&#xff0c;我们必须坚持下去&#xff0c;努力前进。无论遇到什么困难&#xff0c;我们都要勇敢面对&#xff0c;永不放弃。只有通过不断的努力和坚持&#xff0c;我们才能够取得成功。在这个旅程中&#xff0c;我们可…

强化学习入门--基本概念

强化学习基本概念 grid-world example 这个指的是一个小机器人&#xff08;agent&#xff09;在一个网格区域&#xff08;存在边界&#xff09;&#xff0c;网格中存在需要躲避的格子和目标格子&#xff0c;我们的目的就是找到到达目标格子的最短路径 state 表示智能体相对…