ClickHouse 介绍:深度解析高性能列式数据库的核心优势

ClickHouse 介绍:深度解析高性能列式数据库的核心优势

在大数据时代,处理和分析海量数据的需求不断增长。ClickHouse,作为一个开源列式数据库,由 Yandex 开发,凭借其出色的性能和灵活的架构,成为了大数据分析的一个重要工具。本文将详细介绍 ClickHouse 的关键特点、优势以及实际应用场景,帮助读者深入理解这一强大的分析工具。


1. 列式存储:优化数据读取效率

ClickHouse 的列式存储模型在优化数据读取效率方面发挥了关键作用。以下详细介绍列式存储的实现细节及其优势:

减少磁盘 I/O

实现细节:

  1. 数据列存储

    • 在 ClickHouse 中,数据不是按行存储的,而是按照列存储在磁盘上的。每个列的数据被独立地存储在一个或多个文件中。
    • 存储结构:数据被分成数据块(parts),每个数据块包含多个列的数据。这些数据块被分开存储,例如,一个数据块可能包含销售额列的数据,而另一个数据块包含销售日期列的数据。
  2. 查询时的列访问

    • 当用户执行查询时,ClickHouse 根据查询条件定位到所需的列数据文件。例如,对于查询 SELECT sales_amount, sale_date FROM sales WHERE product_category = 'Electronics',ClickHouse 只访问包含销售额(sales_amount)和销售日期(sale_date)的列数据文件。
    • 数据定位:ClickHouse 使用索引和元数据来确定哪些列包含了查询需要的数据,从而只读取相关的数据块。索引结构可以加速列的定位过程,进一步减少磁盘 I/O 操作。
  3. 数据扫描优化

    • 跳过无关数据:在读取数据时,ClickHouse 可以跳过不相关的列和数据块。例如,如果查询只涉及某些列,则 ClickHouse 会跳过所有其他列的数据块,这样减少了磁盘读取的量。
    • 索引使用:为了加速数据扫描,ClickHouse 使用各种索引技术,如稀疏索引(Sparse Indexes)来定位数据块,从而进一步减少磁盘 I/O。

具体实现示例:

  • 如果一个表有 10 列,而查询只涉及 3 列,ClickHouse 只会读取存储这 3 列的文件,忽略其他 7 列的数据。这样可以大幅度减少磁盘读取量,加快查询速度。
提高压缩效率

实现细节:

  1. 列内数据特性

    • 列式存储允许 ClickHouse 根据数据列的特性选择合适的压缩算法。列中的数据通常具有相似的特征,使得压缩更高效。
    • 数据压缩算法:ClickHouse 支持多种压缩算法,如 LZ4、ZSTD、及其自定义的压缩算法。每种算法在不同类型的数据上表现不同,因此 ClickHouse 根据数据特性选择最佳的压缩算法。
  2. 数据块压缩

    • 分块压缩:数据块内的列数据被压缩并存储在磁盘上。ClickHouse 对每个列的数据块进行压缩,以减少存储空间。例如,销售额列中的数值数据可以使用高效的压缩算法进行压缩,减少磁盘空间使用。
    • 按需解压:在查询过程中,ClickHouse 只解压涉及的列数据块,而不是解压整个数据块。这样可以减少解压缩过程中的 I/O 操作,提高查询效率。
  3. 压缩设置

    • 自定义压缩:用户可以根据需求选择或配置压缩算法。例如,对于历史数据,用户可能选择高压缩比的 ZSTD 算法来最大化存储节省,而对于实时数据,则选择速度更快的 LZ4 算法。

具体实现示例:

  • 假设一个表的销售数据列使用了 ZSTD 压缩算法,这样可以显著减少存储空间。在查询时,ClickHouse 只会解压缩与查询相关的销售数据列,而不解压缩其他列,从而提升性能和减少 I/O 操作。
实际应用示例

场景:一个电子商务平台需要分析不同产品类别的销售趋势,以优化库存和营销策略。

操作流程

  1. 数据表设计

    • 电子商务平台将订单数据表设计为列式存储,分为销售额(sales_amount)、销售日期(sale_date)、产品类别(product_category)等列。
  2. 数据存储

    • 销售数据按列存储在磁盘上。例如,销售额数据存储在一个文件中,销售日期数据存储在另一个文件中。
  3. 执行查询

    • 用户执行查询:SELECT sales_amount, sale_date FROM sales WHERE product_category = 'Electronics'。ClickHouse 只读取销售额和销售日期列的数据文件,并应用索引加速数据定位和检索。
  4. 数据压缩

    • 对于销售额列使用 LZ4 压缩算法,而对销售日期列使用 ZSTD 压缩算法。这样,ClickHouse 在存储数据时减少了空间占用,同时在查询时能够快速解压缩所需的列数据。

通过这种列式存储和压缩技术,ClickHouse 能够显著提高大规模数据分析的效率,降低存储成本,并加快数据读取速度。这使得在电子商务平台上进行复杂的数据分析任务变得更加高效和经济。


2. 高性能:应对海量数据

ClickHouse 的设计不仅注重数据存储的优化,还特别强调高性能的查询处理能力。以下详细介绍了 ClickHouse 在处理海量数据时所应用的性能优化技术及其实际应用示例。

性能优化技术

1. 并行处理

实现细节:

  • 查询任务拆分

    • ClickHouse 能够将单个查询任务拆分成多个子任务。每个子任务负责处理数据的一个子集或执行部分计算,这样可以充分利用系统的多核处理能力。
  • 多线程执行

    • 在查询执行过程中,ClickHouse 会利用多线程技术来并行处理这些子任务。每个线程处理数据的一个部分或执行一个计算操作,这样可以显著提高查询速度。

    具体流程:

    1. 查询解析:当用户发起查询时,ClickHouse 首先将查询语句解析成执行计划。这个执行计划会被拆分成多个子任务。

    2. 任务调度:执行计划的各个子任务被分配给不同的处理线程。每个线程独立处理自己的子任务,通常在多核处理器上运行。

    3. 结果合并:所有线程处理完各自的任务后,ClickHouse 将所有结果合并,生成最终的查询结果。

  • 示例

    • 如果执行一个复杂的聚合查询,例如 SELECT product_category, COUNT(*) FROM sales WHERE sale_date > '2024-01-01' GROUP BY product_category,ClickHouse 会将这个查询分解为多个子任务(如按不同的产品类别计算计数),并由多个线程并行处理每个子任务。这样可以加速聚合计算的速度,缩短查询响应时间。

2. 数据分片和分布式查询

实现细节:

  • 数据分片

    • ClickHouse 支持将大数据集分割成更小的部分,称为数据分片(shards)。这些分片可以分布在不同的服务器上。数据分片可以根据预定义的规则(如按日期范围或按数据量)进行划分。
  • 分布式查询

    • 当执行查询时,ClickHouse 会在所有存储了相关数据分片的服务器上并行处理查询任务。查询请求被分发到各个服务器,所有服务器处理完自己的任务后,结果被汇总到一个中心节点,最终生成查询结果。

    具体流程:

    1. 数据分布:数据在写入时被分割成多个分片,并分布在不同的服务器上。例如,一个大表可能会被分成按月分片,每个月的数据存储在不同的服务器上。

    2. 查询分发:当用户发起一个查询时,ClickHouse 会将查询请求分发到所有存储相关分片的服务器上。每个服务器处理自己存储的分片数据。

    3. 结果聚合:各个服务器返回查询结果的部分数据,ClickHouse 的协调节点将这些部分结果合并,生成最终的查询结果。

  • 示例

    • 在广告监控系统中,假设需要实时处理和分析每秒钟数百万条广告点击数据。ClickHouse 将这些数据分片存储在多个服务器上,并在查询时对所有分片进行并行

处理。这样可以确保查询响应时间保持在毫秒级别,即使面对大量数据。

3. 数据压缩

实现细节:

  • 压缩算法优化

    • ClickHouse 使用高效的压缩算法来减少数据的存储占用。不同的列数据可以使用不同的压缩算法,如 LZ4、ZSTD 等。压缩算法的选择会基于数据的特性和查询需求进行优化。
  • 列级压缩

    • 在 ClickHouse 中,每一列的数据可以独立压缩。这种列级压缩可以更有效地利用数据的特性,从而提高压缩效率。例如,对于某些列数据具有重复值或相似的值,可以使用更适合的压缩算法进行压缩。

    具体流程:

    1. 数据压缩:在数据写入时,ClickHouse 对每列数据应用选择的压缩算法。例如,销售数据列可以使用高压缩比的 ZSTD 算法,而对销售日期列使用较快的 LZ4 算法。

    2. 查询解压:在查询时,ClickHouse 只解压与查询相关的列数据。这可以显著减少解压缩操作的时间和资源消耗。

  • 示例

    • 如果一个大数据表的销售数据列使用了 ZSTD 压缩算法,这可以有效减少存储需求。在查询时,ClickHouse 只解压与查询相关的列,而不是解压整个数据块,从而加速查询过程。
实际应用示例

场景:一个金融服务公司需要实时分析交易数据以检测潜在的欺诈活动。

操作流程

  1. 数据分片

    • 将交易数据按时间范围分片,并分布在多个 ClickHouse 服务器上。每个服务器存储某一时间段的交易数据。
  2. 并行处理

    • 当系统检测到潜在的欺诈活动时,发起查询请求。ClickHouse 将查询请求分发到所有存储相关时间段数据的服务器上,并并行处理每个服务器上的数据。
  3. 数据压缩

    • 使用高效的压缩算法(如 ZSTD)对交易数据进行压缩,以减少存储占用。查询时,ClickHouse 只解压与欺诈检测相关的数据列,加速处理过程。

通过这些性能优化技术,ClickHouse 能够有效地处理和分析海量数据,提供高性能的查询响应,满足各种实时分析需求。


3. 数据模型和表设计:灵活的数据管理

ClickHouse 提供了灵活的数据模型和表设计功能,以满足不同应用场景的数据管理需求。以下详细介绍 ClickHouse 数据模型的设计原则和表结构类型,以及如何应用这些特性来优化数据管理和查询性能。

数据模型设计

1. 表类型和存储引擎

实现细节:

  • MergeTree

    • ClickHouse 最常用的表引擎。支持大规模数据存储和高效的查询性能。它基于合并(merge)操作,能够处理大量数据的插入和查询。
    • 合并操作:MergeTree 表通过合并操作优化存储,定期将小数据块合并为更大的数据块,减少存储碎片,提高查询效率。
  • AggregatingMergeTree

    • 扩展自 MergeTree 表,引入了预聚合功能。适用于需要进行大量聚合操作的场景。
    • 聚合操作:数据在插入时就进行聚合计算,减少查询时的计算开销。例如,在处理用户访问日志时,可以预先聚合数据,如按小时统计访问量,从而提高查询效率。
  • SummingMergeTree

    • 用于支持数据求和的表引擎。适合用于累积计数或求和的场景。
    • 求和操作:在数据插入过程中,对数据进行求和处理,减少查询时的计算工作量。例如,在处理销售数据时,可以对销售额进行求和,实时获取总销售额。

具体实现示例:

  • Sales Data Table:创建一个 MergeTree 表来存储销售数据,并设置适当的索引以优化查询性能。

    CREATE TABLE sales_data
    (
        sale_id UInt32,
        product_id UInt32,
        sale_amount Float32,
        sale_date Date,
        INDEX idx_product (product_id)
    ) ENGINE = MergeTree()
    PARTITION BY toYYYYMM(sale_date)
    ORDER BY (sale_date, product_id);
    

    在这个表设计中,数据按月份分区,并按销售日期和产品 ID 排序,以优化查询性能。

2. 数据分区和索引

实现细节:

  • 数据分区

    • ClickHouse 支持将数据按时间、区域或其他字段分区。分区可以加速数据的插入和查询。
    • 时间分区:常见的分区方式是按时间范围进行分区。这样可以在查询时快速定位到相关的时间段数据,提高查询效率。
  • 索引

    • ClickHouse 提供多种索引类型,如主键索引、稀疏索引等,用于加速查询操作。
    • 稀疏索引:在数据表中存储索引信息,以加速查询操作。例如,ClickHouse 可以为数据表的某些列创建稀疏索引,以加速基于这些列的查询。

具体实现示例:

  • Time Partitioning:在处理大规模的日志数据时,使用时间分区可以加速查询。

    CREATE TABLE logs
    (
        log_id UInt32,
        log_date DateTime,
        log_message String
    ) ENGINE = MergeTree()
    PARTITION BY toYYYYMM(log_date)
    ORDER BY (log_date);
    

    在这个表设计中,数据按月份分区,使得在查询特定月份的日志数据时,ClickHouse 可以只扫描相关的分区,减少查询时间。

实际应用示例

场景:一个在线广告平台需要存储和分析广告点击数据,以优化广告投放策略。

操作流程

  1. 数据表设计

    • 创建一个 MergeTree 表来存储广告点击数据,并按日期分区。
    CREATE TABLE ad_clicks
    (
        click_id UInt32,
        ad_id UInt32,
        user_id UInt32,
        click_time DateTime,
        INDEX idx_ad (ad_id)
    ) ENGINE = MergeTree()
    PARTITION BY toYYYYMM(click_time)
    ORDER BY (click_time, ad_id);
    

    在这个表设计中,数据按月份分区,按点击时间和广告 ID 排序,以提高查询性能。

  2. 数据插入和查询

    • 数据插入时,ClickHouse 将数据写入适当的分区。查询时,ClickHouse 只扫描相关的分区数据,减少 I/O 操作。

    • 示例查询

      SELECT ad_id, COUNT(*) AS click_count
      FROM ad_clicks
      WHERE click_time >= '2024-01-01' AND click_time < '2024-02-01'
      GROUP BY ad_id
      ORDER BY click_count DESC;
      

    在这个查询中,ClickHouse 只扫描 2024 年 1 月的分区数据,并按广告 ID 分组统计点击量,从而提高查询效率。

通过合理的数据模型和表设计,ClickHouse 能够高效地管理和查询大规模数据,提供灵活的解决方案以满足不同的应用需求。


4. 实时数据处理:高效的数据流和实时分析

在数据分析场景中,实时数据处理是关键需求之一。ClickHouse 作为一个高性能列式数据库,提供了高效的数据流处理能力。以下详细介绍了 ClickHouse 在实时数据处理中的核心优势以及实际应用示例。

实时数据流处理

1. 数据写入

实现细节:

  • 批量插入

    • ClickHouse 支持批量数据插入,可以高效地处理大量数据的写入操作。通过将数据分批写入,减少了写入操作的开销,提高了数据处理效率。
    • 批量操作:在实际应用中,ClickHouse 可以将数据分成多个批次进行插入。例如,每分钟将 1000 条数据作为一个批次进行插入,以提高写入效率。
  • 流式数据写入

    • ClickHouse 也支持流式数据写入,可以实时接收和处理数据流。通过流式写入,ClickHouse 可以实时更新数据,满足实时分析需求。
    • 流式数据接入:可以使用 Kafka 等消息队列将实时数据流接入 ClickHouse。例如,将广告点击数据流实时写入 ClickHouse,以支持实时分析和报告。

具体实现示例:

  • 批量插入

    INSERT INTO sales_data (sale_id, product_id, sale_amount, sale_date)
    VALUES
    (1, 101, 
    

150.00, ‘2024-07-01’),
(2, 102, 200.00, ‘2024-07-01’),
(3, 103, 300.00, ‘2024-07-01’);

- **流式数据写入**:

使用 Kafka 将实时数据流写入 ClickHouse。

```bash
kafka-console-producer --broker-list localhost:9092 --topic ad_clicks
INSERT INTO ad_clicks (click_id, ad_id, user_id, click_time)
VALUES
(1001, 1, 501, now()),
(1002, 2, 502, now());

2. 实时查询和分析

实现细节:

  • 实时查询

    • ClickHouse 支持高效的实时查询,能够快速处理和分析实时数据。通过优化数据表设计和查询策略,ClickHouse 可以提供快速的查询响应时间。
    • 查询优化:在实时数据分析中,ClickHouse 可以使用索引、分区等技术来优化查询性能。例如,对实时日志数据进行实时分析时,可以使用时间分区和索引来提高查询效率。
  • 实时分析

    • ClickHouse 提供了丰富的分析功能,包括聚合、过滤、排序等,可以对实时数据进行深入分析。
    • 分析功能:例如,可以实时分析广告点击数据,计算每个广告的点击率,并根据点击率优化广告投放策略。

具体实现示例:

  • 实时查询

    SELECT ad_id, COUNT(*) AS click_count
    FROM ad_clicks
    WHERE click_time >= now() - INTERVAL 1 HOUR
    GROUP BY ad_id
    ORDER BY click_count DESC;
    

    在这个查询中,ClickHouse 实时分析过去 1 小时的广告点击数据,计算每个广告的点击量,并按点击量排序。

实际应用示例

场景:一个在线电商平台需要实时分析用户行为数据,以提供个性化推荐。

操作流程

  1. 数据接入

    • 使用 Kafka 将用户行为数据实时写入 ClickHouse。
    kafka-console-producer --broker-list localhost:9092 --topic user_behavior
    
    INSERT INTO user_behavior (user_id, action, action_time)
    VALUES
    (1, 'view', now()),
    (2, 'purchase', now());
    
  2. 实时分析

    • 实时查询用户行为数据,以生成个性化推荐。
    SELECT user_id, action, COUNT(*) AS action_count
    FROM user_behavior
    WHERE action_time >= now() - INTERVAL 1 HOUR
    GROUP BY user_id, action
    ORDER BY action_count DESC;
    

    通过实时分析用户行为数据,电商平台可以了解用户的最新行为,并生成个性化推荐,以提高用户满意度和销售量。

通过实时数据流处理和分析,ClickHouse 能够高效地处理和分析实时数据,满足各种实时分析需求,提高数据驱动决策的能力。


5. 高可用性和容错:确保系统稳定运行

在大规模数据处理场景中,系统的高可用性和容错能力至关重要。ClickHouse 提供了多种机制来确保系统的稳定运行,包括数据备份、复制和故障恢复。以下详细介绍 ClickHouse 的高可用性和容错特性,以及实际应用示例。

高可用性和容错

1. 数据备份和恢复

实现细节:

  • 数据备份

    • ClickHouse 提供了备份数据的功能,可以将数据备份到外部存储系统(如 S3)以防止数据丢失。
    • 备份策略:可以定期进行数据备份,并将备份数据存储在安全的外部位置。例如,每天进行一次全量备份,每小时进行一次增量备份。
  • 数据恢复

    • 当发生数据丢失或损坏时,可以从备份中恢复数据。ClickHouse 支持从备份中恢复整个数据表或部分数据。
    • 恢复操作:可以使用备份工具将备份数据恢复到 ClickHouse 实例中,从而恢复丢失的数据。

具体实现示例:

  • 数据备份

    clickhouse-client --query="BACKUP TABLE sales_data TO '/backup/sales_data_backup'"
    
  • 数据恢复

    clickhouse-client --query="RESTORE TABLE sales_data FROM '/backup/sales_data_backup'"
    

2. 数据复制

实现细节:

  • 主从复制

    • ClickHouse 支持主从复制,可以将数据复制到多个节点以提高系统的可靠性和可用性。
    • 主节点和从节点:主节点处理数据写入和查询操作,从节点同步主节点的数据,并提供读取操作的冗余备份。
  • 分布式表

    • ClickHouse 支持分布式表设计,可以在多个节点上分布存储数据,提高数据处理能力和容错能力。
    • 分布式数据存储:通过将数据分布在多个节点上,可以提高系统的容错能力和扩展性。例如,在处理大规模数据时,可以使用分布式表将数据分布在多个节点上,保证系统的高可用性。

具体实现示例:

  • 主从复制配置

    在主节点上配置复制表:

    CREATE TABLE sales_data_replicated
    (
        sale_id UInt32,
        product_id UInt32,
        sale_amount Float32,
        sale_date Date
    ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/sales_data_replicated', '{replica}')
    PARTITION BY toYYYYMM(sale_date)
    ORDER BY (sale_date, product_id);
    

    在从节点上配置复制表:

    CREATE TABLE sales_data_replicated
    (
        sale_id UInt32,
        product_id UInt32,
        sale_amount Float32,
        sale_date Date
    ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/sales_data_replicated', '{replica}')
    PARTITION BY toYYYYMM(sale_date)
    ORDER BY (sale_date, product_id);
    

3. 故障恢复

实现细节:

  • 自动故障转移

    • ClickHouse 提供了自动故障转移功能,当主节点发生故障时,可以自动将流量切换到从节点,确保系统的持续运行。
    • 故障检测和转移:通过监控和故障检测机制,ClickHouse 可以自动检测节点故障,并将流量切换到正常的从节点。
  • 手动故障恢复

    • 当发生故障时,可以手动将备份数据恢复到新的节点,确保数据的可用性。
    • 故障恢复操作:可以通过恢复备份数据、重新配置复制表等操作来恢复故障节点的数据。

具体实现示例:

  • 自动故障转移配置

    cluster:
      - name: 'clickhouse-cluster'
        shards:
          - replicas:
              - host: 'clickhouse-replica1'
                port: 9000
              - host: 'clickhouse-replica2'
                port: 9000
    
实际应用示例

场景:一个在线银行需要确保其数据存储系统的高可用性和容错能力,以避免数据丢失和系统停机。

操作流程

  1. 数据备份

    • 配置 ClickHouse 定期备份银行交易数据,并将备份存储到外部存储系统(如 S3)。
  2. 数据复制

    • 配置 ClickHouse 主从复制,将银行交易数据复制到多个节点,以提高系统的可靠性和可用性。
  3. 故障恢复

    • 通过自动故障转移机制,确保在主节点发生故障时,流量自动切换到正常的从节点,保证系统的持续运行。

通过这些高可用性和容错机制,ClickHouse 能够确保系统的稳定运行,并在发生故障时迅速恢复数据和服务,提高数据存储和分析的可靠性。

总结

ClickHouse 作为一款高性能的列式数据库,以其出色的性能、灵活的架构和丰富的功能,成为大数据分析领域的重要工具。其列式存储、数据压缩、高性能查询、实时分析、分布式架构、SQL 支持以及与其他工具的兼容性,使其在处理海量数据时表现卓越。 如果你的工作涉及到大规模数据处理和分析,ClickHouse 是一个值得考虑的解决方案。它能够帮助你快速获取数据洞察,优化存储成本,并确保系统的高效和稳定。

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

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

相关文章

2024亚太杯中文赛数学建模选题建议及各题思路来啦!

大家好呀&#xff0c;2024年第十四届APMCM亚太地区大学生数学建模竞赛&#xff08;中文赛项&#xff09;开始了&#xff0c;来说一下初步的选题建议吧&#xff1a; 首先定下主基调&#xff0c; 本次亚太杯推荐大家选择B题目。C题目难度较高&#xff0c;只建议用过kaiwu的队伍…

决策树算法的原理与案例实现

一、绪论 1.1 决策树算法的背景介绍 1.2 研究决策树算法的意义 二、决策树算法原理 2.1 决策树的基本概念 2.2 决策树构建的基本思路 2.2 决策树的构建过程 2.3 决策树的剪枝策略 三、决策树算法的优缺点 3.1 决策树算法的优势 3.2 决策树算法的局限性 3.3 决策树算…

微服务粒度难题:找到合适的微服务大小

序言 在微服务架构风格中&#xff0c;微服务通常设计遵循SRP&#xff08;单一职责原则&#xff09;&#xff0c;作为一个独立部署的软件单元&#xff0c;专注于做一件事&#xff0c;并且做到极致。作为开发人员&#xff0c;我们常常倾向于在没有考虑为什么的情况下尽可能地将服…

全面教程:在Ubuntu上快速部署ZeroTier,实现Windows与VSCode的局域网无缝访问

文章目录 1 背景介绍2 Windows上的操作3 Ubuntu上的操作4 连接 1 背景介绍 在现代工作环境中&#xff0c;远程访问公司内网的Ubuntu主机对于开发者来说是一项基本需求。然而&#xff0c;由于内网的限制&#xff0c;传统的远程控制软件如向日葵和todesk往往无法满足这一需求。作…

二叉树之遍历

二叉树之遍历 二叉树遍历遍历分类前序遍历流程描述代码实现 中序遍历流程描述代码实现 后序遍历流程描述代码实现 层次遍历流程描述代码实现 总结 二叉树遍历 遍历分类 遍历二叉树的思路有 4 种&#xff0c;分别是&#xff1a; 前序遍历二叉树&#xff0c;有递归和非递归两种…

用dify实现简单的Agent应用(AI信息检索)

这篇文章里&#xff0c;我们来聊聊如何使用字节最新的豆包大模型&#xff0c;在 Dify 上来快速完成一个具备理解需求、自主规划、自主选择工具使用的简单智能体&#xff08;Agent&#xff09;。 准备工作 完整准备过程分为&#xff1a;准备 Docker 环境、启动 Dify 程序、启动…

线性代数基础概念:矩阵

目录 线性代数基础概念&#xff1a;矩阵 1. 矩阵的定义 2. 矩阵的运算 3. 矩阵的特殊类型 4. 矩阵的秩 5. 矩阵的初等变换 6. 矩阵的特征值与特征向量 7. 矩阵的应用 8. 矩阵总结 总结 线性代数基础概念&#xff1a;矩阵 矩阵是线性代数中的另一个重要概念&#xff0…

vue目录说明

vue目录说明 主要目录说明 .vscode - - -vscode工具的配置文件夹 node_modules - - - vue项目的运行依赖文件夹 public - - -资源文件夹&#xff08;浏览器图标&#xff09; src- - -源码文件夹 .gitignore - - -git忽略文件 index.html - - -入口html文件 package.json - - -…

windows搭建mqtt服务器,并配置DTU收集传感器数据

1.下载并安装emqx服务器 参考&#xff1a;Windows系统下本地MQTT服务器搭建&#xff08;保姆级教程&#xff09;_mqtt windows-CSDN博客 这里我下载的是emqx-5.3.0-windows-amd64.zip版本 下载好之后&#xff0c;放到服务器的路径&#xff0c;我这里放的地方是&#xff1a;C…

图像信号处理器(ISP)基础算法及处理流程

&#x1f4aa; 专业从事且热爱图像处理&#xff0c;图像处理专栏更新如下&#x1f447;&#xff1a; &#x1f4dd;《图像去噪》 &#x1f4dd;《超分辨率重建》 &#x1f4dd;《语义分割》 &#x1f4dd;《风格迁移》 &#x1f4dd;《目标检测》 &#x1f4dd;《暗光增强》 &a…

FreeRTOS之队列上锁和解锁(详解)

这篇文章将记录我学习实时操作系统FreeRTOS的队列上锁和解锁的知识&#xff0c;在此分享给大家&#xff0c;希望我的分享能给你带来不一样的收获&#xff01; 目录 一、简介 二、队列上锁函数prvLockQueue&#xff08;&#xff09; 1、函数初探 2、应用示例 三、队列解锁函…

转让北京文化传媒公司带营业性演出经纪许可证

影视文化传播倡导将健康的影视文化有效传播给观众&#xff0c;从而构建观众与电影制作者的良 性沟通与互动&#xff0c;是沟通电影制作者与电影受众的重要桥梁。影视文化泛指以电影&#xff0c;电视方式所进行的全部文化创造&#xff0c;即体现为电影&#xff0c;电视全部的存在…

找不到msvcp120.dll无法继续执行的原因分析及解决方法

在计算机使用中&#xff0c;经常会遇到msvcp120.dll文件丢失的情况&#xff0c;很多人对这个文件不是很熟悉&#xff0c;今天就来给大家讲解一下msvcp120.dll文件的丢失以及这个文件的重要性&#xff0c;让大家更好地了解计算机&#xff0c;同时也可以帮助我们更好地掌握这个文…

航模插头篇

一、常见的电池插头&#xff08;电调端 是公头 电池端 是母头&#xff09; 电池总是被插的 1.XT60头 过流大 安全系数高 难插拔 2.T插 插拔轻松 过流比较小 容易发烫 电调端 是公头 电池端 是母头 3.香蕉头插孔 过流够 插拔轻松 但 容易插反 爆炸 4.TX90(和XT60差…

2024 年 亚太赛 APMCM (A题)中文赛道国际大学生数学建模挑战赛 | 飞行器外形的优化 | 数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题&#xff01; 完整内容可以在文章末尾领取&#xff01; 第一个问…

C++内存管理(候捷)第一讲 笔记

内存分配的每一层面 applications可以调用STL&#xff0c;里面会有allocator进行内存分配&#xff1b;也可以使用C 基本工具primitives&#xff0c;比如new, new[], new(), ::operator new()&#xff1b;还可以使用更底层的malloc和free分配和释放内存。最底层的是系统调用&…

明星代言6个提升企业形象的杀手锏-华媒舍

在当今竞争激烈的商业世界中&#xff0c;企业形象的塑造对于品牌的发展至关重要。而明星代言作为一种常见的营销手段&#xff0c;被广泛使用来提升企业形象和产品销售。本文将介绍明星代言的六个杀手锏&#xff0c;帮助您了解如何通过明星代言来提升企业形象。 1. 拥有广泛的影…

十二、【源码】Spring整合AOP

源码地址&#xff1a;https://github.com/spring-projects/spring-framework 仓库地址&#xff1a;https://gitcode.net/qq_42665745/spring/-/tree/12-spring-aop Spring整合AOP 核心类&#xff1a; DefaultAdvisorAutoProxyCreator&#xff1a;用于在Spring框架中自动为符…

若依多数据源原理分析

首先&#xff0c;想明白不同的接口想要使用不同的数据源。 那么自然想到了AOP&#xff0c;自定义注解。 通过自定义注解标注当前方法到底使用的是哪个数据源。 上面是前置条件。 看下若依是怎么处理的&#xff1a; 1.定义自定义注解&#xff0c;以及对应的多数据源的枚举类…

天润融通分析AI技术助力客户服务,实现满意度三倍增长

如今&#xff0c;客户体验越来越成为影响客户决策的核心要素。 对于企业来讲&#xff0c;客户在不同触点的每一次互动体验&#xff0c;都成为塑造品牌声誉的“Aha时刻”。但同时&#xff0c;随着社会的发展的加速&#xff0c;客户的需求也在日新月异&#xff0c;给企业带来挑战…