【Elasticsearch】Elasticsearch 核心技术(一):索引

news2025/6/4 16:02:04

Elasticsearch 核心技术(一):索引

  • 1.索引的定义
  • 2.索引的命名规范
  • 3.索引的增、删、改、查
    • 3.1 创建索引
      • 3.1.1 创建空索引
    • 3.2 删除索引
    • 3.3 文档操作
      • 3.3.1 添加/更新文档(指定ID)
      • 3.3.2 添加文档(自动生成ID)
      • 3.3.3 更新文档(部分更新)
      • 3.3.4 删除文档
    • 3.4 查询操作
      • 3.4.1 获取单个文档
      • 3.4.2 搜索文档(简单查询)
      • 3.4.3 复合查询
      • 3.4.4 聚合查询
    • 3.5 批量操作
      • 3.5.1 批量索引文档
      • 3.5.2 批量更新/删除
  • 4.索引别名
    • 4.1 什么是索引别名?
    • 4.2 索引别名的作用
    • 4.3 具体实现方法
      • 4.3.1 创建别名
      • 4.3.2 为多个索引创建别名
      • 4.3.3 切换别名(原子操作)
      • 4.3.4 带过滤条件的别名
      • 4.3.5 查看别名信息
    • 4.4 使用示例场景
      • 场景1:索引重建与零停机切换
      • 场景2:分片查询
    • 4.5 注意事项
    • 4.6 实际应用案例
      • 电商平台商品索引管理
  • 5.索引模板
    • 5.1 什么是索引模板?
    • 5.2 索引模板主要解决的业务问题
    • 5.3 索引模板类型
    • 5.4 具体实现方法
      • 5.4.1 创建简单索引模板
      • 5.4.2 使用组件模板(更模块化)
    • 5.5 实际应用案例
      • 案例 1:电商平台订单索引
      • 案例 2:多租户 SaaS 应用
    • 5.6 使用时注意事项
    • 5.7 最佳实践建议

1.索引的定义

索引是具有相同数据结构的文档的集合,由唯一索引名称标定。一个集群中有多个索引,不同的索引代表不同的业务类型数据。比如:

  • 将采集的不同业务类型的数据存储到不同的索引
    • 微博业务:weibo_index
    • 新闻业务:news_index
  • 按日期切分存储日志索引
    • 2024 年 7 月的日志对应 logs_202407
    • 2024 年 8 月的日志对应 logs_202408

例如,通过以下命令创建名为 index_00001 的索引。

PUT index_00001

2.索引的命名规范

✅ 索引的命名规范如下:

  • 只能使用小写字母,不能使用大写字母
  • 不能包括 \ / * ? " < > | '' , # : 及空格等特殊符号
  • 不能以 - _ + 作为开始字符
  • 不能命名为 . 或者 ..
  • 不能超过 255 255 255 个字节
  • 不建议使用中文命名

❌ 错误的命名方式

  • 不允许:PUT INDEX_0002
  • 不允许:PUT _index_0003
  • 不允许:PUT index?_0004
  • 不允许:PUT ..
  • 不规范:PUT 索引0006

3.索引的增、删、改、查

以下示例展示了 Elasticsearch 中最常用的索引和文档操作。实际使用时,可以根据具体需求调整查询条件和参数。

3.1 创建索引

3.1.1 创建空索引

PUT /my_index
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 2
  },
  "mappings": {
    "properties": {
      "title": {
        "type": "text"
      },
      "description": {
        "type": "text"
      },
      "price": {
        "type": "float"
      },
      "created_at": {
        "type": "date"
      }
    }
  }
}

在这里插入图片描述

3.2 删除索引

DELETE /my_index

3.3 文档操作

3.3.1 添加/更新文档(指定ID)

PUT /my_index/_doc/1
{
  "title": "Elasticsearch Guide",
  "description": "A comprehensive guide to Elasticsearch",
  "price": 49.99,
  "created_at": "2023-01-15"
}

在这里插入图片描述

3.3.2 添加文档(自动生成ID)

POST /my_index/_doc
{
  "title": "Learning Elasticsearch",
  "description": "Beginner's guide to Elasticsearch",
  "price": 29.99,
  "created_at": "2023-02-20"
}

在这里插入图片描述

3.3.3 更新文档(部分更新)

POST /my_index/_update/1
{
  "doc": {
    "price": 39.99
  }
}

在这里插入图片描述

3.3.4 删除文档

DELETE /my_index/_doc/1

3.4 查询操作

3.4.1 获取单个文档

GET /my_index/_doc/1

在这里插入图片描述

3.4.2 搜索文档(简单查询)

GET /my_index/_search
{
  "query": {
    "match": {
      "title": "guide"
    }
  }
}

在这里插入图片描述

3.4.3 复合查询

GET /my_index/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "title": "guide" } }
      ],
      "filter": [
        { "range": { "price": { "lte": 50 } } }
      ]
    }
  },
  "sort": [
    { "created_at": { "order": "desc" } }
  ],
  "from": 0,
  "size": 10
}

在这里插入图片描述

3.4.4 聚合查询

GET /my_index/_search
{
  "size": 0,
  "aggs": {
    "avg_price": {
      "avg": { "field": "price" }
    },
    "price_ranges": {
      "range": {
        "field": "price",
        "ranges": [
          { "to": 20 },
          { "from": 20, "to": 50 },
          { "from": 50 }
        ]
      }
    }
  }
}

在这里插入图片描述

3.5 批量操作

3.5.1 批量索引文档

POST /my_index/_bulk
{ "index": { "_id": "2" } }
{ "title": "Advanced Elasticsearch", "description": "For experienced users", "price": 59.99, "created_at": "2023-03-10" }
{ "index": { "_id": "3" } }
{ "title": "Elasticsearch Cookbook", "description": "Practical recipes", "price": 45.50, "created_at": "2023-04-05" }

在这里插入图片描述

3.5.2 批量更新/删除

POST /my_index/_bulk
{ "update": { "_id": "2" } }
{ "doc": { "price": 55.99 } }
{ "delete": { "_id": "3" } }

在这里插入图片描述

4.索引别名

4.1 什么是索引别名?

索引别名Index Alias)是 Elasticsearch 中一个指向一个或多个索引的虚拟名称。它就像是一个指针或快捷方式,允许你通过一个名称来引用实际的索引,而不需要直接使用索引的真实名称。

4.2 索引别名的作用

  • 简化索引管理:为复杂的索引名称提供简单的别名。
  • 无缝切换索引:在不更改应用代码的情况下切换底层索引。
  • 实现零停机维护:重建索引时不影响查询。
  • 分组查询:通过一个别名查询多个索引。
  • 权限控制:为不同用户提供不同的别名访问同一索引。
  • 实现索引生命周期策略:如热温冷架构。

4.3 具体实现方法

4.3.1 创建别名

# 为单个索引创建别名
POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "products_2023",
        "alias": "current_products"
      }
    }
  ]
}

4.3.2 为多个索引创建别名

POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "products_2023_q1",
        "alias": "all_products"
      }
    },
    {
      "add": {
        "index": "products_2023_q2",
        "alias": "all_products"
      }
    }
  ]
}

4.3.3 切换别名(原子操作)

POST /_aliases
{
  "actions": [
    {
      "remove": {
        "index": "products_2023",
        "alias": "current_products"
      }
    },
    {
      "add": {
        "index": "products_2024",
        "alias": "current_products"
      }
    }
  ]
}

4.3.4 带过滤条件的别名

POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "products",
        "alias": "high_value_products",
        "filter": {
          "range": {
            "price": {
              "gte": 1000
            }
          }
        }
      }
    }
  ]
}

4.3.5 查看别名信息

GET /_alias/current_products
GET /products_2023/_alias

4.4 使用示例场景

场景1:索引重建与零停机切换

  • 创建新索引并导入数据
PUT /products_2024_v2
{
  "settings": { /* 新设置 */ },
  "mappings": { /* 新映射 */ }
}

# 导入数据到新索引...
  • 原子切换别名
POST /_aliases
{
  "actions": [
    {
      "remove": {
        "index": "products_2024_v1",
        "alias": "current_products"
      }
    },
    {
      "add": {
        "index": "products_2024_v2",
        "alias": "current_products"
      }
    }
  ]
}

场景2:分片查询

# 创建按月分片的索引
PUT /logs_2023-01
PUT /logs_2023-02
PUT /logs_2023-03

# 创建全局别名
POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "logs_2023-*",
        "alias": "logs_2023"
      }
    }
  ]
}

# 查询时可以使用别名查询所有分片
GET /logs_2023/_search
{
  "query": {
    "match_all": {}
  }
}

4.5 注意事项

  • 性能考虑
    • 别名指向多个索引时,查询会分散到所有索引
    • 过多的索引可能导致查询性能下降
  • 写入限制
    • 一个别名只能指向一个索引时才能用于写入操作
    • 多索引别名只能用于读取
  • 过滤别名
    • 过滤条件会增加查询开销
    • 复杂的过滤条件可能影响性能
  • 别名与索引关系
    • 删除索引不会自动删除关联的别名
    • 别名可以独立于索引存在
  • 权限控制
    • 确保应用程序只有别名访问权限而非实际索引
    • 可以通过别名实现数据访问隔离
  • 监控与维护
    • 定期检查别名配置是否正确
    • 避免创建循环引用

4.6 实际应用案例

电商平台商品索引管理

  • 初始设置
PUT /products_v1
POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "products_v1",
        "alias": "products"
      }
    }
  ]
}
  • 应用代码始终使用 products 别名
# 查询
GET /products/_search

# 写入
POST /products/_doc
  • 需要重建索引时
# 创建新索引
PUT /products_v2
{
  "settings": {
    "number_of_shards": 5
  },
  "mappings": {
    "properties": {
      "name": { "type": "text" },
      "price": { "type": "scaled_float", "scaling_factor": 100 }
    }
  }
}

# 导入数据到新索引...

# 原子切换
POST /_aliases
{
  "actions": [
    {
      "remove": {
        "index": "products_v1",
        "alias": "products"
      }
    },
    {
      "add": {
        "index": "products_v2",
        "alias": "products"
      }
    }
  ]
}

# 可选的:删除旧索引
DELETE /products_v1

通过这种方式,应用代码不需要任何修改即可切换到新索引,实现了零停机索引迁移。

5.索引模板

5.1 什么是索引模板?

索引模板Index Template)是 Elasticsearch 中一种自动为新创建的索引应用预定义配置(包括设置、映射和别名)的机制。当新索引的名称与模板中定义的模式匹配时,Elasticsearch 会自动将模板中的配置应用到该索引。

5.2 索引模板主要解决的业务问题

  • 标准化配置管理:确保遵循统一的索引结构标准。
  • 自动化索引创建:减少人工干预和配置错误。
  • 大规模索引管理:简化大量相似索引的管理工作。
  • 动态索引场景:处理按时间、业务分片的索引(如日志、时间序列数据)。
  • 一致性保障:确保所有匹配索引具有相同的设置和映射。

5.3 索引模板类型

Elasticsearch 7.8 + 7.8+ 7.8+ 支持两种模板类型:

  • 传统模板Legacy Templates):适用于索引。
  • 组件模板Component Templates):可复用的模板模块。

5.4 具体实现方法

5.4.1 创建简单索引模板

PUT /_index_template/logs_template
{
  "index_patterns": ["logs-*"],  // 匹配所有以logs-开头的索引
  "template": {
    "settings": {
      "number_of_shards": 3,
      "number_of_replicas": 1,
      "index.lifecycle.name": "logs_policy"  // 关联ILM策略
    },
    "mappings": {
      "properties": {
        "@timestamp": {
          "type": "date"
        },
        "level": {
          "type": "keyword"
        },
        "message": {
          "type": "text"
        },
        "service": {
          "type": "keyword"
        }
      }
    },
    "aliases": {
      "all_logs": {}  // 为匹配索引自动添加别名
    }
  },
  "priority": 200,  // 优先级(越高越优先)
  "version": 1,
  "_meta": {
    "description": "日志索引模板"
  }
}

5.4.2 使用组件模板(更模块化)

# 创建组件模板1:基础设置
PUT /_component_template/logs_settings
{
  "template": {
    "settings": {
      "number_of_shards": 3,
      "number_of_replicas": 1,
      "index.lifecycle.name": "logs_policy"
    }
  }
}

# 创建组件模板2:日志映射
PUT /_component_template/logs_mappings
{
  "template": {
    "mappings": {
      "properties": {
        "@timestamp": { "type": "date" },
        "level": { "type": "keyword" },
        "message": { "type": "text" }
      }
    }
  }
}

# 组合组件模板创建索引模板
PUT /_index_template/logs_composite_template
{
  "index_patterns": ["logs-*"],
  "composed_of": ["logs_settings", "logs_mappings"],
  "priority": 200,
  "version": 2
}

5.5 实际应用案例

案例 1:电商平台订单索引

业务需求:每天创建一个新索引存储订单数据,确保所有订单索引结构一致

PUT /_index_template/orders_daily_template
{
  "index_patterns": ["orders-*"],
  "template": {
    "settings": {
      "number_of_shards": 5,
      "number_of_replicas": 2,
      "index.refresh_interval": "30s"
    },
    "mappings": {
      "properties": {
        "order_id": { "type": "keyword" },
        "customer_id": { "type": "keyword" },
        "order_date": { "type": "date" },
        "amount": { "type": "double" },
        "items": {
          "type": "nested",
          "properties": {
            "product_id": { "type": "keyword" },
            "quantity": { "type": "integer" },
            "price": { "type": "double" }
          }
        }
      }
    },
    "aliases": {
      "current_orders": {}
    }
  },
  "priority": 100
}

# 每天自动创建索引(应用会使用日期创建索引如orders-2023-10-01)
# 由于匹配orders-*模式,模板配置会自动应用

案例 2:多租户 SaaS 应用

业务需求:为每个客户创建独立索引,但保持统一结构

PUT /_index_template/tenant_data_template
{
  "index_patterns": ["tenant_*"],
  "template": {
    "settings": {
      "number_of_shards": 2,
      "analysis": {
        "analyzer": {
          "tenant_analyzer": {
            "type": "custom",
            "tokenizer": "standard",
            "filter": ["lowercase"]
          }
        }
      }
    },
    "mappings": {
      "properties": {
        "tenant_id": { "type": "keyword" },
        "content": {
          "type": "text",
          "analyzer": "tenant_analyzer"
        },
        "created_at": { "type": "date" }
      }
    }
  }
}

# 当创建tenant_acme、tenant_xyz等索引时,模板会自动应用

5.6 使用时注意事项

  • 优先级冲突
    • 多个模板可能匹配同一个索引名称。
    • 使用 priority 字段明确优先级(数值越大优先级越高)。
    • 建议为不同模式设置明确的优先级。
  • 模板应用时机
    • 只在索引创建时应用。
    • 对已有索引的修改不会触发模板重新应用。
  • 版本控制
    • 使用 version 字段跟踪模板版本。
    • 更新模板时递增版本号。
  • 索引模式设计
    • 模式应足够具体以避免意外匹配。
    • logs-app-*logs-* 更明确。
  • 组件模板优势
    • 7.8+ 版本推荐使用组件模板。
    • 提高配置复用性。
    • 便于维护和更新。
  • 系统模板
    • Elasticsearch 有内置系统模板(如 .monitoring-*)。
    • 避免与系统模板冲突。
  • 模板查看与管理
    # 查看所有模板
    GET /_index_template
    
    # 查看特定模板
    GET /_index_template/<template_name>
    
    # 删除模板
    DELETE /_index_template/<template_name>
    
  • 测试验证
    • 使用模拟索引创建测试模板效果。
    POST /_index_template/_simulate/index/test_logs-001
    {
      "index_patterns": ["logs-*"],
      "template": {
        "settings": {
          "number_of_shards": 2
        }
      }
    }
    

5.7 最佳实践建议

  • 命名规范
    • 为模板使用描述性名称(如 ecommerce_orders_template)。
    • 索引模式使用明确的前缀/后缀(如 metric-*-prod)。
  • 文档化
    • 使用 _meta 字段记录模板用途和变更历史。
    "_meta": {
      "description": "用于存储所有产品日志",
      "created_by": "data_team",
      "version": "1.1"
    }
    
  • 版本控制
    • 将模板配置纳入版本控制系统。
    • 实现模板的 CI/CD 流程。
  • 监控模板使用
    • 定期检查哪些索引应用了哪些模板。
    • 监控模板匹配情况。
  • 与 ILM 策略结合
    "settings": {
      "index.lifecycle.name": "hot_warm_cold_policy",
      "index.lifecycle.rollover_alias": "logs_alias"
    }
    

通过合理使用索引模板,可以显著提高 Elasticsearch 集群的管理效率,确保索引配置的一致性,并为动态索引场景提供自动化支持。

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

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

相关文章

Fullstack 面试复习笔记:操作系统 / 网络 / HTTP / 设计模式梳理

Fullstack 面试复习笔记&#xff1a;操作系统 / 网络 / HTTP / 设计模式梳理 面试周期就是要根据JD调整准备内容&#xff08;挠头&#xff09;&#xff0c;最近会混合复习针对全栈这块的内容&#xff0c;目前是根据受伤的JD&#xff0c;优先选择一些基础的操作系统、Java、Nod…

中科院报道铁电液晶:从实验室突破到多场景应用展望

2020年的时候&#xff0c;相信很多关注科技前沿的朋友都注意到&#xff0c;中国科学院一篇报道聚焦一项有望改写显示产业格局的新技术 —— 铁电液晶&#xff08;FeLC&#xff09;。这项被业内称为 "下一代显示核心材料" 的研究&#xff0c;究竟取得了哪些实质性进展…

智慧政务标准规范介绍:构建高效、协同的政务信息体系

在当今信息化快速发展的时代&#xff0c;智慧政务作为政府数字化转型的重要方向&#xff0c;正逐步改变着政府管理和服务的方式。为了确保智慧政务系统的建设能够有序、高效地进行&#xff0c;国家制定了一系列标准规范&#xff0c;其中GB∕T 21062系列标准《政务信息资源交换体…

手机照片太多了存哪里?

手机相册里塞满了旅行照片、生活碎片&#xff0c;每次清理都舍不得删&#xff1f;NAS——一款超实用的存储方案&#xff0c;让你的回忆安全又有序&#xff5e; 1️⃣自动备份解放双手 手机 / 电脑 / 相机照片全自动同步到 NAS&#xff0c;再也不用手动传文件 2️⃣远程访问像…

OpenRouter使用指南

OpenRouter 是一个专注于大模型&#xff08;LLM&#xff09;API 聚合和路由的服务平台&#xff0c;旨在帮助开发者便捷地访问多种主流大语言模型&#xff08;如 GPT-4、Claude、Llama 等&#xff09;&#xff0c;并提供统一的接口、成本优化和智能路由功能。以下是它的核心功能…

【优选算法 | 队列 BFS】构建搜索流程的核心思维

算法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;双指针滑动窗口二分查找前缀和位运算模拟链表哈希表字符串模拟栈模拟(非单调栈)优先级队列 很多人学 BFS 的时候都知道“用队列”&#xff0c;但为什么一定是队列&#xff1f;它到底在整个搜索流程中起了什么作…

设计模式(行为型)-中介者模式

目录 定义 类图结构展示 角色职责详解 模式的优缺点分析 优点 缺点 适用场景 应用实例 与其他模式的结合与拓展 总结 定义 中介者模式的核心思想可以概括为&#xff1a;用一个中介对象来封装一系列的对象交互。这个中介者就像一个通信枢纽&#xff0c;使各对象不需要…

【Java学习笔记】异常

异常&#xff08;Exception&#xff09; 一、基本介绍 在 Java 程序中&#xff0c;将运行中发生的不正常情况称为 “异常”&#xff0c;开发过程中的语法错误和运行时发生的异常情况是不一样的。 二、异常的分类 1. Error&#xff08;错误&#xff09;&#xff1a;Java 虚拟…

MySQL:视图+用户管理+访问+连接池原理

一、视图 视图是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff08;相当于是把查询的内容当成一个临时表来使用&#xff09;&#xff0c;视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表&#xff0c;基表的数据变化也会影响到视图。 1.1 为…

neo4j 5.19.0安装、apoc csv导入导出 及相关问题处理

前言 突然有需求需要用apoc 导入 低版本的图谱数据&#xff0c;网上资料又比较少&#xff0c;所以就看官网资料并处理了apoc 导入的一些问题。 相关地址 apoc 官方安装网址 apoc 官方导出csv 教程地址 apoc 官方 导入 csv 地址 docker 安装 执行如下命令启动镜像 doc…

无人机桥梁3D建模的拍摄频率

无人机桥梁3D建模的拍摄频率 无人机桥梁3D建模的拍摄频率&#xff08;每秒拍摄照片数&#xff09;需根据建模精度、飞行速度、相机性能等因素综合确定。以下是专业级作业的详细参数分析&#xff1a; 1. 核心计算公式 拍摄频率&#xff08;fps&#xff09; \frac{飞行速度&…

ESP32-idf学习(三)esp32C3连接iot

一、前言 上一篇用蓝牙作为通信方式&#xff0c;虽然勉强完成了控制&#xff0c;但结果显然不是那么符合我们的预期&#xff0c;既然用蓝牙还需要研究一段时间&#xff0c;那我们就先整一些现成的&#xff0c;不需要研究的&#xff01;iot云平台&#xff01;这里当然也是通过w…

详解鸿蒙仓颉开发语言中的计时器

今天又到了大家喜闻乐见的科普环节&#xff0c;也可以说是踩坑环节&#xff0c;哈哈哈。今天聊一聊仓颉开发语言中的计时器&#xff0c;这部分可老有意思了。 为什么这么说呢&#xff0c;因为关于仓颉的计时器你几乎搜不到任何的文档&#xff0c;也没有相关的代码提示&#xf…

【计算机网络】第3章:传输层—拥塞控制原理

目录 一、PPT 二、总结 &#xff08;一&#xff09;拥塞的定义 &#xff08;二&#xff09;拥塞产生的原因 &#xff08;三&#xff09;拥塞控制的目标 &#xff08;四&#xff09;拥塞控制方法分类 1. 端到端拥塞控制 2. 网络辅助拥塞控制 &#xff08;五&#xff09;…

Vue3(watch,watchEffect,标签中ref的使用,TS,props,生命周期)

Vue3&#xff08;watch&#xff0c;watchEffect&#xff0c;标签中ref的使用,TS,props,生命周期&#xff09; watch监视 情况三&#xff1a;监视reactive定义的对象类型的数据 监视reactive定义的对象类型的数据&#xff0c;默认开启深度监视。地址没变&#xff0c;新值和旧…

【nssctf第三题】[NSSCTF 2022 Spring Recruit]easy C

这是题目&#xff0c;下载附件打开是个C文件 #include <stdio.h> #include <string.h>int main(){char a[]"wwwwwww";char b[]"dvxbQd";//try to find out the flagprintf("please input flag:");scanf(" %s",&a);if…

DBeaver导入/导出数据库时报错解决方案

导出&#xff1a; 报错&#xff1a;mysqldump: Got error: 2026: SSL connection error: error:0A000102:SSL routines::unsupported protocol when trying to connect 在额外的命令参数中添加"--ssl-modeDISABLED"可以关闭SSL服务&#xff0c;从而成功解决问题。这…

uniapp与微信小程序开发平台联调无法打开IDE

经测试属于网络问题。本机需要联网。否则会出现Hbuilder运行微信小程序到模拟器时无法打开 微信开发者工具 这个页面出不来会一直显示异常。这期间微信小程序开发工具的端口是通的 需要先联网

第十二节:第五部分:集合框架:Set集合的特点、底层原理、哈希表、去重复原理

Set系列集合特点 哈希值 HashSet集合的底层原理 HashSet集合去重复 代码 代码一&#xff1a;整体了解一下Set系列集合的特点 package com.itheima.day20_Collection_set;import java.util.HashSet; import java.util.LinkedHashSet; import java.util.Set; import java.util.…

【C++项目】:仿 muduo 库 One-Thread-One-Loop 式并发服务器

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;C从入门到精通 目录 &#x1f525; 前言 一&#xff1a;&#x1f525; 项目储备知识 &#x1f98b; HTTP 服务器&#x1f98b; Reactor 模型&#x1f380; 单 Reactor 单线程&#xff1a;单I/O多路…