vivo 湖仓架构的性能提升之旅
作者:郭小龙 vivo互联网 大数据高级研发工程师
导读:本文整理自 vivo互联网 大数据高级研发工程师 郭小龙 在 StarRocks 年度峰会上的分享,聚焦 vivo 大数据多维分析面临的挑战、StarRocks 落地方案及应用收益。
在 即席分析 场景,StarRocks 使用占比达 70%,查询速度提升 3 倍,P50 耗时从 63.77 秒缩短至 22.30 秒,查询成功率接近 98%。
在 敏捷 BI 领域,StarRocks 已完成 25% 切换,月均查询成功数超 25 万,P90 查询时长缩短至 5 秒,相比 Presto 提升 75%。
在 研发工具平台 方面,StarRocks 支持准实时数据查询,数据可见性缩短至 3 分钟,查询加速使 P95 延迟降至 400 毫秒,开发效率提升 30%。
vivo大数据多维分析场景面临的挑战
在即席分析方面,我们的解决方案主要基于 Spark 和 Presto 两大计算引擎。作为 vivo 大数据研发治理平台的重要组成部分,即席分析模块因其高频率的使用而显得尤为关键。通过用户调研我们了解到,现有系统存在查询响应时间较长的问题,这直接影响了工作效率;同时,语法兼容性的不足也给用户带来了不便。因此,针对该模块进行优化,以提升查询速度和增强语法兼容性,已经成为我们团队工作的重中之重。
在敏捷 BI 方面,我们采用Presto作为数据查询引擎时,遇到了用户反映查询响应时间较长的问题,同时发现对这些查询进行性能优化存在较大挑战,找不到有效的方案。
在研效工具平台方面,早期数据规模较小时,该平台基于 MySQL 结合内存计算模式运行。然而,随着数据规模的增长,这一模式已无法满足业务需求。我们曾尝试采用 ClickHouse 作为解决方案,但在实践中遇到了诸多问题,最终未能落地。具体问题包括查询性能低、内存计算易发生内存溢出、数据清洗与加工时间过长(通常需要多个小时甚至一天),以及实时更新和删除流程复杂。计算逻辑较为繁琐,用户在构建报表时需要编写大量 Java 代码,消耗大量开发人力。这已成为一个常见的痛点。
此外,由于历史原因,我们在用户权限管理及计算资源分配方面长期缺乏有效的认证与管控机制。
Presto 相关痛点
在 Presto 方面,我们遇到的主要问题包括:
-
多级缓存能力较弱;
-
CBO(成本优化器)能力有限;
-
缺乏物化视图及表级加速方案;
-
无物理隔离机制;
-
Coordinator 采用单点部署,存在单点故障风险;
-
经过 JVM 调优及集群扩容后,仍会周期性地出现相同或类似的问题;
-
社区活跃度较低,性能优化方案较少。
ClickHouse 相关痛点
虽然 ClickHouse 在宽表应用场景中表现优异,但在湖仓一体架构下的加速能力有限,且数据导入期间的存储成本偏高,这成为用户特别关注的问题。另外,ClickHouse 在 Join 操作上的处理能力有所欠缺,包括CBO(基于代价的优化)、Reorder(重排序)以及Runtime Filter(运行时过滤)等关键优化措施迟迟未能落地,导致 SQL 调优时常需手动调整用户 SQL ,极大降低了用户体验。
与此同时,尽管 ClickHouse 提供了部分实时更新和删除的功能,但这些特性的性能并未得到根本性提升,进一步影响了用户体验。SQL 兼容性也仅达到一般水平,而集群扩缩容流程复杂,尤其是在执行节点扩展、缩减或副本调整时,故障机器的恢复与替换需要大量的人工介入。即使存在一些解决方案,这些问题依然显著影响运维效率,给用户体验带来了负面影响。
经过大量组件调研、功能与性能测试、行业案例分析以及 StarRocks 社区的技术指导,我们最终选择 StarRocks 作为新一代多维分析引擎,并确立其为湖仓加速的唯一标准。
StarRocks 优势
StarRocks 在湖仓加速方面具备显著优势,支持标准 SQL 并兼容 MySQL 协议。其强大的 Join 处理能力、默认启用的 CBO(成本优化器)优化规则、多级缓存机制,以及智能物化视图加速,使其在复杂查询场景下表现优异。此外,StarRocks 提供完整的资源隔离机制,最新的 3.3.5 版本更是引入了 CG Group CPU 硬隔离方案,进一步提升了资源管理的稳定性和可控性。
在运维方面,StarRocks 具备较高的易用性。无论是集群扩容还是缩容,仅需执行简单的命令并进行观察即可完成,极大降低了运维成本。可以看到,StarRocks 的诸多优势正好弥补了 Presto 和 ClickHouse 的短板,有效解决了我们在 OLAP 领域所面临的挑战和痛点。
此外,我们的 OLAP 团队经历了从 Druid、Kylin、Presto 到 ClickHouse 等多种组件的演进,且当前维护多个 OLAP 组件,研发人力分散。为提升研发效率,我们未来专注于 StarRocks 和 ClickHouse 的使用,每一位研发人员都需要深入学习并熟练掌握这两个核心组件。
StarRocks 服务建设落地的技术解决方案
上图展示了 vivo 大数据平台的整体架构,StarRocks 处在查询层和数据存储层,扮演着关键角色。
-
在查询层,主要涉及即席分析、BI 报表、湖仓一体等应用,同时涵盖基础建设和业务系统。目前,查询引擎包括 Spark、ClickHouse、Druid、Presto 和 StarRocks,未来 StarRocks 将完全替代 Presto。
-
在数据加工层,离线计算采用 Spark,实时计算则基于 Flink。数据存储方面,涉及 Hive、Paimon、ClickHouse、StarRocks、Druid 和 HBase。其中,Druid 目前仅用于基础设施监控及部分广告业务,后续计划逐步将相关场景迁移至 StarRocks 或 ClickHouse。
-
数据介质层主要包括 HDFS、自研对象存储,以及 HDD 和 SSD 文件系统。右侧则是公司自研的服务平台,涵盖数据开发、任务调度、实时计算等功能,并负责 StarRocks 的建库、建表及物化视图管理等操作。
湖仓查询加速架构
上图展示了最新的湖仓查询加速架构。
在数据仓库方面,我们主要采用 Hive,其中 90% 以上的表使用 ORC 格式,约 7%–8% 为 Text 格式。目前,我们正在推进 Text 表向 ORC 格式的迁移,目标是使 Hive 数仓中 99% 的表采用 Apache ORC。
Paimon 建设已持续约一年,目前 100% 采用 ORC 格式。在查询加速层面,我们引入了 StarRocks 作为核心引擎。
在引入 StarRocks 过程中,ORC 格式的性能优化是首要任务。此前,StarRocks 在湖仓查询加速(尤其是 Hive 查询加速)方面的优化主要基于 Parquet 格式,但在 ORC 方面的优化相对较少。因此,我们针对 ORC 格式进行了专项优化,以提升查询性能,使其更适用于现有的数据架构。
ORC 性能优化
当前使用 StarRocks 的用户,Hive 数据格式基本上是 Parquet ,因此 StarRocks 在 Parquet 格式的优化上非常成熟,而对于 ORC 格式的支持相对较少。为了解决这一问题,我们与社区团队紧密合作,共同解决了大量的性能和功能方面的问题,极大地提升了 ORC 格式 Hive 表的查询性能。我们通过修改相关代码并重放了数十万条线上SQL,确保所有修改既准确又高效。
-
修复 ORC 数据多读问题:优化了数据读取逻辑,减少了不必要的数据读取,显著提升了查询性能。
-
优化 ORC 延迟物化性能:通过延迟物化技术,减少了内存占用和计算开销,进一步提升了查询效率。
-
优化 ORC tiny stripe 处理:改进了 tiny stripe 的处理方式,提升了小文件的查询性能,特别是在处理大量小文件时表现优异。
-
支持使用 column id 下推 search argument 谓词:通过下推谓词,减少了不必要的数据扫描,提高了查询速度。
-
FE 打乱 scan range 顺序:优化了 scan range 的调度顺序,提升了探查 SQL 的性能,特别是在处理复杂查询时效果显著。
-
统一 Map Key 行为与 Presto 一致:调整了 Map Key 的行为,使其与 Presto 保持一致,确保了查询的一致性和稳定性。
-
优化 ORC is null/is not null 谓词下推能力:增强了对 is null 和 is not null 谓词的下推能力,减少了不必要的数据读取,提升了查询性能。
-
降低 DataCache cache miss 后从远端读取的 IOPS :优化了 DataCache 的缓存机制,减少了 cache miss 后从远端读取的 IOPS ,降低了网络延迟,提升了整体性能。
-
Data Cache 异步填充:大幅降低缓存填充对数据读操作的影响。
-
压缩格式支持:vivo 数仓的Text格式占比:约 10%,ORC 格式占比约 90%,支持的压缩格式繁多,包括 NONE、SNAPPY、ZLIB 、LZ4、ZSTD、GZIP、BZIP2、LZO、DEFLATE 等,我们与社区团队紧密合作,共同解决了所有压缩格式的兼容性问题。
通过这些优化措施,我们与社区团队共同显著提升了 StarRocks 在处理 ORC 格式 Hive 表的性能和稳定性,为用户提供更加高效、流畅的查询体验。这些改进不仅解决了当前存在的问题,还为未来的性能提升奠定了坚实的基础。
Data Cache 性能优化
在数据缓存优化方面,我们最终选择了 NVME SSD 作为存储介质,磁盘使用率达到 95%。在当前 StarRocks 3.2.5 版本中,我们提前引入了 3.3.x 版本的异步缓存写入能力,并计划在未来升级至最新版本,以进一步利用 Data Cache 相关特性,提升查询性能。
在完成 ORC 格式的性能优化并准备正式上线时,我们在回放测试中发现查询性能未达预期。进一步分析后,问题的复杂性在于回放过程中慢查询的 SQL 特征并不固定,每次出现的慢 SQL 都有所不同,增加了问题定位的难度。
HDFS 慢节点性能优化
在优化过程中,我们回溯查询日志,深入分析 BE 的 HDFS 访问日志,最终发现大量 HDFS 超时问题。由于公司内部 HDFS 负载高,Spark、Flink 以及各种查询任务都会对其造成较大压力,从而影响查询性能。
针对这一问题,我们尝试调整超时时间,从 60 秒 依次降低至 10 秒、5 秒、2 秒,并观察性能变化。结果显示,2 秒的超时时间在性能和稳定性方面表现最佳,但也导致少量失败情况。进一步分析发现,部分 HDFS 数据节点(DataNode)存在较为普遍的慢节点问题,即使经过多次重试仍可能失败。
为解决该问题,我们自研了动态重试机制,即:
-
首次重试:5 秒
-
第二次重试:10 秒
-
后续重试递增
这一优化方案有效解决了 HDFS 慢节点导致的超时问题,确保了系统的稳定性和查询效率。完成该优化后,我们顺利完成 StarRocks 的正式上线,并实现了查询性能的最大化提升。本次优化带来的价值与收益见下文。
元数据缓存和性能优化StarRocks 上线后,我们发现了一个新的性能瓶颈,即元数据缓存导致的查询延迟与结果一致性问题。我们的即席分析用户主要是数据开发人员,他们在数据导入完成后,希望能够立即查询最新数据,但却发现数据未能实时更新。
经过分析,我们发现开源版本的元数据缓存刷新周期较长,支持库表级别和分区级别的定期刷新,但该刷新周期可能长达 1-3 小时,导致数据更新滞后。此外,范围查找缓存机制影响了精确查找的查询效率,使部分查询无法及时获取最新数据。
针对这一问题,我们自研了一套优化后的元数据缓存方案,并计划通过配置开关的方式贡献至社区。优化后的方案大幅缩短了元数据的刷新时间至 5 分钟内,确保数据能够更快更新。同时,我们调整了查询缓存策略,使范围查找和精确查找(为空)不再缓存,以保证查询结果的准确性。此外,在 get_partitions_by_names 方法的优化上,我们采用了多线程查询,有效提升了大跨度查询的性能。
该优化方案上线后,成功解决了元数据查询的性能问题,同时确保了查询结果的一致性。
语法兼容在语法兼容性方面,我们采用了一套自研解决方案,目前 Presto 语法兼容性已达到 100%,确保用户可以无缝迁移。对于 Spark 语法,我们的目标是实现 90% 以上的兼容性,目前已达到 85%,仍在持续优化中,以进一步提升兼容能力。
在 Paimon 兼容优化 方面,我们在 StarRocks 3.2.5 版本中,将 Paimon 0.7.0 客户端升级至 0.9.0,引入了 Caching Catalog 机制。升级后,Paimon 在并发查询和单次查询场景下,性能均提升 5 倍,大幅优化了查询效率和系统稳定性。
内表&异步物化视图工作
在高性能多表 JOIN 查询 场景下,ClickHouse 无法满足我们的需求,同时我们还需要支持低时延数据摄入,频繁的数据更新与删除,以及物化视图的多层 ETL 清洗和加工。此外,我们希望实现湖仓表与内表的联邦查询,以提升查询效率并优化数据处理流程。
在研发工作方面,我们主要开展了三项关键优化:
首先,我们将 StarRocks 从 3.2.5 版本升级至 3.3.5,解决了库锁和死锁问题,并优化了物化视图的刷新逻辑,使其支持多事实表刷新。此优化上线后,成功解决了某业务场景中的长期问题,系统现已稳定运行。此外,我们修复了部分物化视图改写问题,并引导用户使用分区刷新策略,降低刷新频率,以提高系统整体性能。
其次,我们基于 3.3.5 版本,构建了 物化视图测试方案,并整理了相关的使用样例与指导手册,帮助用户更高效地利用物化视图功能。
StarRocks 组件建设
StarRocks 组件建设共分为三个阶段:基础能力建设、稳定性建设和运营指标建设。
基础能力建设
-
在版本管理上,我们选择3.2.5作为集群版本,版本代码在 GitLab 中维护。认证与鉴权利用大数据研发治理平台的鉴权系统、公司的权限系统以及 Hive 鉴权,实现了统一的认证机制。
-
关于功能管理,相比 Presto ,StarRocks 拥有更强大的功能集。但在项目初期,我们选择仅开放查询功能,并对DDL和DML操作加以限制,以降低误操作对集群稳定性的影响。后续,将通过内部平台化的流程管理和逐步解禁这些功能。
-
我们的目标是在SQL兼容性支持上,构建围绕 StarRocks 、Trino 和 Spark 为核心的统一语法体系,从而实现更流畅的互操作性和更高的开发效率。
稳定性建设
-
采用 systemd 进行进程管理,确保进程异常退出后能够自动拉起,并配备监控脚本进行启停监测。系统可在进程崩溃时触发告警并自动恢复。同时,具备自动化 crash 监测与恢复能力,能够识别 BE 进程异常并进行分析和修复。目前 BE crash 发生率较低,但仍保持持续监测。
-
在监控告警体系中,依托主机级告警与 Grafana 监控,初期设定较低的告警阈值,以便及时发现潜在问题,并在优化过程中逐步调整至合理范围。
运营指标建设
-
注重平台化管理。研发人员及数据产品经理可通过统一平台完成建库、建表及物化视图创建等操作,以提升管理规范性。StarRocks 兼容内表、外表,并支持 Hive 和 Paimon。因此,对日报、周报、月报等运营指标进行分类管理,并定期(每周或每季度)进行分析和优化。
-
在审计日志管理上,我们基于开源审计日志框架进行了扩展,新增了记录用户查询唯一ID、查询用户和查询属性等关键字段。系统自动保存慢查询的Profile,并记录HMS接口调用(例如 getTable 、getPartition )及其相关的性能指标。此外,我们还对存储数据的性能进行了统计分析,旨在发现可能的性能瓶颈并优化资源配置。所有成功落地的优化方案都会被归档,为后续 StarRocks 相关功能的推广提供支持。
此外,基于业务需求,我们开发了一些重要的自研功能。由于手机厂商对用户信息的高度安全性要求,所有内部数据都采用加密字段存储。为了让 StarRocks 能够替代 Presto 和 Spark 的部分能力,必须支持对加密数据的读取与处理。为此,我们在BE模块中对Apache ORC的版本进行了优化,使其能够通过密钥读取Hive中的加密字段。此功能的实现加快了 StarRocks 在数据分析场景下替代Presto的进度。
引入 StarRocks 的效果和收益
即席分析切换历程
在介绍即席分析的收益之前,先回顾整个切换过程。
-
2024年1月:切换专项成立进行价值分析与目标讨论,明确即席分析切换的核心目标和工作计划。
-
2月-3月:性能攻关阶段
解决 ORC 格式 Hive 表的功能及性能问题。
进行 HDFS 慢节点分析与优化。
重放SQL快速测试能力建设。
解决结果一致性问题,并进行双跑测试。
-
4月:灰度 5% 阶段
使用 StarRocks 3.2.5 版本进行灰度测试。
处理兼容性问题,部分回滚至 Presto。
上线内部认证与鉴权方案。
-
5月:灰度 50% 阶段
ORC 解密上线。
成本账单方案上线。
查询性能优化,兼容性提升至 97%。
-
6月-7月:灰度 100% 阶段
Presto 正式下线,StarRocks 作为核心分析引擎。
解决 Spark 常用函数兼容问题。
-
8月至今:StarRocks 查询占比持续提升
查询占比从 40% 提升至约 70%-80%。
落地 HMS 元数据缓存优化方案。
资源隔离方案逐步实施。
解决 BE 内存熔断与查询超时问题。
即席分析引入 StarRocks 收益
在即席分析场景中,StarRocks 的使用占比已达到 70%,相较于 Spark(占比 30%),在查询性能和稳定性方面展现出显著优势。P50 耗时方面,StarRocks 取得了革命性的优化,从 7 月份的 63.77 秒缩短至 22.30 秒,效率提升 65.06%,整体查询速度提升了 3 倍。
目前,数据趋势呈下降态势,我们预计在 StarRocks 占比提升至 80% 后,P50 耗时将实现 4 至 5 倍的性能提升。此外,与 Presto 相比,StarRocks 在查询稳定性方面更具优势,查询成功率已接近 98%,显著减少了查询失败的情况。
敏捷 BI 引入 StarRocks 收益
在敏捷 BI 领域,我们已完成 25% 的切换,月均查询成功数超过 25 万次,查询成功率稳定在 99% 以上。目前,StarRocks 已覆盖 12 个业务领域,支撑超过 600+ 用户,并大幅优化查询效率:
-
慢查询(>30 秒)从 2.99% 降低至 1.32%
-
P90 查询时长降至 5 秒以内,相比 Presto 的 16 秒,提升 75%,整体性能提升 4 倍
该优化仍在持续推进,我们预计随着 StarRocks 的进一步优化和应用,查询性能和稳定性将得到更大提升。
即席分析是我们在查询性能优化方面面临挑战最大的项目,而敏捷 BI 则是我们覆盖业务范围最广的项目。这两个项目的成功让我们更加坚定地推进 StarRocks 的应用,我们有信心将其它 Presto 相关项目全面迁移 StarRocks,进一步提升整体查询性能和系统稳定性。
研发工具平台引入 StarRocks 的收益
在研发工具平台中,我们成功构建了 准实时业务库,使数据从写入到报表可见的时间缩短至 3 分钟以内,相比之前的 数小时甚至 T+1 级别,数据可用性大幅提升。
我们基于 物化视图 实现了数据分层和加工逻辑,开发效率提升约 30%。这一数据是较为保守的估计,随着用户对流程的熟悉度提升,预计 效率提升可达 50% 以上。过去,用户开发报表需要编写大量 Java 代码,而现在,仅需配置实时任务并创建物化视图,即可完成报表开发,极大降低了开发成本。
在数据处理方面,我们通过 Flink CDC 实现数据的准实时写入,所有需求任务的变更会实时同步至 StarRocks ODS 层基表,并通过多个物化视图逐步流转至 DW 层、DM 层、DA 层、ADS 层,最终为用户提供高效的报表查询能力。借助 StarRocks 的查询加速,P95 查询延迟降低至 400 毫秒。此外,Flink 与 StarRocks 的双链路融合进一步提升了准实时度量能力。
该项目在公司内部获得了高度认可。作为研发工具平台能力建设的重要组成部分,其成功落地有效推动了降本增效,进一步提升了企业数据基础设施的价值。
StarRocks在vivo大数据平台的未来规划
Presto 集群切换规划
我们计划于 2024 年 12 月 完成 Presto 至 StarRocks 迁移的 30%,目前已完成 25%。由于前期迁移涉及流程梳理和技术攻坚,进展较为缓慢,但后续预计会加速推进。2025 年 6 月,StarRocks 的迁移占比预计达到 80%,年底前完成 100% 迁移。
我们将在迁移过程中持续优化 StarRocks on K8s 的能力,并总结敏捷 BI 和即席分析的实践经验,推广至更广泛的业务场景。最终,我们计划将 广告、AI、DMP 等业务的 Presto 集群 逐步替换为 StarRocks。基于即席分析和敏捷 BI 项目的成功经验,我们对全面替换 Presto 充满信心。
研发工作规划
1. 存算分离架构引入
当前架构仍采用存算一体模式,未来将逐步引入 对象存储,并结合 K8s 相关部署优化。
2. 兼容性开发
持续增强 SQL 兼容性,目标是 100% 兼容 Presto 语法、100% 兼容 Spark 函数、90% 兼容 Spark 语法,并弱化 SQL 方言差异,统一支持 StarRocks、Presto 和 Spark 语法。
3. 综合资源隔离方案
现已在开源版本中引入大查询熔断、多资源组件软隔离等方案,后续将升级至 3.3.5 版本,利用 CG Group 硬隔离机制,同时探索 FE 路由多 BE 组群能力,实现更精细的集群资源隔离。
4. 元数据综合方案
计划引入分布式缓存架构替代当前本地缓存,以提高 FE 的水平扩展能力,减少对 HMS 的并发压力。
5. 异步物化视图
联合湖仓一体团队推动异步物化视图发展,并探索构建智能物化视图系统,实现自动创建、自动加速。
6. 运维能力建设
优化运维平台,提升集群启停管理能力,同时增强集群稳定性,提高组件在企业内部的长期可用性。
7. 开源贡献
持续向社区贡献自研特性,并积极参与社区优秀特性的功能开发,以更好地拥抱开源和回馈开源。
更多交流,联系我们:StarRocks
相关文章:
vivo 湖仓架构的性能提升之旅
作者:郭小龙 vivo互联网 大数据高级研发工程师 导读:本文整理自 vivo互联网 大数据高级研发工程师 郭小龙 在 StarRocks 年度峰会上的分享,聚焦 vivo 大数据多维分析面临的挑战、StarRocks 落地方案及应用收益。 在 即席分析 场景,…...
常见中间件漏洞攻略-Tomcat篇
一、 CVE-2017-12615-Tomcat put方法任意文件写入漏洞 第一步:开启靶场 第二步:在首页抓取数据包,并发送到重放器 第三步:先上传尝试一个1.txt进行测试 第四步:上传后门程序 第五步:使用哥斯拉连接 二、后…...
基于linuxC结合epoll + TCP 服务器客户端 + 数据库实现一个注册登录功能
1. 整体功能概述 实现了一个简单的用户注册和登录系统,采用客户端 - 服务器(C/S)架构。 客户端可以选择注册或登录操作,将用户名和密码发送给服务器,服务器接收请求后处理并返回相应的结果给客户端。 服务器使用 SQLit…...
redis7.4.2单机配置
解压源码包 将从官网下载的redis源码压缩包上传到服务器的相关目录下。 [roothcss-ecs-2851 ~]# cd /opt/soft/redis/ [roothcss-ecs-2851 redis]# ls redis-stable.tar.gz解压并进入解压后的目录中。 [roothcss-ecs-2851 redis]# tar -zxvf redis-stable.tar.gz [roothcss-…...
Unity代码热更新和资源热更新
知识点来源:人间自有韬哥在,hybridclr,豆包 目录 一、代码热更新1.代码热更新概述2.HybridCLR 二、资源热更新1.资源热更新概述2.AB包2.1.AB包的加载2.2.卸载AB包2.3.加载AB包依赖包2.4.获取MD52.5.生成对比文件2.6.更新AB包 3.Addressable3.1.AssetRef…...
【MySQL篇】DEPENDENT SUBQUERY(依赖性子查询)优化:从百秒到秒级响应的四种优化办法
💫《博主介绍》:✨又是一天没白过,我是奈斯,从事IT领域✨ 💫《擅长领域》:✌️擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控;并对SQLserver、NoSQL(…...
腾讯四面面经
说明 是的,没听错,确实是腾讯四面,而且是技术面。先声明下,这个面经是帮朋友整理的,都是真实的面经,不得不说,四面确实是有强的的,接下来让我们一起看下 面试部门:s3&a…...
【mysql】唯一性约束unique
文章目录 唯一性约束 1. 作用2. 关键字3. 特点4. 添加唯一约束5. 关于复合唯一约束 唯一性约束 1. 作用 用来限制某个字段/某列的值不能重复。 2. 关键字 UNIQUE3. 特点 同一个表可以有多个唯一约束。唯一约束可以是某一个列的值唯一,也可以多个列组合的值唯…...
如何理解前端工程化
前端工程化详解 一、 定义二、特点1. 模块化2. 组件化3. 自动化4. 规范化 三、涉及环节1. 项目架构2. 版本控制:3.自动化构建4.任务自动化5. 部署与CI/CD 五、 前端工程化的实际应用六、前端工程化的优势:七、总结 一、 定义 前端工程化是指将前端开发…...
嵌入式八股RTOS与Linux---进程间的通信与同步篇
前言 同步异步、阻塞/非阻塞是什么? 同步:在执行某个操作时,调用者必须等待该操作完成并返回结果后,才能继续执行后续的操作异步:在执行某个操作时,调用者发起操作后不必等待其完成,可以立即继续执行后续的操作。操作完成后&am…...
this.centerDialogVisible = true this.$nextTick(()=>{ this.resetForm(); })
这段代码的作用是 打开一个对话框,并在对话框打开后 重置表单。下面是对这段代码的详细解析: 1. 代码作用 this.centerDialogVisible true:控制对话框的显示。this.$nextTick(() > { ... }):在 DOM 更新后执行回调函数&#…...
datawhale组队学习--大语言模型—task4:Transformer架构及详细配置
第五章 模型架构 在前述章节中已经对预训练数据的准备流程(第 4 章)进行了介绍。本章主 要讨论大语言模型的模型架构选择,主要围绕 Transformer 模型(第 5.1 节)、详细 配置(第 5.2 节)、主流架…...
专业级 AI 提示生成工具清单
1. 引言 近年来,随着 GPT-3、GPT-4 等大规模预训练语言模型的广泛应用,提示(Prompt)工程作为驱动模型输出质量的重要环节,受到了各界的高度关注。精心设计、管理与优化提示,不仅能够大幅提高生成文本的准确…...
Web前端考核 JavaScript知识点详解
一、JavaScript 基础语法 1.1 变量声明 关键字作用域提升重复声明暂时性死区var函数级✅✅❌let块级❌❌✅const块级❌❌✅ 1.1.1变量提升的例子 在 JavaScript 中,var 声明的变量会存在变量提升的现象,而 let 和 const 则不会。变量提升是指变量的声…...
23种设计模式-生成器(Builder)设计模式
工厂方法设计模式 🚩什么是生成器设计模式?🚩生成器设计模式的特点🚩生成器设计模式的结构🚩生成器设计模式的优缺点🚩生成器设计模式的Java实现🚩代码总结🚩总结 🚩什么…...
Thinkphp(TP)框架漏洞攻略
1.环境搭建 vulhub/thinkphp/5-rce docker-compose up -d 2.访问靶场 远程命令执行: ? sindex/think\app/invokefunction&functioncall_user_func_array&vars[0]system&vars[1] []whoami 远程代码执行: ? s/Index/\think\app/invokefunc…...
HTTP/HTTPS 中 GET 请求和 POST 请求的区别与联系
一、基础概念 HTTP (HyperText Transfer Protocol, 超文本传输协议) 是一种用于浏览器与服务器之间进行数据交互的协议。HTTPS (加密的 HTTP) 则通过 SSL/TLS 协议实现通信加密与数据安全性。 二、GET 和 POST 概述 GET 请求: 用于从服务器获取资源。 POST 请求: 用于将数据…...
2021年蓝桥杯第十二届CC++大学B组真题及代码
目录 1A:空间(填空5分_单位转换) 2B:卡片(填空5分_模拟) 3C:直线(填空10分_数学排序) 4D:货物摆放(填空10分_质因数) 5E…...
解锁 AWX+Ansible 自动化运维新体验:快速部署实战
Ansible 和 AWX 是自动化运维领域的强大工具组合。Ansible 是一个简单高效的 IT 自动化工具,而 AWX 则是 Ansible 的开源 Web 管理平台,提供图形化界面来管理 Ansible 任务。本指南将带你一步步在 Ubuntu 22.04 上安装 Ansible 和 AWX,使用 M…...
简洁、实用、无插件和更安全为特点的WordPress主题
简站WordPress主题是一款以简洁、实用、无插件和更安全为特点的WordPress主题,自2013年创立以来,凭借其设计理念和功能优势,深受用户喜爱。以下是对简站WordPress主题的详细介绍: 1. 设计理念 简站WordPress主题的核心理念是“崇…...
区块链学习总结
Hardhat 是一个用于 Ethereum 智能合约开发 的开发环境,专为 Solidity 语言编写的智能合约提供工具支持。它能够帮助开发者 编译、部署、测试和调试 智能合约,并提供一个本地的以太坊测试网络。 Hardhat 的核心功能 本地开发网络(Hardhat Ne…...
可发1区的超级创新思路(python\matlab实现):基于周期注意力机制的TCN-Informer时间序列预测模型
首先声明,该模型为原创!原创!原创!且该思路还未有成果发表,感兴趣的小伙伴可以借鉴! 一、应用场景 该模型主要用于时间序列数据预测问题,包含功率预测、电池寿命预测、电机故障检测等等 二、模型整体介绍(本文以光伏功率预测为例) 1.1 核心创新点 本模型通过三阶段…...
案例4:鸢尾花分类(pytorch)
一、引言 鸢尾花分类是机器学习领域的经典案例,常用于演示分类算法的基本原理和应用。本案例使用 PyTorch 构建一个简单的神经网络模型,对鸢尾花进行分类。通过该案例,我们可以学习如何使用 PyTorch 进行数据处理、模型构建、训练和评估&…...
本地部署Stable Diffusion生成爆火的AI图片
直接上代码 Mapping("/send") Post public Object send(Body String promptBody) { JSONObject postSend new JSONObject(); System.out.println(promptBody); JSONObject body JSONObject.parseObject(promptBody); List<S…...
CCF-CSP历年真题答案1,2
本文代码主要来自up主圣斗士-DS-ALGO对历年真题的讲解,在此特别感谢。 侵权则删。 10.1_分蛋糕_2017_03 #include <iostream> using namespace std;int main() {int a[1000], n, k; // 定义数组a用于存储蛋糕的重量,整数n表示蛋糕的数量…...
【MySQL】一篇讲懂什么是聚簇索引和非聚簇索引(二级索引)以及什么是回表?
1.聚簇索引: 叶子节点直接存储了完整的数据行。 每个表只能有一个聚簇索引,通常是主键(Primary Key)。如果没有定义主键,则MySQL会选择一个唯一且非空索引作为聚簇索引。 特点: 数据存储:叶子结点存储完整的数据行…...
炫酷的HTML5粒子动画特效实现详解
炫酷的HTML5粒子动画特效实现详解 这里写目录标题 炫酷的HTML5粒子动画特效实现详解项目介绍技术栈项目架构1. HTML结构2. 样式设计 核心实现1. 粒子类设计2. 动画效果实现星空效果烟花效果雨滴效果 3. 鼠标交互 性能优化效果展示总结 项目介绍 本文将详细介绍如何使用HTML5 C…...
go-zero学习笔记
内容不多,只有部分笔记,剩下的没有继续学下去,包括路由与处理器、日志中间件、请求上下文 文章目录 1、go-zero核心库1.1 路由与处理器1.2 日志中间件1.3 请求上下文 1、go-zero核心库 1.1 路由与处理器 package mainimport ("github…...
QuecPython 网络协议之TCP/UDP协议最祥解析
概述 IP 地址与域名 IP 地址是网络中的主机地址,用于两台网络主机能够互相找到彼此,这也是网络通信能够成功进行的基础。IP 地址一般以点分十进制的字符串来表示,如192.168.1.1。 我们日常访问的网站,其所在的服务器主机都有…...
FPGA_YOLO(二)
上述对cnn卷积神经网络进行介绍,接下来对YOLO进行总结,并研究下怎么在FPGA怎么实现的方案。 对于一个7*7*30的输出 拥有49个cell 每一个cell都有两个bbox两个框,并且两个框所包含的信息拥有30个 4个坐标信息和一个置信度5个,剩下就是20个类别。 FPGA关于YOLO的部署 1…...
Camera2 与 CameraX 闲谈
目录 📂 前言 1. 🔱 Camera2 2. 🔱 CameraX 3. 🔱 Camera2 与 CameraX 1)使用复杂度与开发效率 2)控制能力与应用场景 3)设备兼容性与稳定性 4)更新与维护 4. 💠…...
【零基础入门unity游戏开发——2D篇】2D物理系统 —— 2D刚体组件(Rigidbody 2d)
考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的…...
【论文#目标检测】YOLO9000: Better, Faster, Stronger
目录 摘要1.引言2.更好(Better)3.更快(Faster)4.更健壮(Stronger)使用 WordTree 组合数据集联合分类和检测评估 YOLO9000 5.结论 Author: Joseph Redmon; Ali Farhadi Published in: 2017 IEEE Conference …...
C++异常处理时的异常类型抛出选择
在 C 中选择抛出哪种异常类型,主要取决于错误的性质以及希望传达的语义信息。以下是一些指导原则,帮助在可能发生异常的地方选择合适的异常类型进行抛出: 1. std::exception 适用场景:作为所有标准异常的基类,std::e…...
centos 7 搭建FTP user-list用户列表
在 CentOS 7 上搭建基于 user_list 的 FTP 用户列表,你可以按以下步骤操作: 1. 安装 vsftpd 服务 若还未安装 vsftpd,可以使用以下命令进行安装: bash yum install -y vsftpd2. 启动并设置开机自启 vsftpd 服务 bash systemctl…...
vulnhub-Tr0ll ssh爆破、wireshark流量分析,exp、寻找flag。思维导图带你清晰拿到所以flag
vulnhub-Tr0ll ssh爆破、wireshark流量分析,exp、寻找flag。思维导图带你清晰拿到所以flag 1、主机发现 arp-scan -l 2、端口扫描 nmap -sS -sV 192.168.66.185 nmap -sS -A -T4 -p- 192.168.66.185 nmap --scriptvuln 192.168.66.185经典扫描三件套,…...
k8s中service概述(二)NodePort
NodePort 是 Kubernetes 中一种用于对外暴露服务的 Service 类型。它通过在集群的每个节点上开放一个静态端口(NodePort),使得外部用户可以通过节点的 IP 地址和该端口访问集群内部的服务。以下是关于 NodePort Service 的详细说明࿱…...
搭建Redis哨兵集群
停掉现有的redis集群 因为这篇文章我是在 搭建完redis主从集群之后写的,如果要是没有搭建过这些,可以直接略过。要是从我上一篇 搭建redis主从集群过来的,可以执行下。 docker compose down 查找下redis相关进程 ps -ef | grep redis 可以看…...
.Net SSO 单点登录方式
SSO单点登录目的 之前一般来讲系统简单,登录后 本地 cookie 加服务器 session 存储用户身份信息,以此为依据来判断用户再次登录时免验证 但随着互联网发展,很多应用 部署在不同的服务器上,而用户体系是一套,那么按照原…...
SQL 基础 BETWEEN 的常见用法
在SQL中,BETWEEN是一个操作符,用于选取介于两个值之间的数据。 它包含这两个边界值。BETWEEN操作符常用于WHERE子句中,以便选取某个范围内的值。 以下是BETWEEN的一些常见用法: 选取介于两个值之间的值: 使用 BETWE…...
ngx_http_add_location
声明在 src\http\ngx_http_core_module.c ngx_int_t ngx_http_add_location(ngx_conf_t *cf, ngx_queue_t **locations,ngx_http_core_loc_conf_t *clcf); 定义在 src\http\ngx_http.c ngx_int_t ngx_http_add_location(ngx_conf_t *cf, ngx_queue_t **locations,ngx_http…...
深入探索ArkUI中的@LocalBuilder装饰器:构建高效可维护的UI组件
在ArkUI框架中,组件化开发是提升代码复用性和维护性的关键手段。随着项目复杂度的增加,开发者常常面临如何在保持组件封装性的同时,灵活处理组件内部逻辑的问题。传统的Builder装饰器虽然提供了强大的自定义构建能力,但在某些场景…...
视频知识库初步设想
将视频字幕提取出来作为知识库来源定位,下一步设想:把视频上的图片信息也精简出来作为定位。 下面是测试例子: 入参: {"model":"deepseek-ai/DeepSeek-R1-Distill-Llama-8B","messages":[{"role":"system","cont…...
微信小程序中使用Less样式方法
在微信小程序中使用Less样式,可以通过以下步骤实现。主要原理是借助Visual Studio Code(VSCode)的插件将Less文件自动编译为小程序支持的.wxss文件,或通过微信开发者工具的扩展功能直接集成Less编译环境。以下是具体方法ÿ…...
2024年MathorCup数学建模A题移动通信网络中PCI规划问题解题全过程文档加程序
2024年第十四届MathorCup高校数学建模挑战赛 A题 移动通信网络中PCI规划问题 原题再现: 物理小区识别码(PCI)规划是移动通信网络中下行链路层上,对各覆盖小区编号进行合理配置,以避免PCI冲突、PCI混淆以及PCI模3干扰等现象。PCI规划对于减少…...
本周安全速报(2025.3.18~3.24)
合规速递 01 2025欧洲网络安全报告:DDoS攻击同比增长137%,企业应如何应对? 原文: https://hackread.com/european-cyber-report-2025-137-more-ddos-attacks/ 最新的Link11《欧洲网络安全报告》揭示了一个令人担忧的趋势:DDo…...
力扣刷题-热题100题-第23题(c++、python)
206. 反转链表 - 力扣(LeetCode)https://leetcode.cn/problems/reverse-linked-list/solutions/551596/fan-zhuan-lian-biao-by-leetcode-solution-d1k2/?envTypestudy-plan-v2&envIdtop-100-liked 常规法 记录前一个指针,当前指针&am…...
YAML是什么?
YAML(YAML Ain’t Markup Language)是一种以数据为中心、高度可读的序列化语言,广泛应用于配置文件、数据交换和自动化工具中。以下从多个维度对其进行全面解析: 1. 定义与历史演变 全称与定位: YAML的全称最初为“Yet…...
期权交易投资怎么操作?新手期权操作指南
期权就是股票,唯一区别标的物上证指数,会看大盘吧,新手做期权交易两个方向认购做多,认沽做空,双向t0交易没了,跟期货一样,对的,玩的也是合约,唯一区别没有保证金不会爆仓…...
音视频学习(三十):fmp4
FMP4(Fragmented MP4)是 MP4(MPEG-4 Part 14)的扩展版本,它支持流式传输,并被广泛应用于DASH(Dynamic Adaptive Streaming over HTTP)和HLS(HTTP Live Streaming…...