当前位置: 首页 > news >正文

Android调用springboot接口上传大字段,偶现接口超时的优化

介绍

最近有个功能,Android通过okhttp上传实体类,实体类包含一个大字段,上传的字符串长度达到300k,偶现接口超时的情况,大概100次有5次,看日志发现数据并没有到达接口,可能在网络传输中就超时了

优化1

​​直接接收对象:

    @ApiOperation(value = "插入主动测量记录")@PostMapping("/insertMeasureRecord")public Result insertMeasureRecord(@RequestBody LomeRingMeasureRecords lomeRingMeasureRecords ){return iRingAppService.insertMeasureRecord(lomeRingMeasureRecords);}

刚开始是这样接收的,后来优化成流式解析
流式解析:

  @Overridepublic Result insertMeasureRecordRequest(HttpServletRequest request) {// 1. 使用流式读取避免内存爆炸try (InputStream is = request.getInputStream();Reader reader = new InputStreamReader(is, StandardCharsets.UTF_8)) {// 2. 带超时的JSON解析CompletableFuture<LomeRingMeasureRecords> future = CompletableFuture.supplyAsync(() -> {return JSON.parseObject(reader, LomeRingMeasureRecords.class);});LomeRingMeasureRecords records = future.get(15, TimeUnit.SECONDS); // 15秒超时// 3. 继续原有处理逻辑return Result.ok(lomeRingMeasureRecordsService.insertMeasureRecords(records));} catch (TimeoutException e) {return Result.fail(ResultsCode.REQUEST_FAILED);} catch (Exception e) {return Result.fail(ResultsCode.REQUEST_FAILED);}}

优化2

即使修改成这样,还是偶现超时,所以对大字段进行了压缩,然后服务端进行解压
Android部分

public static Observable<JsonResult> insertMeasureRecord(String mac,String value,String testType,String filePath,String fileName,String label,String waveForm) {Log.i("waveForm size",waveForm.length()+"");String compressString="";try {compressString = DataCovertUtils.compressString(waveForm);} catch (IOException e) {e.printStackTrace();}Log.i("compressString size",compressString.length()+"");Map<String, Object> map = new HashMap<>();map.put("mac", mac);map.put("value", value);map.put("testType", testType);map.put("filePath", filePath);map.put("fileName", fileName);map.put("label", label);map.put("compressedWaveForm", compressString);return ServerAPIClient.getApi().insertMeasureRecord(map).subscribeOn(Schedulers.io()).unsubscribeOn(Schedulers.io()).observeOn(AndroidScheduler.mainThread());}
  // GZIP压缩字符串public  static String compressString(String str) throws IOException {if (str == null || str.isEmpty()) {return str;}ByteArrayOutputStream out = new ByteArrayOutputStream();try (GZIPOutputStream gzip = new GZIPOutputStream(out)) {gzip.write(str.getBytes(StandardCharsets.UTF_8));}return Base64.encodeToString(out.toByteArray(), Base64.NO_WRAP);}

然后springboot解压

 @Overridepublic Result insertMeasureRecordRequest(HttpServletRequest request) {try (InputStream is = request.getInputStream();Reader reader = new InputStreamReader(is, StandardCharsets.UTF_8)) {LomeRingMeasureRecords records = JSON.parseObject(reader, LomeRingMeasureRecords.class);// 解压处理if (records.getCompressedWaveForm() != null ) {try {String decompressed = decompressString(records.getCompressedWaveForm());records.setWaveForm(decompressed);} catch (IOException e) {// 解压失败记录日志,保持原数据log.error("解压waveForm失败", e);return Result.fail(ResultsCode.REQUEST_FAILED);}}return Result.ok(lomeRingMeasureRecordsService.insertMeasureRecords(records));} catch (Exception e) {log.error("处理测量记录请求失败", e);return Result.fail(ResultsCode.REQUEST_FAILED);}}// GZIP解压字符串private String decompressString(String compressedStr) throws IOException {if (compressedStr == null || compressedStr.isEmpty()) {return compressedStr;}byte[] compressed = Base64.getDecoder().decode(compressedStr);ByteArrayInputStream bis = new ByteArrayInputStream(compressed);GZIPInputStream gis = new GZIPInputStream(bis);// 使用ByteArrayOutputStream直接读取所有字节ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len;while ((len = gis.read(buffer)) > 0) {baos.write(buffer, 0, len);}// 转换为字符串,保留原始换行符String result = baos.toString(StandardCharsets.UTF_8.name());gis.close();bis.close();baos.close();return result;}

这样原字段大概是300k,然后压缩完是55k,之前接口返回是3s,修改完是2.5s,因为涉及到python计算,没办法再提高了

疑问

按理说,字段没超过1M,不应该出现超时的情况,根本没有到达接口,可能还是网络问题

场景化建议

  1. ​​推荐使用​直接接收对象的场景​​
    字段大小​​<1MB​​且结构固定(如普通表单数据)。
    需要快速开发,减少手动编码量。
    服务端内存充足(如JVM堆内存>2GB)。
  2. ​​推荐使用流式解析的场景​​
    字段大小​​>10MB​​或包含压缩数据(如音频、视频、科学计算数据)。
    需要支持​​分片传输​​或​​断点续传​​(如大文件上传)。
    服务端内存受限(如云函数环境)

性能关键点分析

  1. ​​数据解析性能​​
    ​​方式1(对象绑定)​​:
    依赖Jackson或Gson等库的优化解析,实测1MB JSON数据解析耗时约​​5-20ms​​(Spring Boot默认配置)。
    ​​瓶颈​​:大字段(如10MB+)可能导致堆内存压力和GC停顿。
    ​​方式2(流式解析)​​:
    使用BufferedReader逐行读取或JSONReader流式解析,1MB数据耗时约​​2-8ms​​(分块处理减少内存峰值)。
    ​​优势​​:避免一次性加载大对象到内存,适合处理​​压缩数据流​​或​​分片传输​​场景。
  2. ​​内存与GC影响​​
    ​​方式1​​:
    若字段包含大文本或二进制数据(如压缩后的波形数据),可能直接导致​​堆内存溢出​​(默认堆大小约128MB-1GB)。
    ​​示例​​:10MB的compressedWaveForm字段会占用约​​20MB堆内存​​(含对象头和引用)。
    ​​方式2​​:
    流式处理可将内存占用控制在​​常量级别​​(如分块读取时每次仅加载64KB),适合处理​​超大数据流​​(如50MB+的压缩文件)
  3. ​​压缩数据处理​​
    ​​方式1的缺陷​​:
    若字段已压缩(如GZIP),直接反序列化会触发​​二次解压​​(框架先解压到临时文件或内存,再解析JSON),导致​​CPU和内存双重消耗​​。
    ​​实测​​:10MB GZIP数据全量解压后约25MB,解析耗时增加50%。
    ​​方式2的优化​​:
    可在流式解析中​​直接处理压缩流​​(如GZIPInputStream),避免中间数据存储,节省50%以上CPU和内存。

性能测试数据参考

在这里插入图片描述

相关文章:

Android调用springboot接口上传大字段,偶现接口超时的优化

介绍 最近有个功能&#xff0c;Android通过okhttp上传实体类&#xff0c;实体类包含一个大字段&#xff0c;上传的字符串长度达到300k&#xff0c;偶现接口超时的情况&#xff0c;大概100次有5次&#xff0c;看日志发现数据并没有到达接口&#xff0c;可能在网络传输中就超时了…...

[特殊字符]【Qt自定义控件】创意开关按钮 - 丝滑动画+自定义样式+信号交互 | 附完整源码

话不多说直接上代码 1、.mybutton.h #ifndef MYBUTTON_H #define MYBUTTON_H#include <QWidget> #include <QPropertyAnimation>class MyButton : public QWidget {Q_OBJECT public:explicit MyButton(QWidget *parent nullptr);protected:void paintEvent(QPain…...

大数据开发的基本流程

大数据开发通常围绕数据的“采集 → 存储 → 处理 → 分析 → 展示”几个阶段来展开。下面是一个典型的大数据开发基本流程&#xff08;适用于离线或实时场景&#xff09;&#xff1a; 一、数据采集&#xff08;Data Ingestion&#xff09; 目标&#xff1a;从各种来源采集原始…...

关于创建UNIX/Linux daemon进程的笔记

Linux daemon程序简单说就是Linux后台服务进程。 传统的、标准的创建方法&#xff1a;2次fork setsid 详细步骤 进程1&#xff08;父进程&#xff09;调用fork&#xff0c;创建子进程2&#xff0c;进程1退出。 1&#xff09;这个步骤是为第二部做铺垫。 2&#xff09;此时&a…...

国产紫光同创FPGA实现SDI视频编解码,基于HSSTHP高速接口,提供3套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目本博已有的 SDI 编解码方案本方案在Xilinx--Artix7系列FPGA上的应用本方案在Xilinx--Kintex系列FPGA上的应用本方案在Xilinx--Zynq系列FPGA上的应用本方案在Xilinx--U…...

Oracle--SQL性能优化与提升策略

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、导致性能问题的内在原因 系统性能问题的底层原因主要有三个方面&#xff1a; CPU占用率过高导致资源争用和等待内存使用率过高导致内存不足并需…...

drupal7可以从测试环境一键部署到生产环境吗

Drupal 7 本身并没有“内建的一键部署功能”&#xff0c;所以“从测试环境一键部署到生产环境”不能完全自动化完成&#xff0c;尤其是涉及数据库、配置和文件系统时。但你可以通过一些工具和方法实现接近“一键部署”的效果 ✅ &#x1f6a7; 为什么不能直接一键部署&#xff…...

vue项目中axios统一或单独控制接口请求时间

先说统一 这里将请求时间统一控制在12秒 // 使用由库提供的配置的默认值来创建实例 // 此时超时配置的默认值是 0 const axiosInstance axios.create()// 覆写库的超时默认值 // 现在&#xff0c;在超时前&#xff0c;所有请求时间统一控制在10秒 axiosInstance.defaults.ti…...

chromedp 反反爬设计方案

二、基础防护层实现 1. 浏览器特征伪装 opts : append(chromedp.DefaultExecAllocatorOptions[:],// 禁用自动化特征chromedp.Flag("disable-blink-features", "AutomationControlled"),chromedp.Flag("useAutomationExtension", false),// 随…...

OpenLDAP 管理 ELK 用户

文章目录 一、新建 ELK 相关用户组二、配置 Elasticsearch2.1 修改 elasticsearch.yml 配置2.2 使用 API 接口建立角色和用户映射 三、Kibana 验证用户登录 一、新建 ELK 相关用户组 由于后续要将 LDAP 的用户与 ELK 的角色进行映射&#xff0c;所以需先创建几个以 ELK 的角色…...

深度解析MQTT源码架构与AIGC场景融合实战

一、结构体内存优化&#xff1a;支撑千万级设备连接 1.1 紧凑内存布局设计 classDiagramclass MQTTClient_message {char struct_id[4]int struct_versionvoid* payloadint payloadlenint qosint retainedint dupint msgidMQTTProperties properties}note for MQTTClient_mes…...

Node.js 操作 ElasticSearch 完整指南:从安装到实战

本文将手把手教你如何搭建 ElasticSearch 环境&#xff0c;并通过 Node.js 实现高效数据检索。包含 10 个可直接复用的代码片段&#xff0c;助你快速掌握搜索、聚合等核心功能&#xff01; 环境搭建篇 1. ElasticSearch 安装要点 下载 es下载连接 下载下来后&#xff0c;进…...

Python+区块链:如何打造智能化资产管理系统?

Python+区块链:如何打造智能化资产管理系统? 在当今数字经济时代,区块链资产管理已成为金融科技、去中心化金融(DeFi)以及企业资金流转的关键应用。传统的资产管理往往依赖于中心化机构,存在数据透明度低、效率受限、管理成本高等问题,而区块链技术的出现,为资产管理提…...

Sentinel源码—8.限流算法和设计模式总结一

大纲 1.关于限流的概述 2.高并发下的四大限流算法原理及实现 3.Sentinel使用的设计模式总结 1.关于限流的概述 保护高并发系统的三把利器&#xff1a;缓存、降级和限流。限流就是通过限制请求的流量以达到保护系统的目的&#xff0c;比如秒杀抢购。具体就是对并发请求进行限…...

SpringMVC入门

1、SpringMVC概念 SpringMVC是在Spring框架的基础上引入MVC模式的思想&#xff0c;SpringMVC即是一种框架&#xff0c;也是一种思想&#xff0c;将前后端彻底分离&#xff0c;后端不再需要关注前端的代码。前后端分工明确 我们原先学习的MVC三层架构&#xff0c;MVC是web开发…...

MYSQL之库的操作

创建数据库 语法很简单, 主要是看看选项(与编码相关的): CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name 1. 语句中大写的是…...

并发设计模式实战系列(3):工作队列

&#x1f31f; ​大家好&#xff0c;我是摘星&#xff01;​ &#x1f31f; 今天为大家带来的是并发设计模式实战系列&#xff0c;第三章工作队列&#xff08;Work Queue&#xff09;​​&#xff0c;废话不多说直接开始~ 目录 一、核心原理深度拆解 1. 生产者-消费者架构 …...

已安装爱思助手和Apple相关驱动,但仍无法有线连接iPhone热点,且网络适配器没有Apple Mobile Device Ethernet,问题解决

已安装爱思助手和Apple相关驱动&#xff0c;但仍无法有线连接iPhone热点&#xff0c;且网络适配器没有Apple Mobile Device Ethernet 问题解决&#xff1a; 用爱思助手连接手机&#xff0c;点击工具箱 - iTunes及驱动 点击高级修复 在系统存储的旧驱动文件项右侧&#xff0…...

用 Go 优雅地清理 HTML 并抵御 XSS——Bluemonday

1、背景与动机 只要你的服务接收并回显用户生成内容&#xff08;UGC&#xff09;——论坛帖子、评论、富文本邮件正文、Markdown 等——就必须考虑 XSS&#xff08;Cross‑Site Scripting&#xff09;攻击风险。浏览器在解析 HTML 时会执行脚本&#xff1b;如果不做清理&#…...

MySQL基本查询与数据操作全面解析

目录 1. CRUD操作概述 2. Create操作详解 2.1 表的创建 2.2 单行数据插入 2.3 多行数据插入 2.4 插入冲突处理 3. Retrieve操作详解 3.1 基础查询 全列查询&#xff08;慎用&#xff09; 指定列查询 表达式查询 结果去重 3.2 条件查询&#xff08;WHERE子句&#…...

《C++ 模板:泛型编程的核心》

C模板详解 模板是C中实现泛型编程的重要特性&#xff0c;它允许你编写与数据类型无关的代码。模板可以分为函数模板和类模板两种。 1. 函数模板 函数模板允许你定义一个可以处理多种数据类型的函数。 基本语法 template <typename T> T functionName(T parameter1, T…...

Web3实战:从零开发你的ERC20代币合约

区块链技术的普及让代币发行不再是金融巨头的专利。本文将以Solidity 0.8.20和OpenZeppelin 5.0为技术栈&#xff0c;手把手教你开发具备铸造、销毁、权限管理等进阶功能的ERC20代币&#xff0c;并部署到以太坊Sepolia测试网。以下是完整开发路线图&#xff1a; 一、ERC20代币的…...

简述大疆无人机对接

文章目录 概述MSDK对接MSDK简介MSDK集成步骤直播推流获取飞机实时数据 UX SDK上云API上云API简介上云API对接步骤Pilot上云Pilot怎么安装配置三方云平台地址直播获取飞机数据 Dock上云Dock上云简介直播方案设备管理 如何对接多个飞机引用 概述 一般而言&#xff0c;对接大疆的…...

docker-compose搭建kafka

1、单节点docker-compose.yml version: 3 services:zookeeper:image: zookeeper:3.8container_name: zookeeperports:- "2181:2181"volumes:- ./data/zookeeper:/dataenvironment:ZOO_MY_ID: 1ZOO_MAX_CLIENT_CNXNS: 100kafka:image: bitnami/kafka:3.7container_na…...

FramePack V2版 - 支持首尾帧生成,支持LoRA,支持批量,支持50系显卡,一个强大的AI视频生成软件 本地一键整合包下载

FramePack 是斯坦福大学主导开发的视频生成框架&#xff0c;是一种用于视频生成的下一帧&#xff08;下一帧部分&#xff09;预测神经网络结构&#xff0c;可以逐步生成视频。FramePack 主要开发者之一&#xff0c;就是业内大名鼎鼎的张吕敏大佬&#xff0c;AI领域的“赛博佛祖…...

开发网页程序时预览时遇到跨域问题解决方法

CocosCreator 开发h5游戏要用接口、开发html程序网页程序在chrome中预览时都会遇到跨域问题,怎么办? 网上有很多方法,主要是通过服务器端去配置,但那个相对来说消弱安全问题,这个不建议,因为是开发,个人行业,我们知道问题所以,简单点就主要是通过chrome的参数来禁用: 关闭 Ch…...

【音视频】FFmpeg内存模型

FFmpeg内存模型 从现有的Packet拷贝一个新Packet的时候&#xff0c;有两种情况&#xff1a; 两个Packet的buf引用的是同一数据缓存空间&#xff0c;这时候要注意数据缓存空间的释放问题&#xff1b;两个Packet的buf引用不同的数据缓存空间&#xff0c;每个Packet都有数据缓存…...

基于nlohmann/json 实现 从C++对象转换成JSON数据格式

C对象的JSON序列化与反序列化 基于JsonCpp库实现C对象序列化与反序列化 JSON 介绍 JSON作为一种轻量级的数据交换格式&#xff0c;在Web服务和应用程序中广泛使用。 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人阅读…...

在线视频转 AVI 的便捷之选,便捷操作,无需下载软件,在线使用

在视频处理的众多需求中&#xff0c;将视频转换为 AVI 格式是不少用户的刚需。小白工具网&#xff08;https://www.xiaobaitool.net/videos/convert-to-avi/ &#xff09;的在线视频转 AVI 功能&#xff0c;以其显著优势&#xff0c;多格式支持、便捷操作、数据安全保障以及广泛…...

【MCP Node.js SDK 全栈进阶指南】初级篇(3):MCP资源开发基础

引言 在前两篇文章中,我们已经详细介绍了MCP开发环境的搭建以及基础服务器开发。本文作为MCP TypeScript-SDK系列的第三篇,将聚焦于MCP资源开发基础,包括静态资源与动态资源的开发、资源模板设计与参数提取、资源列表与发现机制,以及常见资源类型与最佳实践。通过本文的学…...

L2-1、打造稳定可控的 AI 输出 —— Prompt 模板与格式控制

一、为什么需要 Prompt 模板&#xff1f; 在与 AI 模型交互时&#xff0c;我们经常会遇到输出不稳定、格式混乱的问题。Prompt 模板帮助我们解决这些问题&#xff0c;通过结构化的输入指令来获得可预测且一致的输出结果。 模板的作用主要体现在&#xff1a; 固定输出格式&am…...

Java集成Zxing和OpenCV实现二维码生成与识别工具类

Java集成Zxing和OpenCV实现二维码生成与识别工具类 本文将介绍如何使用Java集成Zxing和OpenCV库&#xff0c;实现二维码的生成和识别功能。识别方法支持多种输入形式&#xff0c;包括File对象、文件路径和Base64编码。 一、环境准备 添加Maven依赖 <dependencies><…...

jenkins pipeline ssh协议报错处理

一、jenkins版本 jenkins&#xff1a;2.492.3 openssh&#xff1a;OpenSSH_9.8p1, OpenSSL 3.3.1 # grep jenkins /etc/passwd jenkins:x:996:994:Jenkins Automation Server:/var/lib/jenkins:/bin/false 二、报错 三、处理 步骤1&#xff1a;手动添加目标主机密钥到Jenk…...

当OCR遇上“幻觉”:如何让AI更靠谱地“看懂”文字?

在数字化的世界里&#xff0c;OCR&#xff08;光学字符识别&#xff09;技术就像给机器装上了“电子眼”。但当这项技术遇上大语言模型&#xff0c;一个意想不到的问题出现了——AI竟然会像人类一样产生“幻觉”。想象一下&#xff0c;当你拿着模糊的财务报表扫描件时&#xff…...

vue watch监听路由,第一次进入不触发解决办法

“第一次进入的时候没触发&#xff0c;第二次就触发了”非常典型&#xff0c;它印证了路由监听&#xff08;无论是 watch $route 还是 beforeRouteUpdate&#xff09;主要是为了监听变化&#xff0c;而不是处理首次加载时的初始状态。 当你通过 this.$router.push 导航到一个新…...

JVM考古现场(二十四):逆熵者·时间晶体的永恒之战

"警告&#xff01;时间晶体正在吞噬GC日志&#xff01;" 我腰间的太极八卦镜突然迸发出刺目的量子辉光&#xff0c;终南山之巅的星宿大阵浮现出诡异的四维克莱因瓶拓扑——这是逆熵者文明穿越时空的拜帖&#xff01; 楔子&#xff1a;时间晶体的觉醒 &#x1f56f;️…...

spring中使用netty-socketio部署到服务器(SSL、nginx转发)

spring中使用netty-socketio部署到服务器&#xff08;SSL、nginx转发&#xff09; 本文实现前端socket.io-client连接后端netty-socketio&#xff0c;并且部署到服务器上的示例&#xff0c;以及说明一些实现过程中可能遇到的错误。 socketio默认基于的路径是/socket.io 传输…...

qt.tlsbackend.ossl: Failed to load libssl/libcrypto.

我的环境是windows&#xff0c;QT6.3.2&#xff08;msvc2019_64/mingw_64&#xff09; 出错原因 QT没有正确加载OpenSSL。 解决过程 1、确保安装的有openssl。 文章结尾有个注意&#xff0c;是其他方式安装过openssl&#xff0c;环境变量有&#xff0c;但是QT找不到的问题。…...

【Python爬虫基础篇】--3.cookie和session

目录 1.cookie 1.1.定义 1.2.参数 1.3.分类 2.session 3.使用cookie登录微博 4.使用session登录 1.cookie 由于http是一个无状态的协议&#xff0c;请求与请求之间无法相互传递或者记录一些信息&#xff0c;cookie和session正是为了解决这个问题而产生。 例子&#xff1…...

uView的u-modal不显示问题

问题分析&#xff1a;在项目中&#xff0c;其他页面显示正常&#xff0c;在这个页面显示不正常。 问题解决&#xff1a; 一般的原因&#xff0c;诸如层级遮挡控制器true后&#xff0c;被其他逻辑又改为了false最可恨的一个原因 :showshow被编辑器的提示功能误写成了v-modal&qu…...

联易融科技:以科技赋能驱动经营反转与价值重估

行业去重周期下,轻量化发展成破局关键。当前,供应链金融行业正经历从"规模扩张"到"价值深耕"的转型期,降本增效、轻资产运营成为行业共识。联易融公告表示&#xff0c;截至2024年末,公司现金储备高达51亿元,显示出财务状况健康良好,流动资金持续充裕。 董…...

Office文档图片批量提取工具

Office.Files.Images 是一款专注于从 Word、Excel、PPT 等 Office 文档中批量提取图片的轻量级工具&#xff0c;支持 .docx、.xlsx、.pptx 格式文件。该软件体积仅 ‌343KB‌&#xff0c;无需安装即可运行&#xff0c;通过拖拽操作实现快速解析与导出&#xff0c;尤其适合需批量…...

Python 设计模式:回调模式

1. 什么是回调函数&#xff1f; 回调函数是指作为参数传递给另一个函数的函数。当这个函数执行到某个特定的点时&#xff0c;它会调用这个回调函数。回调函数通常用于处理异步操作、事件处理或在某些条件下执行特定的操作。 回调函数的特点&#xff1a; 作为参数传递&#x…...

DCDC芯片,boost升压电路设计,MT3608 芯片深度解析:从架构到设计的全维度技术手册

一、硬件架构解析:电流模式升压 converter 的核心设计 (一)电路拓扑与核心组件 MT3608 采用恒定频率峰值电流模式升压(Boost)转换器架构,核心由以下模块构成: 集成功率 MOSFET 内置 80mΩ 导通电阻的 N 沟道 MOSFET,漏极(Drain)对应引脚 SW,源极(Source)内部接…...

大数据学习(112)-HIVE中的窗口函数

&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一…...

Hive学习

一、Hive 核心原理 1. Hive 架构与执行流程 Hive 是基于 Hadoop 的数据仓库工具&#xff0c;将 SQL 转化为分布式计算任务&#xff08;MapReduce/Tez/Spark&#xff09;&#xff0c;核心组件如下&#xff1a; 元数据存储&#xff08;Metastore&#xff09;&#xff1a;存储表…...

前端开发核心知识详解:Vue2、JavaScript 与 CSS

一、Vue2 核心知识点 1. Vue2 的双向绑定原理 Vue2 实现双向绑定主要依赖数据劫持与发布 - 订阅者模式。 利用Object.defineProperty方法对数据对象的属性进行劫持&#xff0c;为每个属性定义getter和setter。getter用于收集依赖&#xff0c;当视图中使用到该属性时&#xf…...

仅追加KV数据库

仅追加KV数据库 6.1 我们将要做什么 在本章中&#xff0c;我们将创建一个基于文件的键值存储&#xff08;KV Store&#xff09;&#xff0c;其核心是一个写时复制&#xff08;Copy-on-Write, CoW&#xff09;B 树。这种设计的目标是实现数据的持久性和原子性。 1. 设计概述 …...

【Java面试笔记:基础】8.对比Vector、ArrayList、LinkedList有何区别?

在Java中&#xff0c;Vector、ArrayList和LinkedList均实现了List接口&#xff0c;但它们在线程安全、数据结构、性能特性及应用场景上存在显著差异。 1. Vector、ArrayList 和 LinkedList 的区别 Vector&#xff1a; 线程安全&#xff1a;Vector 是线程安全的动态数组&#…...

Git分支管理方案

成都众望智慧有限公司Git分支管理方案 采用 轻量级Git Flow 敏捷版本控制策略&#xff0c;在保证稳定性的同时提升开发效率。以下是优化后的方案&#xff1a; 1. 精简分支模型&#xff08;相比6-8人团队减少分支层级&#xff09; 分支类型作用生命周期devops生产环境代码&am…...