InfluxDB SELECT查询实战:从核心语法到性能优化的避坑指南
1. 项目概述为什么InfluxDB的SELECT查询值得你花时间如果你正在处理时序数据比如服务器监控指标、物联网传感器读数或者应用性能数据那么InfluxDB大概率是你的技术栈之一。作为一款专门为时序数据优化的数据库它的查询语言InfluxQL虽然看起来很像SQL但细节上却有不少“坑”和独特的“脾气”。很多从传统关系型数据库如MySQL、PostgreSQL转过来的朋友第一次写InfluxDB的SELECT查询时都会有种“似曾相识却又处处碰壁”的感觉。明明一个简单的GROUP BY time()怎么结果和预期不一样为什么我的WHERE条件过滤时间戳总是不生效FILL()函数到底该怎么用才能不报错这篇内容就是把我过去几年在实战中关于InfluxDB SELECT查询的那些核心语法、隐藏细节和踩过的坑进行一次彻底的梳理和总结。这不是官方文档的翻译而是一个一线工程师的实操笔记。我会假设你已经对InfluxDB的数据模型Measurement, Tag, Field, Point, Series有基本了解并且搭建好了一个可以连接的环境。我们的目标很明确让你能写出高效、正确、符合预期的InfluxQL查询语句避开那些让我掉过头发的问题。无论是进行数据可视化、生成报表还是做异常检测一个扎实的SELECT查询基础都是关键。2. InfluxQL SELECT核心语法结构拆解InfluxQL的SELECT语句骨架和SQL非常相似但每个部分的内涵和约束都有其特殊性。理解这个结构是写出正确查询的第一步。2.1 基础SELECT子句不仅仅是选择字段最基本的SELECT语句形式是SELECT field_key[,field_key,tag_key] FROM measurement_name [WHERE stuff]。看起来简单但门道不少。1. 选择字段Field与标签Tag在SELECT子句中你可以指定具体的Field键、Tag键或者使用通配符。SELECT “temperature”, “humidity” FROM “sensor_data”: 选择两个Field。SELECT “location”, “temperature” FROM “sensor_data”: 选择了Taglocation和 Fieldtemperature。这里有个重要区别Tag在结果中会以列的形式出现但其值在系统中是被索引的字符串不参与后续的聚合计算如MEAN,SUM。SELECT * FROM “sensor_data”: 使用通配符*选择当前Measurement中的所有Field。注意*不会返回Tag这是一个常见的误解。如果你需要同时返回所有Field和Tag需要使用SELECT *::field, *::tag但这种用法有性能开销在生产环境查询中应谨慎使用。2. 使用函数与基本运算你可以在SELECT中对Field进行函数处理和运算。SELECT MEAN(“temperature”) FROM “sensor_data”: 计算温度的平均值。SELECT (“value” * 1.8) 32 AS “temp_f” FROM “sensor_data”: 将摄氏温度转换为华氏温度并使用AS子句重命名结果列。这里“value”是一个Field。运算通常只适用于数值型Field。踩坑提示1区分Field和Tag的查询行为在WHERE子句中对Tag的过滤是走索引的效率极高。而对Field的过滤在1.x版本中通常是全表扫描除非使用索引在2.x版本中有所优化但设计上Tag仍是主要的过滤维度。因此设计Schema时将高频过滤条件设为Tag将需要计算的值设为Field是提升查询性能的关键。2.2 FROM子句与数据源指定FROM子句指定要查询的Measurement。它支持一些简单的模式匹配。FROM “sensor_data”: 查询指定Measurement。FROM /sensor.*/: 使用正则表达式查询所有以sensor开头的Measurement。FROM “database_name”.”retention_policy_name”.”measurement_name”: 完全限定名称查询指定数据库和保留策略。在跨数据库查询或明确指定RP时使用。如果省略则使用当前数据库的DEFAULT保留策略。2.3 WHERE子句时序数据过滤的精髓WHERE子句用于过滤数据这是查询中最常用也最容易出问题的部分之一。1. 时间范围过滤绝对核心时序查询几乎总是围绕时间展开。InfluxDB提供了多种时间指定方式。相对时间最常用。例如WHERE time now() - 1h查询过去一小时的数据。now()是当前服务器时间。绝对时间使用时间字符串。例如WHERE time ‘2023-10-27T00:00:00Z’ AND time ‘2023-10-28T00:00:00Z’。这里有个大坑时间条件必须使用单引号包裹。双引号会导致语法错误或意想不到的结果。时间戳字面量直接使用纳秒精度的时间戳如WHERE time 1698364800000000000。这种方式不直观但精确。2. 对Tag和Field的过滤Tag过滤WHERE “location” ‘server-room-01’。Tag值必须用单引号。Field过滤WHERE “temperature” 25.0。数值比较不需要引号。对于字符串类型的Field值也需要单引号WHERE “status” ‘ok’。正则表达式过滤WHERE “location” ~ /^server-room.*/(~匹配!~不匹配)。可以用于Tag或字符串Field。踩坑提示2WHERE子句中的引号与类型记住这个口诀Tag值用单引号Field字符串值用单引号Field数值不用引号时间字符串用单引号。混淆引号是新手最常遇到的语法错误之一。例如WHERE “tag_key” “some_value”错误Tag值用了双引号或者WHERE time “2023-10-27”错误时间用了双引号都会导致查询失败或结果异常。2.4 GROUP BY子句数据分组的独特逻辑GROUP BY是InfluxQL中功能强大且独特的一部分主要用于对数据进行聚合和降采样。1. 按时间区间分组GROUP BY time()这是时序数据库的核心操作用于将数据按固定时间窗口如1分钟、5分钟、1小时进行聚合。SELECT MEAN(“temperature”) FROM “sensor_data” WHERE time now() - 1h GROUP BY time(5m) 查询过去一小时的数据并计算每5分钟的平均温度。time()内的参数是一个时间字符串如1m(分钟)10s(秒)1h(小时)1d(天)。聚合窗口的选择直接影响查询性能和结果精度。窗口太小聚合效果不明显且数据量大窗口太大会丢失细节信息。2. 按Tag分组SELECT MEAN(“temperature”) FROM “sensor_data” GROUP BY “location” 按location这个Tag分组计算每个地点的平均温度。这会为每个唯一的location值生成一个结果序列。3. 混合分组SELECT MEAN(“temperature”) FROM “sensor_data” GROUP BY time(1h), “location” 先按1小时间隔窗口分组然后在每个时间窗口内再按location分组。这是最常见的组合用于生成按时间和维度聚合的报表数据。踩坑提示3GROUP BY time() 与查询时间边界GROUP BY time()的行为与你的WHERE时间范围紧密相关。InfluxDB默认会基于WHERE子句的时间范围生成一个完整的、对齐的时间区间序列。例如WHERE time ‘10:00’ AND time ‘11:00’加上GROUP BY time(30m)会生成[10:00, 10:30)和[10:30, 11:00)两个桶。即使某个桶内没有数据结果中也可能出现该时间点取决于FILL()的设置。理解这个“对齐”机制对于正确解释聚合结果至关重要。2.5 ORDER BY和时间排序在InfluxQL中ORDER BY子句的功能相对有限。由于数据点默认按时间顺序写入查询结果也默认按时间升序从旧到新返回。你几乎只会用到ORDER BY time DESC 让结果按时间降序排列从新到旧这在查看最新数据时非常有用。你不能像SQL那样按任意Field或Tag进行ORDER BY。排序的核心维度就是时间。3. 核心函数详解与实战应用InfluxQL提供了丰富的函数主要分为聚合函数、选择函数、转换函数和预测函数等。这里重点讲解最常用的聚合函数和FILL()函数。3.1 聚合函数从数据中提取信息聚合函数必须与GROUP BY子句一起使用除非聚合整个时间序列。函数名描述适用字段类型注意事项COUNT()计算非空字段值的数量。所有类型COUNT(“field_key”)或COUNT(*)(仅1.x)。在2.x中COUNT()通常对特定field。MEAN()计算字段值的算术平均值。数值型对整数和浮点数有效。SUM()计算字段值的总和。数值型注意溢出问题特别是对于可能持续增长的计数器如请求数。MEDIAN()计算字段值的中位数。数值型比MEAN()对异常值更不敏感。MODE()返回字段值中出现频率最高的值。所有类型对于字符串或布尔型字段也有效。SPREAD()计算字段的最大值和最小值之差。数值型常用于观察指标波动范围。STDDEV()计算字段值的标准差。数值型衡量数据的离散程度。FIRST(),LAST()返回时间窗口内最早或最晚的字段值。所有类型注意是依据时间顺序而不是写入顺序。MAX(),MIN()返回字段的最大值或最小值。数值型、字符串型对于字符串按字典序比较。PERCENTILE(field_key, N)返回字段值中大于N%百分数的值。数值型例如PERCENTILE(“response_time”, 95)计算P95响应时间对性能监控极有用。实战示例计算服务的P99延迟和QPS假设我们有一个Measurement叫http_requests包含duration耗时Field和path接口路径Tag。SELECT COUNT(“duration”) AS “req_count”, PERCENTILE(“duration”, 99) AS “p99_latency” FROM “http_requests” WHERE time now() - 5m AND “path” ‘/api/v1/order’ GROUP BY time(1m)这个查询会每分钟统计一次/api/v1/order接口的请求数量和P99延迟非常适合用于实时监控仪表盘。3.2 FILL()函数处理数据间隙的利器在按时间分组聚合时如果某个时间窗口内没有任何数据默认情况下该窗口不会出现在结果中。这可能导致图表出现断裂。FILL()函数就是用来填充这些间隙的。FILL()子句必须紧跟在GROUP BY子句之后。GROUP BY time(1m) FILL(none):默认行为。不填充缺少数据的窗口不显示。GROUP BY time(1m) FILL(0): 用数字0填充。GROUP BY time(1m) FILL(linear):线性插值。用缺失点前后两个有效点的值进行线性计算来填充。仅对数值型Field有效且要求前后都有数据点。GROUP BY time(1m) FILL(previous): 用前一个时间窗口的值来填充。这是最常用的填充策略之一尤其适合状态类指标。GROUP BY time(1m) FILL(null): 用null填充。某些可视化工具会将null值显示为间隙。踩坑提示4FILL()的常见误区FILL()必须与GROUP BY time()一起使用单独使用会报错。FILL(linear)的限制它要求缺失点之前和之后都必须有数据。如果数据在开头或结尾缺失linear无法填充开头或结尾的间隙。选择哪种FILL对于计数器如请求数FILL(0)可能合适表示该窗口无请求。对于温度传感器数据FILL(previous)可能更合理假设温度变化缓慢。对于需要连续曲线的图表FILL(linear)效果好但要求高。务必根据业务语义选择。性能影响FILL()会增加查询引擎的计算开销尤其是在处理大量空窗口时。4. 高级查询模式与性能优化要点掌握了基础语法和函数后我们可以构建更复杂的查询来解决实际问题同时也要关注查询性能。4.1 子查询与嵌套聚合InfluxQL支持子查询通常用于进行多级聚合。语法是SELECT_clause FROM (SELECT_statement) [...]。 一个典型场景是先按小时间粒度聚合再对聚合结果进行二次计算。示例计算每小时的请求量然后找出一天中请求量最大的小时直接一步计算很困难。我们可以用子查询SELECT MAX(“req_count”) FROM ( SELECT COUNT(“duration”) AS “req_count” FROM “http_requests” WHERE time now() - 1d GROUP BY time(1h) ) GROUP BY time(1d)内层子查询按小时聚合出请求量req_count外层查询再按天聚合找出每天中最大的那个req_count即峰值小时请求量。4.2 连续查询CQ与查询下推对于需要频繁执行的固定聚合查询如每分钟计算一次过去5分钟的平均值使用连续查询Continuous Query, CQ是标准的最佳实践。CQ会在后台自动周期性地执行预定义的查询并将结果写入一个新的Measurement中。这样应用查询时直接读取聚合后的数据性能会得到数量级的提升。虽然本文聚焦SELECT但理解CQ对优化查询模式至关重要。基本的CQ创建语句类似CREATE CONTINUOUS QUERY “cq_5min_mean” ON “my_db” BEGIN SELECT MEAN(“value”) INTO “downsampled_means” FROM “raw_sensor_data” GROUP BY time(5m), * END这个CQ会每5分钟执行一次计算raw_sensor_data中所有序列的5分钟均值并存入downsampled_means中。4.3 查询性能优化 checklist当你的SELECT查询变慢时可以按以下顺序排查和优化缩小时间范围这是最有效的优化。使用时序数据库一定要养成加时间范围条件的习惯避免全表扫描。WHERE time now() - 1h远比不加好。优先使用Tag进行过滤WHERE子句中先使用Tag条件利用索引快速缩小数据范围。慎用通配符*和正则表达式SELECT *或FROM /.*/会导致查询大量不需要的字段或表消耗资源。尽量指定明确的Field和Measurement。合理使用GROUP BY time()的间隔过小的聚合间隔会产生大量数据点影响网络传输和客户端渲染。根据展示需求如屏幕像素点数量选择合适的间隔。利用保留策略RP和CQ将原始高精度数据存入短期RP通过CQ将降采样后的数据存入长期RP。查询长期历史数据时直接查询降采样后的RP。关注Series数量Series是Measurement、Tag集和Field集的唯一组合。过多的Series称为“高序列基数”会严重影响数据库性能和查询速度。设计Schema时避免将高基数的数据如用户ID、请求ID作为Tag。5. 常见错误排查与调试技巧即使语法正确查询结果也可能出乎意料。以下是一些常见问题的排查思路。5.1 查询返回空结果检查时间范围确认WHERE子句中的时间条件是否正确。使用now()时注意数据库服务器的时区。绝对时间字符串的格式是否正确ISO 8601格式。检查Measurement名称、Field键和Tag键名称是否大小写敏感是的InfluxQL中字符串是大小写敏感的是否有拼写错误检查Tag值或Field值条件WHERE “status” ‘OK’和WHERE “status” ‘ok’结果可能不同。确认数据的实际值。使用SHOW命令辅助调试SHOW MEASUREMENTS 查看当前数据库有哪些表。SHOW FIELD KEYS FROM “measurement_name” 查看某个表有哪些字段及其类型。SHOW TAG KEYS FROM “measurement_name” 查看Tag键。SHOW TAG VALUES FROM “measurement_name” WITH KEY “location” 查看location这个Tag有哪些具体的值。SELECT * FROM “measurement_name” LIMIT 5 快速查看几条原始数据的格式这是最直接的调试方式。5.2 聚合结果不符合预期理解GROUP BY time()的边界对齐如前所述聚合窗口是固定对齐的如整点、整分。你的数据时间点可能落在窗口边缘导致你认为应该在一个窗口的数据被分到了两个窗口。可以通过在查询中输出原始时间戳来验证。FILL()的影响确认你是否使用了FILL()以及填充的值是否扭曲了你的理解。尝试用FILL(none)看看原始聚合结果。数据类型问题确保你聚合的Field是数值型。对字符串类型的Field使用MEAN()、SUM()等函数会没有结果。5.3 查询执行超时或内存不足查询数据量过大这是最常见原因。检查你的时间范围是否过大是否没有使用Tag过滤。尝试先对一个很小的时间范围如1分钟进行查询确认语法正确后再逐步扩大范围。Series基数过高如果查询涉及大量唯一的Series例如GROUP BY *在一个Tag组合很多的表上会导致查询引擎需要处理海量的序列极易超时。需要通过优化Schema来解决根本问题。客户端处理能力有时查询本身执行很快但返回的结果集非常大几十万上百万点在网络上传输或客户端如Grafana渲染时导致超时。这时需要增加GROUP BY time()的间隔来减少返回的数据点数量。5.4 使用EXPLAIN和PROFILE分析查询InfluxDB 1.x / 2.x兼容思路虽然InfluxQL不像传统SQL那样有强大的执行计划分析工具但我们可以通过一些方法来洞察查询行为分步调试将一个复杂的查询拆分成几个简单的子查询依次执行定位是哪个部分导致了性能问题或错误结果。关注查询日志数据库服务器的日志中通常会记录慢查询和错误信息。使用监控指标InfluxDB自身会暴露关于查询执行的内部指标如query_executor_duration_seconds可以将其写入另一个InfluxDB进行监控了解查询的性能基线。最后关于SELECT查询我个人最深刻的体会是理解数据是如何写入的是写出正确查询的前提。很多查询问题根源在于数据模型设计不当。在动手写复杂的SELECT之前不妨先花点时间用SELECT * LIMIT 10看看你的数据到底长什么样Tag和Field是否清晰时间戳是否准确。磨刀不误砍柴工这个习惯能帮你避开一大半的坑。

相关新闻

程序员内功修炼:从时间复杂度到实战选型,八大排序算法核心解析

程序员内功修炼:从时间复杂度到实战选型,八大排序算法核心解析

1. 项目概述:为什么排序是程序员的“基本功”? 干了这么多年开发,我越来越觉得,排序算法这东西,就像木匠手里的刨子、厨师手里的菜刀,是吃饭的家伙,更是衡量一个程序员内功深浅的试金石。你可能…

2026/8/22 3:45:35 阅读更多 →
DeepSeek-V2混合专家模型部署实战:从环境配置到性能优化

DeepSeek-V2混合专家模型部署实战:从环境配置到性能优化

最近在尝试部署和微调大语言模型时,很多开发者都面临一个核心矛盾:模型性能与推理成本。想要获得更强的理解、生成和推理能力,往往意味着需要参数量巨大的模型,随之而来的便是高昂的训练成本和令人望而却步的推理开销。DeepSeek-V…

2026/8/22 3:45:35 阅读更多 →
亚太赛ABC题解题思维:从破题到建模的完整实战路径

亚太赛ABC题解题思维:从破题到建模的完整实战路径

1. 项目概述:从“解题”到“解题思维”的实战转化最近后台和社群里问“亚太赛ABC题”的同学特别多,尤其是看到“完整思路”这种标题,大家的第一反应往往是找标准答案或者“抄作业”。但作为一个带过好几届队伍、自己也从参赛者一路走过来的老…

2026/8/22 3:45:35 阅读更多 →

最新新闻

Codex CLI 内存清理实战:prune 与 dedupe 释放磁盘空间

Codex CLI 内存清理实战:prune 与 dedupe 释放磁盘空间

如果你长期使用 Codex CLI 这类大模型命令行工具,可能会发现一个令人头疼的问题:随着使用时间增长,工具占用的磁盘空间越来越大,运行速度却越来越慢。这通常是因为工具在本地缓存了大量的历史对话、模型数据或临时文件&#xff0c…

2026/8/22 4:46:50 阅读更多 →
大模型开发岗位:技术能力与求职策略全解析

大模型开发岗位:技术能力与求职策略全解析

1. 大模型开发岗位的市场现状与机遇2023年大模型相关岗位平均薪资较传统开发岗高出47%,头部企业为3年经验候选人开出的年薪包普遍超过70万。这个数字背后反映的是行业对复合型人才的极度渴求——既需要扎实的工程能力,又要理解大模型技术栈的完整生命周期…

2026/8/22 4:46:50 阅读更多 →
简历优化工具开发:从数据采集到智能匹配

简历优化工具开发:从数据采集到智能匹配

1. 项目背景:当简历石沉大海时 投递100份简历却收不到任何回复,这种经历我太熟悉了。去年求职季,我连续投了87份简历,只收到5个机械回复和1个不匹配的面试邀约。直到我逆向思考:HR和招聘系统到底是如何筛选简历的&…

2026/8/22 4:46:50 阅读更多 →
Apache Paimon:基于LSM树与Flink深度集成的流批一体数据湖存储

Apache Paimon:基于LSM树与Flink深度集成的流批一体数据湖存储

1. 从“数据仓库”到“数据湖”:为什么我们需要Paimon?如果你在过去几年里处理过海量数据,尤其是流式数据,那么“数据湖”这个概念对你来说一定不陌生。传统的数仓模式,比如Hive,在处理T1的批处理任务时表现…

2026/8/22 4:46:50 阅读更多 →
AI Agent降本增效实战:程序化技能学习如何将成本降低90%

AI Agent降本增效实战:程序化技能学习如何将成本降低90%

1. 项目概述:为什么“程序化技能学习”是降本增效的下一站最近在跟几个做AI Agent项目的朋友聊天,大家普遍头疼一个问题:Agent的“智商”上去了,但“开销”也水涨船高。每次调用大模型(LLM)生成代码、执行任…

2026/8/22 4:46:50 阅读更多 →
SpringBoot+Vue高校招聘系统开发实践与优化

SpringBoot+Vue高校招聘系统开发实践与优化

1. 项目背景与核心价值高校就业招聘系统是连接毕业生与用人单位的重要桥梁。传统招聘管理往往依赖Excel表格和邮件往来,存在信息孤岛、流程混乱、数据统计困难等问题。我们团队去年为某211高校开发的系统上线后,简历处理效率提升300%,企业校招…

2026/8/22 4:45:50 阅读更多 →

日新闻

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

在电子硬件开发领域,PCB(印制电路板)的沉金工艺是提升产品可靠性和焊接质量的关键环节。对于需要高密度互连、长期稳定运行或高频信号传输的板卡,如“黍姐仿通行证”这类可能涉及身份识别、数据交互的硬件项目,选择正确…

2026/8/22 0:00:11 阅读更多 →
电气考研电路八月强化四步法:从知识体系到真题实战的闭环攻略

电气考研电路八月强化四步法:从知识体系到真题实战的闭环攻略

这次我们来看一个针对电气考研电路科目的学习规划项目。它不是软件工具,而是一套聚焦于8月份关键节点的备考策略。对于电气工程考研的同学来说,电路分析是专业课的重中之重,也是拉开分差的关键。进入8月,复习进入强化阶段&#xf…

2026/8/22 0:00:11 阅读更多 →
消除AI代码的“AI味”:Claude Code设计优化技能配置与实战指南

消除AI代码的“AI味”:Claude Code设计优化技能配置与实战指南

大家好,我是专注于前端开发与AI工具实践的技术博主。在日常使用 Claude Code 等AI编程助手时,你是否也遇到过这样的困扰:生成的代码功能上没问题,但代码风格、组件设计、交互逻辑总透着一股“AI味”——布局单调、样式简陋、交互生…

2026/8/22 0:00:11 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/21 3:21:33 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/21 0:02:09 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/21 6:07:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/21 16:42:28 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/20 21:46:49 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →