Elasticsearch 实战应用
Elasticsearch 实战应用
引言
Elasticsearch 是一个分布式、RESTful 风格的搜索和分析引擎,能够快速、实时地处理大规模数据,广泛应用于全文搜索、日志分析、推荐系统等领域。在这篇博客中,我们将从 Elasticsearch 的基本概念入手,结合具体的实战案例,讲解如何在项目中高效使用 Elasticsearch,帮助你掌握其核心功能和应用场景。
1. Elasticsearch 基本概念
1.1 索引 (Index)
索引是 Elasticsearch 中最重要的概念,它相当于关系型数据库中的表。每个索引都有自己的名称,并包含一组文档和字段。通过创建索引,Elasticsearch 能够存储、查询和分析数据。
1.2 文档 (Document)
文档是 Elasticsearch 中的基本数据单位,类似于关系型数据库中的一行记录。每个文档用 JSON 格式表示,并属于一个特定的索引。
1.3 类型 (Type)
在 Elasticsearch 7.0 版本之后,类型的概念被逐步废弃。现在每个索引只能有一种类型,数据结构通过字段的定义来实现区分。
1.4 映射 (Mapping)
映射定义了文档中的字段及其数据类型,类似于数据库中的表结构定义。通过映射,Elasticsearch 能够有效地存储和索引数据。
2. Elasticsearch 实战案例
接下来,我们通过具体的代码示例,讲解如何在实际项目中使用 Elasticsearch 进行数据的存储、查询、分析等操作。
2.1 安装与配置
首先,我们需要安装 Elasticsearch。在本地环境中,可以通过以下步骤安装:
-
下载 Elasticsearch 安装包:
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.0-linux-x86_64.tar.gz
-
解压并进入目录:
tar -xzf elasticsearch-7.17.0-linux-x86_64.tar.gz cd elasticsearch-7.17.0
-
启动 Elasticsearch:
./bin/elasticsearch
-
检查 Elasticsearch 服务是否启动:
通过浏览器访问http://localhost:9200
,你应该能看到类似以下的响应:{"name" : "node-1","cluster_name" : "elasticsearch","cluster_uuid" : "Zt3PliLvRJOPuo4uE8wDhQ","version" : {"number" : "7.17.0","build_flavor" : "default","build_type" : "tar","build_hash" : "aaa","build_date" : "2022-01-19T22:48:51.501073096Z","build_snapshot" : false,"lucene_version" : "8.11.1","minimum_wire_compatibility_version" : "6.8.0","minimum_index_compatibility_version" : "6.0.0-beta1"},"tagline" : "You Know, for Search" }
2.2 创建索引
创建一个存储博客数据的索引,假设每个文档包含 title
、author
和 content
三个字段:
PUT /blogs
{"mappings": {"properties": {"title": {"type": "text"},"author": {"type": "keyword"},"content": {"type": "text"}}}
}
2.3 插入文档
向 blogs
索引中插入几篇博客文档:
POST /blogs/_doc/1
{"title": "Elasticsearch 实战应用","author": "张三","content": "Elasticsearch 是一个分布式搜索引擎。"
}POST /blogs/_doc/2
{"title": "深入理解 Elasticsearch","author": "李四","content": "本书深入讲解了 Elasticsearch 的内部工作机制。"
}
2.4 查询文档
通过 RESTful API 查询文档。假设我们想查找所有包含关键词 “Elasticsearch” 的博客:
GET /blogs/_search
{"query": {"match": {"content": "Elasticsearch"}}
}
这个查询会返回所有 content
字段中包含 “Elasticsearch” 的文档,并按相关性得分排序。
2.5 聚合操作
Elasticsearch 还支持对数据进行聚合分析。假设我们想统计每位作者的博客数量,可以使用以下查询:
GET /blogs/_search
{"size": 0,"aggs": {"author_count": {"terms": {"field": "author"}}}
}
响应结果中会返回每个作者及其对应的博客数量。
2.6 更新文档
我们可以通过 _update
API 对文档进行部分更新。例如,我们需要更新文档 1 的 title
:
POST /blogs/_doc/1/_update
{"doc": {"title": "Elasticsearch 实战应用(更新版)"}
}
2.7 删除文档
如果我们不再需要某篇博客文档,可以通过 _delete
API 将其删除。例如,删除文档 2:
DELETE /blogs/_doc/2
3. 实战场景
3.1 日志分析
Elasticsearch 在日志分析场景中非常常见。我们可以通过 Filebeat 收集系统日志,将其传输到 Elasticsearch 中存储,最后通过 Kibana 进行可视化分析。
3.1.1 Filebeat 配置
假设我们需要将 /var/log/syslog
日志收集到 Elasticsearch,可以使用以下 Filebeat 配置:
filebeat.inputs:
- type: logpaths:- /var/log/syslogoutput.elasticsearch:hosts: ["localhost:9200"]index: "syslog-%{+yyyy.MM.dd}"
启动 Filebeat 后,系统日志会自动被发送到 Elasticsearch 中,并按日期创建索引。
3.1.2 Kibana 可视化
通过 Kibana,我们可以创建各种可视化图表,例如折线图、饼图等,直观地展示日志数据的分布、错误数量、访问情况等信息。
3.2 全文搜索
在电商平台中,商品搜索是一个典型的 Elasticsearch 使用场景。用户输入关键词后,Elasticsearch 会根据商品名称、描述等字段返回匹配的商品,并按相关性排序。通过结合搜索高亮、分词优化等技术,可以极大提升用户的搜索体验。
4. 性能优化
4.1 分片与副本设置
Elasticsearch 中,索引可以划分为多个分片,每个分片存储部分数据。为了提高查询性能,建议合理配置分片和副本数,避免单个节点成为瓶颈。
4.2 缓存机制
Elasticsearch 内置了多种缓存机制,如查询缓存、字段缓存等。通过合理配置缓存,可以有效提升查询速度。
4.3 集群配置
在大规模数据场景下,Elasticsearch 集群的节点配置尤为重要。建议为主节点、数据节点、协调节点等角色分配合适的硬件资源,保证集群的高效运行。
5. 性能维护
Elasticsearch 是一个强大、灵活的搜索和分析引擎,适用于多种场景,如全文搜索、日志分析、推荐系统等。通过本文的实战示例,你可以掌握 Elasticsearch 的基础操作和应用场景。在实际项目中,结合集群配置、性能优化等技巧,能够充分发挥 Elasticsearch 的潜力。
5.1 日常维护和管理
在实际应用中,Elasticsearch 的运行状态与数据一致性非常重要。因此,了解日常的维护操作以及如何监控集群健康至关重要。下面介绍一些常见的维护任务。
5.1.1 集群健康监控
Elasticsearch 提供了一个简单的 API 来检查集群的健康状态:
GET /_cluster/health
响应结果将显示集群的健康状态,分为 green
(正常)、yellow
(部分副本未分配)、red
(索引不可用)。如果集群状态为 yellow
或 red
,需要立即排查问题,以防数据丢失或查询失败。
5.1.2 索引优化
随着数据的增加,索引的存储和查询性能可能会下降。可以通过以下几种方法优化索引性能:
-
合并段(Merge Segments): Elasticsearch 将数据分成多个段存储,定期进行段合并可以减少小文件的数量,从而提高查询速度。合并段的操作可以通过手动触发:
POST /my-index/_forcemerge?max_num_segments=1
-
关闭未使用的索引: 如果某些索引只用于存档,可以将它们关闭,以节省资源。关闭索引后,它将不可写入或查询,只有重新打开后才可以操作:
POST /my-index/_close
5.1.3 索引迁移与备份
为了确保数据的安全性,定期备份是必须的。Elasticsearch 支持快照与恢复机制,将索引备份到外部存储系统中(如 AWS S3)。以下是如何创建一个快照仓库和备份数据的步骤:
-
创建快照仓库:
PUT /_snapshot/my_backup {"type": "fs","settings": {"location": "/mount/backups"} }
-
创建快照:
PUT /_snapshot/my_backup/snapshot_1?wait_for_completion=true
-
恢复快照:
POST /_snapshot/my_backup/snapshot_1/_restore
5.1.4 删除旧数据
对于某些应用场景(如日志分析),可能只需要保留最近一段时间的数据。通过设置索引生命周期管理(ILM),可以自动删除或归档旧数据:
PUT /_ilm/policy/delete-after-30-days
{"policy": {"phases": {"delete": {"min_age": "30d","actions": {"delete": {}}}}}
}
将此策略应用到特定索引:
PUT /my-index/_settings
{"index.lifecycle.name": "delete-after-30-days"
}
5.2 实际问题的解决方案
5.2.1 处理大数据量查询时的性能问题
当数据量巨大时,单次查询的大量数据会造成内存开销过高。可以通过以下方式解决该问题:
-
分页查询: 对于需要获取大量数据的查询,使用分页(
from
和size
)控制每次返回的数据量:GET /my-index/_search {"from": 0,"size": 100,"query": {"match_all": {}} }
-
Scroll API: 当数据量太大且无法通过分页完成时,可以使用
Scroll API
执行大规模的查询,Elasticsearch 将保持游标以便多次查询结果:GET /my-index/_search?scroll=1m {"size": 1000,"query": {"match_all": {}} }
5.2.2 处理索引中字段类型不匹配
有时候,由于数据不一致或缺乏严格的映射定义,Elasticsearch 可能会遇到字段类型不匹配的问题。例如,同一字段在不同文档中被解析为不同类型(如文本和数字),这会导致查询错误。
-
明确字段类型: 最好在索引创建时提前定义好每个字段的类型,以避免自动推断带来的问题:
PUT /my-index {"mappings": {"properties": {"age": { "type": "integer" }}} }
-
动态映射: 如果索引已经存在并出现了类型冲突,可以通过动态映射来指定如何处理新字段的类型:
PUT /my-index/_mapping {"dynamic": "strict","properties": {"new_field": {"type": "text"}} }
5.3 Elasticsearch 的安全性
5.3.1 用户和角色管理
Elasticsearch 支持基于角色的访问控制(RBAC)。通过 Kibana 或者 API,可以创建用户并为其分配不同的权限。
例如,创建一个仅能读写某个索引的用户:
-
创建角色:
POST /_security/role/blog_writer {"indices": [{"names": [ "blogs" ],"privileges": [ "read", "write" ]}] }
-
创建用户并关联角色:
POST /_security/user/johndoe {"password": "password123","roles": [ "blog_writer" ] }
5.3.2 数据加密
Elasticsearch 提供了传输和存储加密的选项。可以启用 TLS 加密来确保数据在集群节点之间的传输安全。具体配置方法可以参考官方文档中的加密传输指南。
6. 总结
通过本文,你已经了解了 Elasticsearch 的基本概念、核心操作以及实际应用场景中的常见问题和解决方案。Elasticsearch 的强大之处不仅体现在它的搜索能力,还包括它在大数据分析、日志处理和实时搜索场景中的应用。随着数据量的爆炸性增长,掌握 Elasticsearch 将为你在数据处理和搜索领域提供重要的优势。
继续之前的内容,进一步详细讲解 Elasticsearch 的高级功能和最佳实践。
7. Elasticsearch 高级功能
Elasticsearch 不仅具备基本的搜索和分析功能,还提供了许多高级特性,帮助开发者更好地满足复杂的业务需求。
7.1 多语言全文检索
在全球化的应用场景中,处理多语言文本是一个常见的挑战。Elasticsearch 提供了丰富的分析器(Analyzer),支持对不同语言进行分词和索引。
例如,要创建支持中文分词的索引,可以使用 ik_max_word
分词器(需要安装 IK 分词器插件):
PUT /my_chinese_index
{"settings": {"analysis": {"analyzer": {"ik_analyzer": {"type": "custom","tokenizer": "ik_max_word"}}}},"mappings": {"properties": {"content": {"type": "text","analyzer": "ik_analyzer"}}}
}
插入一条中文文档:
POST /my_chinese_index/_doc
{"content": "Elasticsearch 是一个强大的搜索引擎"
}
进行搜索:
GET /my_chinese_index/_search
{"query": {"match": {"content": "搜索引擎"}}
}
7.2 搜索建议(Autocomplete)
为了提升用户体验,许多应用都会在用户输入时提供实时的搜索建议。Elasticsearch 的 Completion Suggesters 可以高效地实现这一功能。
创建索引并设置 completion
字段类型:
PUT /music
{"mappings": {"properties": {"song": {"type": "text"},"suggest": {"type": "completion"}}}
}
插入文档:
POST /music/_doc
{"song": "Shape of You","suggest": {"input": ["Shape of You", "Ed Sheeran"]}
}
执行搜索建议查询:
POST /music/_search
{"suggest": {"song-suggest": {"prefix": "Sh","completion": {"field": "suggest"}}}
}
7.3 地理位置查询
对于需要处理地理位置信息的应用,Elasticsearch 提供了 geo_point
和 geo_shape
类型,支持地理位置的存储和查询。
创建包含地理位置的索引:
PUT /places
{"mappings": {"properties": {"name": { "type": "text" },"location": { "type": "geo_point" }}}
}
插入文档:
POST /places/_doc
{"name": "Eiffel Tower","location": {"lat": 48.8584,"lon": 2.2945}
}
执行地理位置查询,查找在特定范围内的地点:
GET /places/_search
{"query": {"geo_distance": {"distance": "5km","location": {"lat": 48.8566,"lon": 2.3522}}}
}
7.4 跨集群搜索(Cross-Cluster Search)
在大型系统中,数据可能分布在多个 Elasticsearch 集群中。通过跨集群搜索功能,可以在一个集群上查询其他集群的数据。
配置远程集群连接:
PUT /_cluster/settings
{"persistent": {"search.remote.remote_cluster.seeds": ["remote_host:9300"]}
}
在查询时,使用远程集群的别名:
GET /remote_cluster:blogs/_search
{"query": {"match_all": {}}
}
8. 实战经验分享
8.1 索引模板的使用
在处理大量相似结构的索引(如按日期创建的日志索引)时,可以使用索引模板(Index Templates)来自动应用设置和映射。
创建索引模板:
PUT /_template/logs_template
{"index_patterns": ["logs-*"],"settings": {"number_of_shards": 1},"mappings": {"properties": {"timestamp": { "type": "date" },"level": { "type": "keyword" },"message": { "type": "text" }}}
}
当创建名称匹配 logs-*
的索引时,将自动应用此模板。
8.2 合理使用别名(Alias)
别名可以为一个或多个索引创建一个替代名称,方便应用程序的索引管理和切换。
创建别名:
POST /_aliases
{"actions": [{"add": {"index": "logs-2023-10","alias": "current-logs"}}]
}
当需要切换到新的索引时,只需更新别名指向:
POST /_aliases
{"actions": [{ "remove": { "index": "logs-2023-10", "alias": "current-logs" }},{ "add": { "index": "logs-2023-11", "alias": "current-logs" }}]
}
8.3 避免深度分页
Elasticsearch 对深度分页的性能不佳,因为需要跳过大量文档。可以使用 search_after
或者 Scroll
API 来处理大量数据的分页。
使用 search_after
:
GET /my-index/_search
{"size": 10,"query": { "match_all": {} },"sort": [ { "timestamp": "asc" }, { "_id": "asc" } ],"search_after": [ 1609459200000, "some_id" ]
}
9. 学习资源
为了更深入地了解 Elasticsearch,以下是一些推荐的学习资源:
-
官方文档:Elasticsearch 官方文档详尽且更新及时,是最权威的参考资料。Elasticsearch Documentation
-
Elasticsearch 权威指南:一本免费电子书,涵盖了 Elasticsearch 的核心概念和实践。Elasticsearch: The Definitive Guide
-
社区论坛:参与 Elasticsearch 的社区讨论,可以获取实践经验和解决方案。Elastic Discuss
10. 结语
Elasticsearch 作为一个强大的搜索和分析引擎,凭借其分布式、高可用和高扩展性的特性,已经成为众多企业的首选解决方案。通过本文的详细讲解和实战案例,相信你已经对 Elasticsearch 的应用有了深入的了解。
在未来的项目中,建议你:
-
持续学习:Elasticsearch 的生态系统不断发展,保持对新特性的关注。
-
动手实践:通过实际项目或练习,巩固所学知识。
-
优化性能:根据具体业务需求,合理配置集群和索引,提升系统性能。
希望这篇博客能够对你的 Elasticsearch 之旅有所帮助,祝你在技术的道路上不断进步!
相关文章:

Elasticsearch 实战应用
Elasticsearch 实战应用 引言 Elasticsearch 是一个分布式、RESTful 风格的搜索和分析引擎,能够快速、实时地处理大规模数据,广泛应用于全文搜索、日志分析、推荐系统等领域。在这篇博客中,我们将从 Elasticsearch 的基本概念入手ÿ…...

前端数据加载慢的解决方法
都是和前端性能优化非常类似的做法。 1. 懒加载 (Lazy Loading) 对于图片、视频等资源,或者某些组件,在用户滚动到相关区域时再加载,而不是页面一开始就加载所有内容。使用 IntersectionObserver 实现懒加载,或者一些 UI 框架&am…...

探索MultiApp:一款强大的多应用管理工具
探索MultiApp:一款强大的多应用管理工具 在这个数字化时代,多任务并行已经成为我们日常生活的一部分。无论是工作还是娱乐,我们都需要频繁地在多个应用之间切换。今天,我要向大家介绍一款能够帮助你在同一设备上无缝切换和管理多…...

qt QGraphicsItem详解
一、概述 QGraphicsItem是Qt框架中图形视图框架(Graphics View Framework)的一个核心组件,它是用于表示2D图形元素的基类。 它支持的功能包括: 设置和获取图形项的位置和尺寸。控制图形项的外观,如颜色、笔刷、边框…...

LVS搭建负载均衡
LVS搭建负载均衡 引言 在现代互联网应用中,用户对服务的可用性和响应速度要求越来越高。为了应对高并发请求,保证系统的稳定性和容错能力,负载均衡技术应运而生。LVS(Linux Virtual Server)是一种高性能、高可用性的…...

Unity MVC框架演示 1-1 理论分析
本文仅作学习笔记分享与交流,不做任何商业用途,该课程资源来源于唐老狮 1.一般的图解MVC 什么是MVC我就不说了,老生常谈,网上有大量的介绍,想看看这三层都起到什么职责?那就直接上图吧 2.我举一个栗子 我有…...

基于springboot+vue人脸识别的考勤管理系统(源码+定制+开发)
博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...

【api连接ChatGPT的最简单方式】
通过api连接ChatGPT的最简单方式 建立client 其中base_url为代理,若连接官网可省略;配置环境变量 from openai import OpenAI client OpenAI(base_url"https://api.chatanywhere.tech/v1" )或给出api和base_url client OpenAI(api_key&…...

技术成神之路:设计模式(二十)装饰模式
介绍 装饰模式(Decorator Pattern)是一种结构型设计模式,它允许在不改变对象自身的情况下,动态地为对象添加额外的职责。这个模式通常用于增强或改变对象的功能。 1.定义 装饰模式通过创建一个装饰类,将功能动态地添加…...

利用特征点采样一致性改进icp算法点云配准方法
1、index、vector 2、kdtree和kdtreeflann 3、if kdtree.radiusSearch(。。。) > 0)...

LabVIEW惯性导航系统仿真平台
LabVIEW开发捷联惯性导航系统仿真平台,采用模块化设计,利用LabVIEW的图形化编程特性,提高了系统仿真的效率和精度,同时具备良好的可扩展性和用户交互性。 项目背景 当前,惯性导航系统(INS)的研…...

es简单实现文章检索功能
使用的api是:Elasticsearch Java API client 8.0 官网:Package structure and namespace clients | Elasticsearch Java API Client [8.15] | Elastic 1.建立索引库 实现搜索功能字段: title:文章标题content:文章内…...

太速科技-607-基于FMC的12收和12发的光纤子卡
基于FMC的12收和12发的光纤子卡 一、板卡概述 本卡是一个FPGA夹层卡(FMC)模块,可提供高达2个CXP模块接口,提供12路收,12路发的光纤通道。每个通道支持10Gbps,通过Aurora协议,可以组成X4࿰…...

UEFI学习笔记(十):系统表与ACPI表的遍历
一、概述 在 UEFI 系统表中,有几个关键的表用于提供系统信息、服务和硬件抽象。这些表可以通过 EFI_SYSTEM_TABLE 访问,常见的 UEFI 系统表如下: 1、EFI_SYSTEM_TABLE (系统表) EFI_SYSTEM_TABLE 是一个指针,包含多个服务和系统…...

【深度学习基础模型】液态状态机(Liquid State Machines, LSM)详细理解并附实现代码。
【深度学习基础模型】液态状态机(Liquid State Machines, LSM)详细理解并附实现代码。 【深度学习基础模型】液态状态机(Liquid State Machines, LSM)详细理解并附实现代码。 文章目录 【深度学习基础模型】液态状态机࿰…...

深入理解链表(SList)操作
目录: 一、 链表介绍1.1、 为什么引入链表1.2、 链表的概念及结构1.3、 链表的分类 二、 无头单向非[循环链表](https://so.csdn.net/so/search?q循环链表&spm1001.2101.3001.7020)的实现2.1、 [单链表](https://so.csdn.net/so/search?q单链表&spm1001.2…...

03. prometheus 监控 Linux 主机
文章目录 一、prometheus 监控 Linux 主机二、防火墙打开端口1. 方式一:使用 iptables 添加白名单(推荐使用):2. 方式二:重载防火墙 一、prometheus 监控 Linux 主机 1. 官网下载 node_exporter 官网:htt…...

AI占据2024诺贝尔两大奖项,是否预示着未来AI即一切?
本次诺贝尔物理学和学奖的获得者都与AI息息相关,可谓是“AI领域的大丰收”。 2024年诺贝尔物理学奖揭晓:瑞典皇家科学院公布了2024年诺贝尔物理学奖的获得者。他们是美国的约翰霍普菲尔德(John J. Hopfield),以及加拿…...

[已解决] Install PyTorch 报错 —— OpenOccupancy 配环境
目录 关于 常见的初始化报错 环境推荐 torch, torchvision & torchaudio cudatoolkit 本地pip安装方法 关于 OpenOccupancy: 语义占用感知对于自动驾驶至关重要,因为自动驾驶汽车需要对3D城市结构进行细粒度感知。然而,现有的相关基准在城市场…...

6. PH47 代码框架硬件开发环境搭建
概述 PH47代码框架的硬件开发环境搭建同样简单, 建立基本的 PH47 框架学习或二次开发的硬件开发环境所需设备如下: BBP 飞控板及相关软硬件: BBP飞控板,或者至少一块Stm32F411核心板(WeAct Studio)Stm32程序烧录工具…...

package.json配置
package.json配置 描述配置文件配置脚本配置依赖配置发布配置系统配置第三方配置 描述配置 name : 项目名称,第三方包可以通过npm install 包名安装 "name":"react"version : 项目版本,项目版本号 "version" : "18.2…...

视频怎么转gif动图?5个简单转换方法快来学(详细教程)
相信大家在社交平台上会经常看到一些有趣的gif动图表情包,有些小伙伴就会问:这些GIF动图是如何制作的呢?一般GIF动图表情包可以用视频来制作,今天小编就来给大家分享几个视频转成GIF动图的方法,相信通过以下的几个方法…...

10月更新:优维EasyOps®需求解决更彻底,功能体验再升级
升 级 不 止 步 欢迎来到 需求至上,功能完善 的 \ EasyOps 7.5版本 / 👇 >> 联动架构视图:深度融合监控与资源拓扑 传统上,依赖监控态势感知系统固有的分层拓扑结构虽有其优势,但在处理复杂系统尤其是核心数…...

黑马javaWeb笔记重点备份1:三层架构、IOC、DI
来自:【黑马程序员JavaWeb开发教程,实现javaweb企业开发全流程(涵盖SpringMyBatisSpringMVCSpringBoot等)】 https://www.bilibili.com/video/BV1m84y1w7Tb/?p75&share_sourcecopy_web&vd_source9332b8fc5ea8d349a54c398…...

大坝渗流监测设备——渗压计
渗压计是一种用于监测大坝等水工建筑物渗流压力的重要设备,其准确性和可靠性对于保障大坝安全运行至关重要。南京峟思将为大家详细介绍渗压计的工作原理、安装方法及其在大坝渗流监测中的应用。 渗压计主要利用振弦频率的变化来测量渗透水压力。设备由透水部件、感应…...

Pikachu-Sql Inject-宽字节注入
基本概念 宽字节是相对于ascII这样单字节而言的;像 GB2312、GBK、GB18030、BIG5、Shift_JIS 等这些都是常说的宽字节,实际上只有两字节 GBK 是一种多字符的编码,通常来说,一个 gbk 编码汉字,占用2个字节。一个…...

如何制作低代码开发的视频教程?
如何制作低代码开发的视频教程? 随着数字化转型的加速,越来越多的企业和组织开始采用低代码开发平台来加速应用程序的构建。对于许多开发者和业务人员来说,学习如何使用这些平台可以显著提高工作效率。因此,创建一份清晰、实用且…...

Flink学习地址
--基础概念 概览 | Apache Flink --应用系列 如何学习Flink:糙快猛的大数据之路(图文并茂)_flink 学习-CSDN博客 --Python系列 pyflink实时接收kafka数据至hive_pyflink下kafka数据经过处理后插入hive-CSDN博客 Pyflink教程(一)&#…...

05_23 种设计模式之《建造者模式》
文章目录 一、建造者模式基础知识建造者模式的结构建造者模式的应用场景 一、建造者模式基础知识 建造者模式(Builder Pattern)是一种创建型设计模式,它提供了一种优雅的方式来创建复杂对象,同时隐藏其构建过程。这种模式允许你通…...

详细分析Spring Security OAuth2中的JwtAccessTokenConverter基本知识(附Demo)
目录 前言1. 基本知识2. Demo3. 实战 前言 java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)【Java项目】实战CRUD的功能整理(持续更新) 1. 基本知识 JwtAccessTokenConverter 是 Spring Security OAuth2 中的一…...