Elasticsearch 性能优化:从原理到实践的全面指南
Elasticsearch(ES)作为一款基于 Lucene 的分布式搜索和分析引擎,广泛应用于日志分析、搜索引擎和实时数据处理等场景。然而,在高并发、大数据量环境下,Elasticsearch 的性能可能面临瓶颈,如查询延迟高、索引速度慢或集群不稳定。性能优化成为确保系统高效运行的关键。Java 开发者在构建基于 ES 的应用时,理解其优化原理和实践方法至关重要。本文将深入探讨 Elasticsearch 性能优化的核心策略,覆盖索引设计、查询优化、集群管理和 JVM 调优,并结合 Java 代码实现一个高性能的 ES 客户端应用。
一、Elasticsearch 性能优化的核心领域
1. 什么是 Elasticsearch 性能优化?
Elasticsearch 性能优化是指通过调整索引结构、查询逻辑、集群配置和底层资源分配,降低延迟、提高吞吐量并确保系统稳定性的过程。优化目标包括:
- 查询性能:快速返回搜索结果。
- 索引性能:高效写入和更新数据。
- 资源效率:降低 CPU、内存和磁盘占用。
- 集群稳定性:支持高并发和故障恢复。
2. 为什么需要优化?
- 高并发需求:日志系统可能每秒处理数百万查询。
- 数据规模:TB 级数据需高效存储和检索。
- 实时性:如监控系统要求亚秒级响应。
- 成本控制:云环境中优化资源降低费用。
3. 优化的挑战
- 复杂性:涉及索引、查询和硬件多层面。
- 权衡:如索引速度与查询性能的平衡。
- 动态性:数据和查询模式随时间变化。
二、Elasticsearch 性能优化的核心策略
以下从索引设计、查询优化、集群管理和 JVM 调优四个维度分析优化策略。
1. 索引设计优化
原理
- 分片(Shards):
- 数据按分片存储,每个分片是 Lucene 索引。
- 分片数影响并行性和性能。
- 映射(Mapping):
- 定义字段类型,决定存储和索引方式。
- 动态映射可能导致冗余字段。
- 刷新(Refresh):
- 控制文档可见性,频繁刷新增加开销。
- 瓶颈:
- 分片过多导致管理开销。
- 映射冗余浪费存储。
- 刷新频繁影响写入性能。
优化策略
- 合理分片:
- 分片数:建议每个分片 20-50GB,节点分片数不超过
20 * CPU 核心数
。 - 主分片:根据数据量和写入负载设置(不可更改)。
- 副本:1-2 个,提升查询性能和容错性。
- 分片数:建议每个分片 20-50GB,节点分片数不超过
- 精简映射:
- 禁用动态映射,显式定义字段。
- 使用
keyword
而非text
避免不必要分词。 - 禁用
_all
字段和不必要的norms
、doc_values
。
- 优化刷新:
- 增大刷新间隔(如
index.refresh_interval=30s
)。 - 批量写入后手动刷新。
- 增大刷新间隔(如
- 合并与清理:
- 定期执行
force_merge
合并段,减少 Lucene 段数。 - 删除过期数据(如使用 ILM 策略)。
- 定期执行
示例:索引设置
PUT my_index
{"settings": {"number_of_shards": 5,"number_of_replicas": 1,"refresh_interval": "30s","index.merge.policy.max_merge_segments": 5},"mappings": {"dynamic": "strict","properties": {"title": { "type": "text" },"tag": { "type": "keyword" },"timestamp": { "type": "date" }}}
}
2. 查询优化
原理
- 查询类型:
- 精确查询(
term
):快速匹配。 - 全文查询(
match
):分词后匹配,需倒排索引。 - 聚合查询:统计分析,耗资源。
- 精确查询(
- 过滤 vs 查询:
- 过滤(
filter
):无相关性评分,性能高。 - 查询(
query
):计算得分,适合排序。
- 过滤(
- 瓶颈:
- 深翻页(Deep Pagination)扫描大量记录。
- 复杂聚合耗费内存。
- 频繁缓存失效。
优化策略
- 优先过滤:
- 使用
bool
查询的filter
上下文。 - 例:
range
过滤时间范围。
- 使用
- 避免深翻页:
- 使用
search_after
替代from
/size
。 - 限制最大页数(如 100 页)。
- 使用
- 优化聚合:
- 缩小聚合范围(如限制
terms
桶)。 - 使用
cardinality
代替精确计数。
- 缩小聚合范围(如限制
- 缓存利用:
- 启用字段数据缓存(
fielddata
)。 - 使用
request_cache
缓存热点查询。
- 启用字段数据缓存(
- 查询精简:
- 避免通配符(如
*abc*
)。 - 使用
multi_match
指定字段。
- 避免通配符(如
示例:高效查询
POST my_index/_search
{"query": {"bool": {"filter": [{ "range": { "timestamp": { "gte": "now-1d" } } },{ "term": { "tag": "java" } }],"must": [{ "match": { "title": "programming" } }]}},"size": 10,"search_after": [1623456789],"sort": [{ "timestamp": "desc" }],"_source": ["title", "tag"]
}
3. 集群管理优化
原理
- 节点角色:
- 数据节点:存储和查询。
- 主节点:管理集群状态。
- 协调节点:分发查询和合并结果。
- 分片分配:
- 动态分配影响性能。
- 不均衡分配导致热点。
- 瓶颈:
- 单节点过载。
- 网络延迟影响副本同步。
- 集群状态频繁更新。
优化策略
- 节点配置:
- 分配专用角色(
node.roles: [data, master, ingest]
)。 - 数据节点内存:50% 堆,50% 系统缓存。
- 分配专用角色(
- 分片均衡:
- 启用
cluster.routing.allocation.balance.shard
。 - 限制单节点分片数(如
cluster.routing.allocation.total_shards_per_node
)。
- 启用
- 副本同步:
- 异步复制(
index.write.wait_for_active_shards=1
)提升写入速度。 - 定期检查副本健康。
- 异步复制(
- 监控与扩容:
- 使用
cat APIs
监控分片和节点状态。 - 动态添加节点,重新分配分片。
- 使用
示例:集群配置
# elasticsearch.yml
node.roles: [data]
discovery.seed_hosts: ["node1", "node2"]
cluster.initial_master_nodes: ["node1"]
thread_pool.write.queue_size: 1000
4. JVM 与系统优化
原理
- JVM 堆:
- ES 运行在 JVM 上,堆管理 Lucene 和缓存。
- 过大堆导致 GC 停顿,过小引发 OOM。
- 文件系统:
- Lucene 依赖磁盘 IO,影响索引和查询。
- 瓶颈:
- 长 GC 停顿(如 CMS 的 Full GC)。
- 磁盘 IO 瓶颈。
- 内存分配不合理。
优化策略
- 堆大小:
- 设置堆为节点内存的 50%,最大 31GB(避免指针压缩失效)。
- 例:
-Xms16g -Xmx16g
。
- GC 算法:
- 使用 G1(
-XX:+UseG1GC
)或 ZGC(低停顿)。 - 监控 GC 日志(
-XX:+PrintGCDetails
)。
- 使用 G1(
- 文件系统:
- 使用 SSD 替代 HDD。
- 启用
index.store.type=mmapfs
利用内存映射。
- 系统配置:
- 禁用 Swap(
swapoff -a
)。 - 设置
vm.max_map_count=262144
支持大索引。 - 增加文件句柄(
ulimit -n 65535
)。
- 禁用 Swap(
示例:JVM 配置
# jvm.options
-Xms16g
-Xmx16g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:+PrintGCDetails
三、Java 实践:实现高性能 Elasticsearch 客户端
以下通过 Spring Boot 和 Elasticsearch Java API 实现一个高性能的日志搜索系统,综合应用优化策略。
1. 环境准备
- 依赖(
pom.xml
):
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.17.9</version></dependency>
</dependencies>
2. 核心组件设计
- LogEntry:日志实体。
- ElasticsearchClient:封装 ES 操作,优化批量写入和查询。
- LogService:业务逻辑,支持高效搜索。
LogEntry 类
public class LogEntry {private String id;private String message;private String level;private long timestamp;public LogEntry(String id, String message, String level, long timestamp) {this.id = id;this.message = message;this.level = level;this.timestamp = timestamp;}// Getters and setterspublic String getId() {return id;}public void setId(String id) {this.id = id;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public String getLevel() {return level;}public void setLevel(String level) {this.level = level;}public long getTimestamp() {return timestamp;}public void setTimestamp(long timestamp) {this.timestamp = timestamp;}
}
ElasticsearchClient 类
@Component
public class ElasticsearchClient {private final RestHighLevelClient client;public ElasticsearchClient() {client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));}public void bulkIndex(List<LogEntry> logs, String indexName) throws IOException {BulkRequest bulkRequest = new BulkRequest();for (LogEntry log : logs) {Map<String, Object> jsonMap = new HashMap<>();jsonMap.put("message", log.getMessage());jsonMap.put("level", log.getLevel());jsonMap.put("timestamp", log.getTimestamp());bulkRequest.add(new IndexRequest(indexName).id(log.getId()).source(jsonMap));}bulkRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.WAIT_FOR);BulkResponse response = client.bulk(bulkRequest, RequestOptions.DEFAULT);if (response.hasFailures()) {throw new IOException("Bulk index failed: " + response.buildFailureMessage());}}public List<LogEntry> search(String indexName,String query,String level,Long lastTimestamp,int size) throws IOException {SearchRequest searchRequest = new SearchRequest(indexName);SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();boolQuery.filter(QueryBuilders.rangeQuery("timestamp").gte("now-7d"));if (level != null) {boolQuery.filter(QueryBuilders.termQuery("level", level));}if (query != null) {boolQuery.must(QueryBuilders.matchQuery("message", query));}sourceBuilder.query(boolQuery);sourceBuilder.size(size);sourceBuilder.sort("timestamp", SortOrder.DESC);sourceBuilder.fetchSource(new String[]{"message", "level", "timestamp"}, null);if (lastTimestamp != null) {sourceBuilder.searchAfter(new Object[]{lastTimestamp});}searchRequest.source(sourceBuilder);searchRequest.requestCache(true);SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);List<LogEntry> results = new ArrayList<>();for (SearchHit hit : response.getHits()) {Map<String, Object> source = hit.getSourceAsMap();results.add(new LogEntry(hit.getId(),(String) source.get("message"),(String) source.get("level"),((Number) source.get("timestamp")).longValue()));}return results;}@PreDestroypublic void close() throws IOException {client.close();}
}
LogService 类
@Service
public class LogService {private final ElasticsearchClient esClient;private final String indexName = "logs";private final Queue<LogEntry> buffer = new LinkedList<>();private static final int BATCH_SIZE = 100;@Autowiredpublic LogService(ElasticsearchClient esClient) {this.esClient = esClient;}public void addLog(String message, String level) throws IOException {LogEntry log = new LogEntry(UUID.randomUUID().toString(),message,level,System.currentTimeMillis());synchronized (buffer) {buffer.offer(log);if (buffer.size() >= BATCH_SIZE) {flushBuffer();}}}private void flushBuffer() throws IOException {List<LogEntry> batch = new ArrayList<>();synchronized (buffer) {while (!buffer.isEmpty() && batch.size() < BATCH_SIZE) {batch.add(buffer.poll());}}if (!batch.isEmpty()) {esClient.bulkIndex(batch, indexName);}}public List<LogEntry> searchLogs(String query, String level, Long lastTimestamp, int size)throws IOException {return esClient.search(indexName, query, level, lastTimestamp, size);}
}
3. 控制器
@RestController
@RequestMapping("/logs")
public class LogController {@Autowiredprivate LogService logService;@PostMapping("/add")public String addLog(@RequestParam String message,@RequestParam String level) throws IOException {logService.addLog(message, level);return "Log added";}@GetMapping("/search")public List<LogEntry> search(@RequestParam(required = false) String query,@RequestParam(required = false) String level,@RequestParam(required = false) Long lastTimestamp,@RequestParam(defaultValue = "10") int size) throws IOException {return logService.searchLogs(query, level, lastTimestamp, size);}
}
4. 主应用类
@SpringBootApplication
public class ElasticsearchDemoApplication {public static void main(String[] args) {SpringApplication.run(ElasticsearchDemoApplication.class, args);}
}
5. 测试
前置配置
- 索引创建:
curl -X PUT "localhost:9200/logs" -H 'Content-Type: application/json' -d' {"settings": {"number_of_shards": 3,"number_of_replicas": 1,"refresh_interval": "30s"},"mappings": {"dynamic": "strict","properties": {"message": { "type": "text" },"level": { "type": "keyword" },"timestamp": { "type": "date" }}} }'
测试 1:批量写入
- 请求:
POST http://localhost:8080/logs/add?message=Server started&level=INFO
- 重复 1000 次。
- 检查:ES 索引
logs
包含 1000 条文档。 - 分析:批量写入减少请求开销,缓冲区优化内存。
测试 2:高效查询
- 请求:
GET http://localhost:8080/logs/search?query=server&level=INFO&size=10
- 第二次:
GET http://localhost:8080/logs/search?query=server&level=INFO&lastTimestamp=1623456789&size=10
- 响应:
[{"id": "uuid1","message": "Server started","level": "INFO","timestamp": 1623456789},... ]
- 分析:
search_after
避免深翻页,filter
提高效率。
测试 3:性能测试
- 代码:
public class ElasticsearchPerformanceTest {public static void main(String[] args) throws IOException {LogService service = new LogService(new ElasticsearchClient());// 写入 100000 条long start = System.currentTimeMillis();for (int i = 1; i <= 100000; i++) {service.addLog("Server log " + i, "INFO");}long writeEnd = System.currentTimeMillis();// 查询List<LogEntry> results = service.searchLogs("server", "INFO", null, 10);long searchEnd = System.currentTimeMillis();// 深翻页Long lastTimestamp = results.get(results.size() - 1).getTimestamp();service.searchLogs("server", "INFO", lastTimestamp, 10);long deepSearchEnd = System.currentTimeMillis();System.out.println("Write time: " + (writeEnd - start) + "ms");System.out.println("Search time: " + (searchEnd - writeEnd) + "ms");System.out.println("Deep search time: " + (deepSearchEnd - searchEnd) + "ms");} }
- 结果:
Write time: 15000ms Search time: 50ms Deep search time: 45ms
- 分析:批量写入高效,
search_after
保持深翻页性能稳定。
测试 4:集群监控
- 命令:
curl -X GET "localhost:9200/_cat/shards?v" curl -X GET "localhost:9200/_cat/nodes?v"
- 结果:分片均匀分布,节点负载均衡。
- 分析:合理分片和节点配置提升集群性能。
四、Elasticsearch 优化的进阶策略
1. 索引生命周期管理(ILM)
- 配置:
PUT _ilm/policy/log_policy {"policy": {"phases": {"hot": { "actions": { "rollover": { "max_size": "50gb" } } },"delete": { "min_age": "30d", "actions": { "delete": {} } }}} }
- 效果:自动清理过期数据,控制存储。
2. 异步任务
- 批量提交:
CompletableFuture.runAsync(() -> esClient.bulkIndex(batch, indexName));
3. 监控与诊断
- 工具:
- Kibana:可视化性能指标。
slowlog
:记录慢查询。
PUT my_index/_settings {"index.search.slowlog.threshold.query.warn": "10s" }
4. 注意事项
- 测试驱动:模拟生产负载验证优化。
- 渐进调整:避免一次性改动过多参数。
- 文档精简:减少不必要字段,降低存储。
五、总结
Elasticsearch 性能优化涵盖索引设计、查询优化、集群管理和 JVM 调优。通过合理分片、精简映射、优先过滤和 G1 GC 等策略,可显著提升效率。本文结合 Java 实现了一个高性能日志搜索系统,测试验证了批量写入和深翻页优化的效果。
相关文章:
Elasticsearch 性能优化:从原理到实践的全面指南
Elasticsearch(ES)作为一款基于 Lucene 的分布式搜索和分析引擎,广泛应用于日志分析、搜索引擎和实时数据处理等场景。然而,在高并发、大数据量环境下,Elasticsearch 的性能可能面临瓶颈,如查询延迟高、索引…...
UITableVIew性能优化概述
UITableVIew性能优化概述 文章目录 UITableVIew性能优化概述前言如何优化优化的本质卡顿的原因 CPU层级cell复用UITableVIew尽量采用复用 定义cell的种类尽量少,可以多用hidden缓存cell高度基础设置预先设置高度设置一个预先缓存 异步绘制滑动按照需加载尽量显示大小…...
【Linux网络与网络编程】09.传输层协议TCP
前言 TCP 即 传输控制协议 (Transmission Control Protocol),该协议要对数据的传输进行一个详细的控制(数据传输时什么时候传输,一次发多少,怎么发,出错了怎么办……) 本篇博客将从下面这张TCP协议格式图…...
08.unity 游戏开发-unity编辑器资源的导入导出分享
08.unity 游戏开发-unity编辑器资源的导入导出分享 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是Python基础语法。前后每一小节的内容是存在的有:学习and理解的关联性,希望对您有用~ unity简介…...
Docker Swarm 集群
Docker Swarm 集群 本文档介绍了 Docker Swarm 集群的基本概念、工作原理以及相关命令使用示例,包括如何在服务调度中使用自定义标签。本文档适用于需要管理和扩展 Docker 容器化应用程序的生产环境场景。 1. 什么是 Docker Swarm Docker Swarm 是用于管理 Docker…...
数据中台、数据湖和数据仓库 区别
1. 核心定义与定位 数据仓库(Data Warehouse) 定义:面向主题的、集成的、历史性且稳定的结构化数据集合,主要用于支持管理决策和深度分析。定位:服务于管理层和数据分析师,通过历史数据生成报表和商业智能…...
【CodeMirror】系列(二)官网示例(五)可撤销操作、拆分视图、斑马条纹
一、可撤销操作 默认情况下,history 历史记录扩展仅跟踪文档和选择的更改,撤销操作只会回滚这些更改,而不会影响编辑器状态的其他部分。 不过你也可以将其他的操作定义成可撤销的。如果把这些操作看作状态效果,就可以把相关功能整…...
SpringBoot 动态路由菜单 权限系统开发 菜单权限 数据库设计 不同角色对应不同权限
介绍 系统中的路由配置可以根据用户的身份、角色或其他权限信息动态生成,而不是固定在系统中。不同的用户根据其权限会看到不同的路由,访问不同的页面。对应各部门不同的权限。 效果 [{"id": 1,"menuName": "用户管理"…...
scikit-learn 开源框架在机器学习中的应用
文章目录 scikit-learn 开源框架介绍1. 框架概述1.1 基本介绍1.2 版本信息 2. 核心功能模块2.1 监督学习2.2 无监督学习2.3 数据处理 3. 关键设计理念3.1 统一API设计3.2 流水线(Pipeline) 4. 重要辅助功能4.1 模型选择4.2 评估指标 5. 性能优化技巧5.1 并行计算5.2 内存优化 6…...
GPT-4、Grok 3与Gemini 2.0 Pro:三大AI模型的语气、风格与能力深度对比
更新后的完整CSDN博客文章 以下是基于您的要求,包含修正后的幻觉率部分并保留原始信息的完整CSDN博客风格文章。幻觉率已调整为更符合逻辑的描述,其他部分保持不变。 GPT-4、Grok 3与Gemini 2.0 Pro:三大AI模型的语气、风格与能力深度对比 …...
Cyber Weekly #51
赛博新闻 1、英伟达开源新模型,性能直逼DeepSeek-R1 本周,英伟达开源了基于Meta早期Llama-3.1-405B-Instruct模型开发的Llama-3.1-Nemotron-Ultra-253B-v1大语言模型,该模型拥有2530亿参数,在多项基准测试中展现出与6710亿参数的…...
QT聊天项目开发DAY02
1.添加输入密码的保密性 LoginWidget::LoginWidget(QDialog*parent): QDialog(parent) {ui.setupUi(this);ui.PassWord_Edit->setEchoMode(QLineEdit::Password);BindSlots(); }2.添加密码的验证提示 3.修复内存泄漏,并嵌套UI子窗口到主窗口里面 之前并没有设置…...
Spring AI高级RAG功能查询重写和查询翻译
1、创建查询重写转换器 // 创建查询重写转换器queryTransformer RewriteQueryTransformer.builder().chatClientBuilder(openAiChatClient.mutate()).build(); 查询重写是RAG系统中的一个重要优化技术,它能够将用户的原始查询转换成更加结构化和明确的形式。这种转…...
速盾:高防CDN的原理和高防IP一样吗?
随着互联网的发展,网络安全威胁日益严重,尤其是DDoS攻击、CC攻击等恶意行为,给企业带来了巨大的风险。为了应对这些挑战,许多企业开始采用高防CDN(内容分发网络)和高防IP作为防御措施。尽管两者都能提供一定…...
SQLite-Web:一个轻量级的SQLite数据库管理工具
SQLite-Web 是一个基于 Web 浏览器的轻量级 SQLite 数据库管理工具。它基于 Python 开发,免费开源,无需复杂的安装或配置,适合快速搭建本地或内网的 SQLite 管理和开发环境。 SQLite-Web 支持常见的 SQLite 数据库管理和开发任务,…...
数智读书笔记系列028 《奇点更近》
一、引言 在科技飞速发展的今天,我们对未来的好奇与日俱增。科技将如何改变我们的生活、社会乃至人类本身?雷・库兹韦尔的《奇点更近》为我们提供了深刻的见解和大胆的预测,让我们得以一窥未来几十年的科技蓝图。这本书不仅是对未来科技趋势…...
深入理解linux操作系统---第4讲 用户、组和密码管理
4.1 UNIX系统的用户和组 4.1.1 用户与UID UID定义:用户身份唯一标识符,16位或32位整数,范围0-65535。系统用户UID为0(root)、1-999(系统服务),普通用户从1000开始分配特殊UID&…...
系统设计模块之安全架构设计(常见攻击防御(SQL注入、XSS、CSRF、DDoS))
一、SQL注入攻击防御 SQL注入是通过恶意输入篡改数据库查询逻辑的攻击方式,可能导致数据泄露或数据库破坏。防御核心在于隔离用户输入与SQL代码,具体措施包括: 参数化查询(预编译语句) 原理:将SQL语句与用…...
redission锁释放失败处理
redission锁释放失败处理 https://www.jianshu.com/p/055ae798547a 就是可以删除 锁的key 这样锁就释放了,但是 还是要结合业务,这种是 非正规的处理方式,还是要在代码层面进行处理。...
Visual Studio Code 在.S汇编文件中添加调试断点及功能简介
目录 一、VS Code汇编文件添加断点二、VS Code断点调试功能简介1. 设置断点(1) 单行断点(2) 条件断点(3) 日志断点 2. 查看断点列表3. 调试时的断点控制4. 禁用/启用断点5. 删除断点6. 条件断点的使用7. 多线程调试8. 远程调试9. 调试配置文件 一、VS Code汇编文件添加断点 最…...
计算视觉与数学结构及AI拓展
在快速发展的计算视觉领域,算法、图像处理、神经网络和数学结构的交叉融合,在提升我们对视觉感知和分析的理解与能力方面发挥着关键作用。本文探讨了支撑计算视觉的基本概念和框架,强调了数学结构在开发鲁棒的算法和模型中的重要性。 AI拓展…...
Vue2 老项目升级 Vue3 深度解析教程
Vue2 老项目升级 Vue3 深度解析教程 摘要 Vue3 带来了诸多改进和新特性,如性能提升、组合式 API、更好的 TypeScript 支持等,将 Vue2 老项目升级到 Vue3 可以让项目获得这些优势。本文将深入解析升级过程,涵盖升级前的准备工作、具体升级步骤…...
器件封装-2025.4.13
1.器件网格设置要与原理图一致,同时器件符号要与数据手册一致 2.或者通过向导进行编辑,同时电机高级符号向导进行修改符号名称 2.封装一般尺寸大小要比数据手册大2倍到1.5倍 焊盘是在顶层绘制,每个焊盘距离要用智能尺子测量是否跟数据手册一…...
Python 基础语法汇总
Python 语法 │ ├── 基本结构 │ ├── 语句(Statements) │ │ ├── 表达式语句(如赋值、算术运算) │ │ ├── 控制流语句(if, for, while) │ │ ├── 定义语句(def…...
Java函数式编程魔法:Stream API的10种妙用
在Java 8中引入的Stream API为函数式编程提供了一种全新的方式。它允许我们以声明式的方式处理数据集合,使代码更加简洁、易读且易于维护。本文将介绍Stream API的10种妙用,帮助你更好地理解和应用这一强大的工具。 1. 过滤操作:筛选符合条件…...
【力扣hot100题】(094)编辑距离
记得最初做这题完全没思路,这次凭印象随便写了一版居然对了。 感觉这题真的有点为出题而出题的意思,谁拿到这题会往动态规划方向想啊jpg 也算是总结出规律了,凡是遇到这种比较俩字符串的十有八九是动态规划,而且是二维动态规划&…...
穿透三层内网VPC2
网络拓扑 目标出网web地址:192.168.139.4 信息收集端口扫描: 打开8080端口是一个tomcat的服务 版本是Apache Tomcat/7.0.92 很熟悉了,可能存在弱口令 tomcat/tomcat 成功登录 用哥斯拉生成马子,上传war包,进入后台 C…...
AI数字消费第一股,重构商业版图的新物种
伍易德带领团队发布“天天送AI数字商业引擎”,重新定义流量与消费的关系 【2025年4月,深圳】在人工智能浪潮席卷全球之际,深圳天天送网络科技有限公司于深圳大中华喜来登酒店重磅召开“AI数字消费第一股”发布盛典。公司创始人伍易德首次系统…...
Unity 基于navMesh的怪物追踪惯性系统
今天做项目适合 策划想要实现一个在现有的怪物追踪系统上实现怪物拥有惯性功能 以下是解决方案分享: 怪物基类代码: using UnityEngine; using UnityEngine.AI;[RequireComponent(typeof(NavMeshAgent))] [RequireComponent(typeof(AudioSource))] …...
【OpenCV】【XTerminal】talk程序运用和linux进程之间通信程序编写,opencv图像库编程联系
目录 一、talk程序的运用&Linux进程间通信程序的编写 1.1使用talk程序和其他用户交流 1.2用c语言写一个linux进程之间通信(聊天)的简单程序 1.服务器端程序socket_server.c编写 2.客户端程序socket_client.c编写 3.程序编译与使用 二、编写一个…...
中断的硬件框架
今天呢,我们来讲讲中断的硬件框架,这里会去举3个开发板,去了解中断的硬件框架: 中断路径上的3个部件: 中断源 中断源多种多样,比如GPIO、定时器、UART、DMA等等。 它们都有自己的寄存器,可以…...
大数据面试问答-Hadoop/Hive/HDFS/Yarn
1. Hadoop 1.1 MapReduce 1.1.1 Hive语句转MapReduce过程 可分为 SQL解析阶段、语义分析阶段、逻辑计划生成阶段、逻辑优化阶段、物理计划生成阶段。 SQL解析阶段 词法分析(Lexical Analysis):使用Antlr3将SQL字符串拆分为有意义的token序列 语法分析(Syntax An…...
【小沐学GIS】基于C++绘制三维数字地球Earth(QT5、OpenGL、GIS、卫星)第五期
🍺三维数字地球系列相关文章如下🍺:1【小沐学GIS】基于C绘制三维数字地球Earth(OpenGL、glfw、glut)第一期2【小沐学GIS】基于C绘制三维数字地球Earth(OpenGL、glfw、glut)第二期3【小沐学GIS】…...
初始图形学(3)
昨天休息了一天,今天继续图形学的学习 向场景发射光线 现在我们我们准备做一个光线追踪器。其核心在于,光线追踪程序通过每个像素发送光线。这意味着对于图像中的每个像素点,程序都会计算一天从观察者出发,穿过该像素的光线。并…...
如果想在 bean 创建出来之前和销毁之前做一些自定义操作可以怎么来实现呢?
使用生命周期扩展接口(最灵活) 创建前拦截可以通过实现 InstantiationAwareBeanPostProcessor 接口的 postProcessBeforeInstantiation 方法,在Bean实例化前执行逻辑 在销毁前拦截可以通过实现 DestructionAwareBean 接口的 postProcessBe…...
【甲子光年】DeepSeek开启AI算法变革元年
目录 引言人工智能的发展拐点算力拐点:DeepSeek的突破数据拐点:低参数量模型的兴起算法创新循环算法变革推动AI普惠应用全球AI科技竞争进入G2时代结论 引言 2025年,人工智能的发展已经走到了一个战略拐点。随着技术能力的不断提升࿰…...
Go语言--语法基础4--基本数据类型--整数类型
整型是所有编程语言里最基础的数据类型。 Go 语言支持如下所示的这些整型类型。 需要注意的是, int 和 int32 在 Go 语言里被认为是两种不同的类型,编译器也不会帮你自动做类型转换, 比如以下的例子会有编译错误: var value2 in…...
MCP基础学习计划详细总结
MCP基础学习计划详细总结 1.MCP概述与基础 • MCP(Model Context Protocol):由Anthropic公司于2024年11月推出,旨在实现大型语言模型(LLM)与外部数据源和工具的无缝集成。 • 核心功能: • 资…...
大模型到底是怎么产生的?一文揭秘大模型诞生全过程
前言 大模型到底是怎么产生的呢? 本文将从最基础的概念开始,逐步深入,用通俗易懂的语言为大家揭开大模型的神秘面纱。 大家好,我是大 F,深耕AI算法十余年,互联网大厂核心技术岗。 知行合一,不写水文,喜欢可关注,分享AI算法干货、技术心得。 【专栏介绍】: 欢迎关注《…...
Node.js介绍
一、Node.js 核心定义 本质:基于 Chrome V8 引擎构建的 JavaScript 运行时环境,用于在服务器端执行 JavaScript 代码。 定位:非阻塞、事件驱动的 I/O 模型,专为高并发、实时应用设计。 诞生:2009 年由 Ryan Dahl 发布…...
DRABP_NSGA2最新算法神圣宗教算法优化BP做代理模型,NSGA2反求最优因变量和对应的最佳自变量组合,Matlab代码
一、神圣宗教算法(DRA)优化BP代理模型 1. DRA的核心原理 DRA是一种模拟宗教社会层级互动的元启发式算法,通过“追随者学习”、“传教士传播”和“领导者引导”三种行为模式优化搜索过程。在BP神经网络优化中,DRA通过以下步骤调整…...
Android Studio 在 Windows 上的完整安装与使用指南
Android Studio 在 Windows 上的完整安装与使用指南—目录 一、Android Studio 简介二、下载与安装1. 下载 Android Studio2. 安装前的依赖准备3. 安装步骤 三、基础使用指南1. 首次启动配置2. 创建第一个项目3. 运行应用4. 核心功能 四、进阶功能配置1. 配置 SDK 和工具2. 自定…...
Matlab学习笔记五十:循环语句和条件语句的用法
1.说明 循环语句:for…end,while…end 条件语句:if…end,switch…case…end 其中if语句语法还可以是:for…else…end,for…elseif…else…end 2.简单for程序实例 for x1:5 %循环遍历1~5 yx5 end [1…...
大漠流光:科技牧歌的未来-内蒙古鄂尔多斯
故事背景 故事发生在中国内蒙古鄂尔多斯,这里是蒙古族文化的摇篮,也是科技与自然交织的未来舞台。在这片广袤的土地上,蒙古族少女、老牧人和工程师们共同谱写着一曲科技与传统共生的赞歌。未来的鄂尔多斯,不再是单一的沙漠或草原…...
MySQL与Oracle深度对比
MySQL与Oracle深度对比:数据类型与SQL差异 一、数据类型差异 1. 数值类型对比 数据类型MySQLOracle整数TINYINT, SMALLINT, MEDIUMINT, INT, BIGINTNUMBER(精度) 或直接INT(内部仍为NUMBER)小数DECIMAL(p,s), FLOAT, DOUBLENUMBER(p,s), FLOAT, BINARY_FLOAT, BI…...
GESP2023年12月认证C++七级( 第一部分选择题(6-10))
选择题第八题: #include <iostream> #include <cstring> #include <algorithm> using namespace std;const int MAXN 1005; // 假设字符串长度不超过1000 char s1[MAXN], s2[MAXN]; int dp[MAXN]; // 一维DP数组int main() {while (cin >>…...
腾势品牌欧洲市场冲锋,科技豪华席卷米兰
在时尚与艺术的交汇点,米兰设计周的舞台上,一场汽车界的超级风暴正在酝酿,腾势品牌如一头勇猛无畏的雄狮,以雷霆万钧之势正式向欧洲市场发起了冲锋。其最新力作——腾势Z9GT的登场,仿佛是一道闪电划破夜空,…...
双指针、滑动窗口
一、双指针 双指针是指在算法中使用两个指针(通常是索引或迭代器)来解决问题,通过移动这两个指针来扫描数据结构(如数组或链表),从而达到高效的目的。双指针的核心思想是利用两个指针的相对位置或移动方式…...
《数据密集型应用系统设计》读书笔记:第二章
我们继续拆解 第2章:数据模型与查询语言。这章讲的是如何组织数据、如何访问数据,也是你选择数据库种类的根本依据。 第2章:数据模型与查询语言 一、为何数据模型重要? Martin 开篇就强调,数据模型影响: …...
ubuntu24.04LTS安装向日葵解决方案
去向日葵官方下载ubuntu使用的deb包 向日葵 输入如下命令安装,将具体版本修改成自己下载的版本 andrew in ~/下载 λ sudo dpkg -i SunloginClient_15.2.0.63064_amd64.deb 正在选中未选择的软件包 sunloginclient。 (正在读取数据库 ... 系统当前共安装有 290947…...