当前位置: 首页 > article >正文

大数据查询争霸:CK、ES、RediSearch谁主沉浮?

一、引言

在大数据时代,数据量呈爆炸式增长,海量数据存储与查询成为众多开发者和企业面临的关键挑战。无论是互联网企业处理用户行为数据,金融机构分析交易记录,还是电商平台管理商品信息,都对高效数据查询工具提出了极高要求。面对千万级甚至更大规模的数据,如何在短时间内精准获取所需信息,成为衡量系统性能的重要指标。

ClickHouse(CK)、Elasticsearch(ES)和 RediSearch 作为当下热门的数据查询工具,各自在不同场景下展现出独特优势,吸引了众多开发者的关注。ClickHouse 以其出色的列式存储和高效的聚合查询能力,在大数据分析领域崭露头角;Elasticsearch 凭借强大的全文搜索和分布式架构,广泛应用于日志分析、内容检索等场景;RediSearch 则基于 Redis 的高速特性,为实时性要求较高的轻量级搜索场景提供了便捷解决方案。

然而,当面对千万级数据查询时,这三款工具谁才是真正的王者?哪一款更能满足不同业务场景的复杂需求?是追求极致查询性能的 ClickHouse,还是擅长全文搜索的 Elasticsearch,亦或是以高速实时性著称的 RediSearch?接下来,让我们深入剖析这三款工具,从性能、功能、适用场景等多个维度一探究竟 ,帮助大家在实际项目中做出更明智的选择。

二、三剑客登场

2.1 ClickHouse(CK)

ClickHouse 是一款用于联机分析处理(OLAP)的列式数据库管理系统 ,由俄罗斯的 Yandex 公司开发,专为海量数据的实时分析提供高效解决方案。其核心特性之一是列式存储,与传统的行式存储不同,ClickHouse 将数据按列存储。这意味着在查询时,如果只需要某几列的数据,ClickHouse 可以直接从相应的列文件中读取,而无需像行式存储那样读取整行数据。这种方式极大地减少了 I/O 操作,提高了查询效率。例如,在处理一个包含用户 ID、姓名、年龄、地址等多列的用户信息表时,如果只查询用户 ID 和年龄,列式存储可以让 ClickHouse 仅读取这两列的数据,而跳过其他列,大大提升了查询速度。

ClickHouse 还支持分布式部署,能够将数据分布在多个节点上。当执行查询时,它会自动将查询任务分发到各个节点并行执行,然后汇总结果。这种分布式架构使得 ClickHouse 能够处理超大规模的数据,并且随着节点的增加,查询性能可以线性扩展。在一个拥有多个节点的集群中,处理 TB 级别的数据查询时,分布式查询可以在秒级甚至毫秒级返回结果,满足了企业对大数据量快速分析的需求。

在实际应用中,ClickHouse 在电商数据分析领域表现出色。以某大型电商平台为例,该平台每天产生数以亿计的订单数据,包括用户信息、商品信息、交易金额、购买时间等多个维度。通过使用 ClickHouse,平台可以快速对这些数据进行多维分析,如按时间维度统计不同时间段的销售总额、按商品类别分析各类商品的销售情况、按地域分析不同地区的消费偏好等。ClickHouse 的高效查询性能使得平台能够实时获取这些分析结果,为运营决策提供有力支持 ,帮助企业及时调整营销策略,提升销售业绩。

2.2 Elasticsearch(ES)

Elasticsearch 是一个基于 Lucene 的开源分布式搜索和分析引擎,它提供了一个分布式多租户能力的全文搜索引擎,通过 RESTful API 进行操作。其底层基于 Lucene 库,利用 Lucene 强大的索引和搜索能力,Elasticsearch 将其进行封装和扩展,提供了更简单易用的 RESTful 接口,使得开发者可以方便地进行各种搜索和分析操作。

Elasticsearch 具有分布式的特性,它可以轻松地扩展到多个节点,实现高可用性和横向扩展。在一个由多个节点组成的集群中,数据会被自动分片并分布在各个节点上,同时,每个分片还可以有多个副本,以提高数据的可靠性和读取性能。当某个节点出现故障时,其他节点可以自动接管其工作,确保系统的正常运行。

在日志分析场景中,Elasticsearch 有着广泛的应用。许多企业的系统每天都会产生大量的日志数据,包括系统日志、应用程序日志、访问日志等。这些日志数据对于问题诊断、性能监控、安全审计等方面非常重要。使用 Elasticsearch,企业可以将这些日志数据快速索引和存储,通过其强大的搜索和聚合功能,能够快速定位到特定时间范围内、特定类型的日志记录,分析系统的运行状况、发现潜在的问题和安全威胁。结合 Kibana 等可视化工具,还可以创建直观的仪表盘,实时展示日志数据的各种统计信息和趋势,帮助运维人员和管理人员更好地了解系统状态。

2.3 RediSearch

RediSearch 是 Redis Labs 提供的一款基于 Redis 的全文搜索引擎模块,它允许用户在 Redis 数据库中进行复杂的搜索和全文检索操作,而无需将数据导出到其他搜索引擎。RediSearch 依托于 Redis 的内存存储特性,能够实现快速查询响应,适用于高并发场景。由于 Redis 将数据存储在内存中,数据的读取速度极快,RediSearch 继承了这一优势,使得搜索操作可以在短时间内完成,满足了对实时性要求较高的应用场景。

RediSearch 支持多字段索引和模糊查询等功能。用户可以为文档的多个字段创建索引,在查询时可以根据不同字段进行精确匹配或模糊匹配,满足复杂的查询需求。在一个新闻搜索应用中,可以为新闻的标题、内容、作者、发布时间等字段创建索引,用户在搜索时既可以通过标题精确查找某篇新闻,也可以通过关键词在内容中进行模糊搜索,还可以结合作者、发布时间等条件进行更精准的筛选。

在实时搜索场景中,RediSearch 有着独特的优势。以电商网站的商品搜索为例,用户在浏览商品时,希望能够快速找到自己需要的商品。RediSearch 可以实时索引商品信息的变化,当用户输入搜索关键词时,能够立即返回相关的商品结果,提供流畅的搜索体验。并且,RediSearch 的部署和集成相对简单,与 Redis 紧密结合,对于已经使用 Redis 的项目来说,可以方便地引入 RediSearch 来增强搜索功能,而无需额外搭建复杂的搜索系统。

三、性能大比拼

3.1 索引构建性能

在索引构建方面,ClickHouse 凭借其列式存储和高压缩率,在处理大规模数据时表现出色 。列式存储使得 ClickHouse 在写入数据时,每列的数据可以连续存储,这有利于提高数据加载速度。同时,其高压缩率能够有效减少数据存储所需的磁盘空间,进一步加快了数据的写入和索引构建过程。在构建一个包含千万级用户信息的索引时,ClickHouse 可以在相对较短的时间内完成,并且由于其高效的存储方式,对磁盘 I/O 的压力较小。

Elasticsearch 在分布式环境下的索引构建性能也非常优秀。它支持批量索引和并行处理,能够充分利用集群中各个节点的资源,快速处理大量数据。当有新的数据需要索引时,Elasticsearch 可以将索引任务分发到多个节点上并行执行,大大缩短了索引构建的时间。在一个拥有多个节点的分布式集群中,Elasticsearch 可以在分钟级甚至秒级内完成千万级数据的索引构建,为后续的搜索和分析提供快速响应。

RediSearch 在处理实时数据时,索引构建速度快且延迟低,这得益于其增量索引功能。RediSearch 基于 Redis 的内存存储特性,数据的写入和索引更新都在内存中进行,速度极快。当有新的数据产生时,RediSearch 可以实时地将其添加到索引中,几乎不会产生延迟。在一个实时搜索的应用场景中,如电商网站的商品搜索,当有新的商品上架或商品信息更新时,RediSearch 能够立即更新索引,保证用户能够搜索到最新的商品信息。

综合来看,ClickHouse 适合处理大规模数据的索引构建,能够在保证速度的同时,高效利用存储资源;Elasticsearch 在分布式环境下表现突出,通过并行处理和批量索引,快速构建索引;RediSearch 则在实时数据处理方面具有明显优势,能够满足对实时性要求较高的场景。

3.2 查询性能

在查询性能上,ClickHouse 展现出卓越的表现,特别是在处理复杂查询和聚合操作时。其向量化计算和多核并行处理能力是实现高性能的关键。向量化计算允许 ClickHouse 以向量为单位对数据进行处理,而不是逐行处理,大大提高了计算效率。多核并行处理则充分利用了服务器的多核 CPU 资源,能够在短时间内完成大量计算。在进行复杂的聚合查询,如统计不同时间段内各类商品的销售总额、平均价格等,ClickHouse 可以在秒级甚至毫秒级返回结果。

Elasticsearch 在全文搜索和实时分析方面表现强大。它支持复杂的查询语法,如布尔查询、模糊查询、嵌套查询等,能够满足各种复杂的搜索需求。在日志分析场景中,用户可能需要根据多个条件进行搜索,如在特定时间范围内,包含特定关键词,且来自特定服务器的日志记录。Elasticsearch 可以通过其强大的查询语法,快速定位到符合条件的日志数据,并进行实时分析。

RediSearch 在处理全文搜索和多字段查询时表现出色。它的低延迟和高吞吐量使得查询响应速度极快。由于 RediSearch 基于 Redis 的内存存储,数据的读取和查询操作都在内存中进行,避免了磁盘 I/O 的延迟。在一个新闻搜索应用中,用户输入关键词进行搜索时,RediSearch 可以在毫秒级返回相关的新闻列表,提供流畅的搜索体验。

3.3 深翻页查询性能

深翻页查询是指在查询结果集中获取较深页码的数据,例如获取第 1000 页以后的数据。在这种场景下,ClickHouse 通过支持高效的分页查询和多线程处理,能够在短时间内返回大量数据。它可以利用多线程并行读取数据,减少查询时间。不过,当翻页深度非常大时,由于需要扫描大量数据,性能会有所下降。

Elasticsearch 支持多种分页查询方法,如 scroll 和 search_after。scroll 通过创建一个快照,将查询结果缓存起来,然后通过滚动的方式获取不同页码的数据,适用于需要一次性获取大量数据的场景,但它会占用较多的内存资源。search_after 则是基于上一次查询结果的最后一条数据的某个字段值进行下一页的查询,避免了深度分页时的性能问题,更适合实时性要求较高的深翻页查询。

RediSearch 凭借其低延迟和高吞吐量,在深翻页查询时也能保持较好的性能表现。它的查询响应速度快,用户体验好。在一个电商商品列表的深翻页场景中,用户不断点击下一页查看更多商品时,RediSearch 能够快速返回相应页码的商品数据,让用户感觉不到明显的延迟。

四、应用场景剖析

4.1 CK 的舞台

ClickHouse 在大规模数据存储和分析场景中表现卓越,尤其适合需要进行复杂查询和聚合操作的场景。在电商销售数据分析场景中,电商平台每天都会产生海量的销售数据,包括订单信息、用户信息、商品信息等多个维度。ClickHouse 可以轻松存储这些大规模数据,并通过高效的查询和聚合操作,为平台提供深入的数据分析支持。

例如,电商平台可以利用 ClickHouse 统计不同时间段的销售总额、各商品类别的销售排名、不同地区的用户购买偏好等。通过对这些数据的分析,平台能够制定更精准的营销策略,优化商品推荐算法,提升用户购买转化率 。在统计不同时间段的销售总额时,ClickHouse 可以利用其列式存储和并行计算能力,快速扫描大量数据,在短时间内完成复杂的聚合计算,为运营决策提供及时准确的数据支持。

4.2 ES 的主场

Elasticsearch 在日志分析、全文搜索、实时分析等场景中具有明显优势。以电商商品搜索为例,随着电商平台商品数量的不断增加,用户对商品搜索的准确性和响应速度要求也越来越高。Elasticsearch 的全文搜索功能可以对商品的标题、描述、属性等多个字段进行索引和搜索,支持模糊查询、精确查询、布尔查询等多种查询方式,能够快速准确地返回用户所需的商品结果。

在日志分析场景中,Elasticsearch 也发挥着重要作用。许多企业的业务系统每天都会产生大量的日志数据,包括系统日志、应用程序日志、用户行为日志等。这些日志数据对于问题排查、性能优化、安全审计等方面至关重要。Elasticsearch 可以实时收集和索引这些日志数据,通过强大的搜索和分析功能,帮助运维人员快速定位和解决问题,同时也能为数据分析人员提供有价值的数据洞察,助力企业进行业务优化和决策制定。

4.3 RediSearch 的战场

RediSearch 在实时数据处理和全文搜索场景中有着独特的应用价值。以即时通讯系统的消息搜索为例,在即时通讯系统中,用户希望能够快速搜索到历史消息,并且要求搜索功能具有实时性,能够及时反映消息的新增和更新。RediSearch 基于 Redis 的内存存储特性,能够快速索引和查询消息数据,满足用户对消息搜索的实时性和高效性要求。

当用户在即时通讯系统中输入关键词进行消息搜索时,RediSearch 可以在毫秒级返回相关的消息记录,提供流畅的搜索体验。并且,RediSearch 支持多字段索引和模糊查询,用户可以根据消息的发送者、接收者、内容等多个字段进行灵活搜索,提高搜索的准确性和灵活性。

五、代码实战

5.1 CK 代码示例

-- 创建数据库
CREATE DATABASE IF NOT EXISTS test_db;
-- 使用数据库
USE test_db;
-- 创建表
CREATE TABLE users (
    user_id UInt32,
    user_name String,
    age UInt8,
    city String,
    registration_time DateTime
) ENGINE = MergeTree()
ORDER BY (user_id, registration_time);
-- 插入数据
INSERT INTO users (user_id, user_name, age, city, registration_time)
VALUES 
(1, 'Alice', 25, 'New York', '2023-01-01 10:00:00'),
(2, 'Bob', 30, 'Los Angeles', '2023-02-01 11:00:00'),
(3, 'Charlie', 28, 'Chicago', '2023-03-01 12:00:00');
-- 查询数据
SELECT * FROM users WHERE city = 'New York';

代码含义解释:

  • CREATE DATABASE语句用于创建一个名为test_db的数据库,如果该数据库已存在则不会报错。

  • USE语句用于指定后续操作将在test_db数据库中进行。

  • CREATE TABLE语句创建了一个名为users的表,定义了user_id、user_name、age、city和registration_time五个字段,分别表示用户 ID、用户名、年龄、所在城市和注册时间。ENGINE = MergeTree()指定使用 MergeTree 引擎,它是 ClickHouse 中最常用的引擎之一,支持高效的插入、查询和数据管理。ORDER BY指定了表的排序规则,按user_id和registration_time进行排序。

  • INSERT INTO语句向users表中插入了三条记录,每条记录包含五个字段的值。

  • SELECT语句用于查询users表中所有所在城市为New York的记录。

5.2 ES 代码示例

在使用 Java 操作 Elasticsearch 之前,需要在项目中引入相关依赖,例如使用 Maven 项目时,在pom.xml文件中添加以下依赖:

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

Java 代码示例如下:

import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
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.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;

import java.io.IOException;

public class ESTest {
    public static void main(String[] args) throws IOException {
        // 创建ES客户端
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("localhost", 9200, "http")));
        // 创建索引
        CreateIndexRequest createIndexRequest = new CreateIndexRequest("users_index");
        CreateIndexResponse createIndexResponse = client.indices().create(createIndexRequest, RequestOptions.DEFAULT);
        if (createIndexResponse.isAcknowledged()) {
            System.out.println("索引创建成功");
        }
        // 插入数据
        IndexRequest indexRequest = new IndexRequest("users_index")
              .id("1")
              .source("{\"user_id\": 1, \"user_name\": \"Alice\", \"age\": 25, \"city\": \"New York\", \"registration_time\": \"2023-01-01 10:00:00\"}", XContentType.JSON);
        IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
        if (indexResponse.getResult().name().equals("CREATED")) {
            System.out.println("文档插入成功");
        }
        // 查询数据
        SearchRequest searchRequest = new SearchRequest("users_index");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchQuery("city", "New York"));
        searchRequest.source(searchSourceBuilder);
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        for (SearchHit hit : searchResponse.getHits()) {
            System.out.println(hit.getSourceAsString());
        }
        // 关闭客户端
        client.close();
    }
}

代码含义解释:

  • 首先通过RestHighLevelClient创建与 Elasticsearch 服务器的连接,连接地址为localhost:9200,使用 HTTP 协议。

  • 创建索引时,CreateIndexRequest用于创建一个名为users_index的索引请求,client.indices().create方法执行创建索引操作,通过createIndexResponse.isAcknowledged()判断索引是否创建成功。

  • 插入数据时,IndexRequest构建一个插入文档的请求,指定索引名称为users_index,文档 ID 为1,并通过source方法设置文档内容为 JSON 格式的字符串。client.index方法执行插入操作,根据indexResponse.getResult()判断插入结果。

  • 查询数据时,SearchRequest创建一个针对users_index索引的搜索请求,SearchSourceBuilder构建查询条件,这里使用QueryBuilders.matchQuery进行匹配查询,查找city字段为New York的文档。client.search方法执行搜索操作,遍历searchResponse.getHits()获取查询结果并打印。

  • 最后通过client.close()关闭客户端连接。

5.3 RediSearch 代码示例

使用 RediSearch 进行操作,首先需要确保 Redis 服务器已安装并启动 RediSearch 模块。以下是使用 Python 的redis - py库进行操作的示例代码:

import redis
from redis.commands.search.field import TextField, NumericField
from redis.commands.search.indexDefinition import IndexDefinition, IndexType
from redis.commands.search.query import Query

# 连接Redis服务器
r = redis.Redis(host='localhost', port=6379, db=0)
# 创建索引
schema = (
    TextField("user_name"),
    NumericField("age"),
    TextField("city"),
    TextField("registration_time")
)
index_def = IndexDefinition(prefix=['user:'], index_type=IndexType.HASH)
r.ft("users_index").create_index(schema, definition=index_def)
# 插入数据
r.hset("user:1", mapping={"user_id": 1, "user_name": "Alice", "age": 25, "city": "New York", "registration_time": "2023-01-01 10:00:00"})
# 查询数据
q = Query("@city:{New York}").limit(0, 10)
result = r.ft("users_index").search(q)
for doc in result.docs:
    print(doc)

代码含义解释:

  • 使用redis.Redis创建与 Redis 服务器的连接,连接地址为localhost,端口为6379,使用数据库0。

  • 创建索引时,定义了一个包含user_name、age、city和registration_time字段的模式schema,其中user_name、city和registration_time为文本字段,age为数字字段。IndexDefinition指定索引前缀为user:,索引类型为HASH。r.ft(“users_index”).create_index方法创建名为users_index的索引。

  • 插入数据时,使用r.hset方法将数据以哈希的形式存储到 Redis 中,键为user:1,值为包含用户信息的映射。

  • 查询数据时,构建一个查询对象q,使用@city:{New York}表示查询city字段为New York的文档,limit(0, 10)表示从第 0 条开始,最多返回 10 条结果。r.ft(“users_index”).search方法执行查询操作,遍历result.docs获取查询结果并打印。

六、总结与展望

6.1 总结

通过对 ClickHouse(CK)、Elasticsearch(ES)和 RediSearch 在性能、应用场景和代码实战等方面的深入分析,我们可以清晰地看到,这三款工具在千万级数据查询场景下各有千秋 。

ClickHouse 凭借其列式存储、向量化计算和多核并行处理等技术,在大规模数据存储和复杂查询聚合操作中表现卓越,适合处理海量数据的分析场景,如电商销售数据分析、金融交易数据统计等。其高效的查询性能和强大的分布式处理能力,能够快速从海量数据中提取有价值的信息,为企业决策提供有力支持。

Elasticsearch 基于 Lucene 的强大索引和搜索功能,在全文搜索、日志分析和实时分析场景中占据优势。它支持复杂的查询语法和高效的分页查询,能够满足用户对数据快速检索和分析的需求。在日志管理、内容检索等场景中,Elasticsearch 能够快速定位和分析相关数据,帮助用户及时发现问题和洞察趋势。

RediSearch 基于 Redis 的内存存储特性,在实时数据处理和全文搜索场景中表现出色。其低延迟和高吞吐量使得查询响应速度极快,适合对实时性要求较高的场景,如即时通讯消息搜索、电商商品实时搜索等。RediSearch 的增量索引功能和简单易用的特点,也使其在一些轻量级搜索场景中具有独特的优势。

在实际项目中,选择合适的工具需要综合考虑业务需求、数据规模、查询类型、系统架构和团队技术栈等多方面因素。如果业务主要涉及大规模数据的复杂分析和聚合操作,ClickHouse 可能是首选;如果对全文搜索和实时分析要求较高,Elasticsearch 会是更好的选择;而对于实时性要求极高的轻量级搜索场景,RediSearch 则能发挥其最大价值。

6.2 展望

随着大数据技术的不断发展,数据量将持续增长,对数据查询和分析的要求也会越来越高。未来,这三款工具以及其他大数据相关技术有望在以下几个方面取得进一步发展:

  • 性能优化:继续提升查询性能,降低响应时间,提高系统的扩展性和稳定性,以应对不断增长的数据量和复杂的查询需求。例如,ClickHouse 可能会进一步优化向量化计算和分布式查询算法,Elasticsearch 会不断改进索引和搜索机制,RediSearch 则会利用 Redis 的技术演进提升自身性能。

  • 功能拓展:增加更多实用功能,如更强大的数据分析函数、更智能的查询优化器、更好的可视化支持等,以满足用户多样化的需求。比如,Elasticsearch 可能会增强其数据分析功能,提供更丰富的统计和机器学习算法;RediSearch 可能会支持更复杂的查询逻辑和数据处理功能。

  • 融合创新:不同工具之间可能会出现更多的融合和协作,形成更强大的解决方案。例如,结合 ClickHouse 的数据分析能力和 Elasticsearch 的搜索功能,或者将 RediSearch 与其他缓存和存储技术结合,实现更高效的数据处理和查询。

  • 数据安全与隐私保护:随着数据安全和隐私问题日益受到关注,大数据查询工具将更加注重数据的加密、访问控制和隐私保护,确保数据在存储和查询过程中的安全性。

作为开发者,我们需要持续关注大数据领域的技术发展动态,不断学习和探索新的技术和工具,以便在实际项目中选择最适合的解决方案,为企业创造更大的价值。希望本文能为大家在面对千万级数据查询时选择合适的工具提供有益的参考和帮助。


http://www.kler.cn/a/537651.html

相关文章:

  • DeepSeek:知识图谱与大模型参数化知识融合的创新架构
  • std::memory_order
  • Windows Docker笔记-Docker拉取镜像
  • Linux 内核模块 | 加载 / 添加 / 删除 / 优先级
  • 【数据结构】(6) LinkedList 链表
  • tcpdump 的工作层次
  • 游戏引擎学习第90天
  • python基础入门:3.3序列通用操作
  • SpringBoot中的多环境配置管理
  • 从Oracle 到帆软BI:打造高效数据可视化仪表盘
  • 人工智能A*-启发式函数、增量式 A* 算法
  • 余数相同问题(信息学奥赛一本通-1080)
  • 从基础到进阶,掌握 CSS 变量与calc()函数的完整指南
  • Deepseek部署的模型参数要求
  • 内核日志查看:dmesg命令
  • CSS 布局全面解析:从传统浮动到现代 Flexbox 和 Grid
  • harmonyOS生命周期详述
  • android skia渲染介绍
  • Arduino 型号的对比
  • 微信小程序如何使用decimal计算金额
  • STM32G474--Whetstone程序移植(单精度)笔记
  • TypeScript 中的对象类型:深入理解接口和类型别名
  • SpringBoot速成(六)自定义starter
  • 企业4个内外网数据摆渡问题需要注意
  • Kafka系列之:定位topic只能保存最新数据的原因
  • 全国计算机等级考试(NCRE)四级计算机网络考试大纲(2025年版)