Flink SQL 窗口聚合详解

news2024/11/26 14:39:59
1.滚动窗⼝(TUMBLE)

**滚动窗⼝定义:**滚动窗⼝将每个元素指定给指定窗⼝⼤⼩的窗⼝,滚动窗⼝具有固定⼤⼩,且不重叠。

例如,指定⼀个⼤⼩为 5 分钟的滚动窗⼝,Flink 将每隔 5 分钟开启⼀个新的窗⼝,其中每⼀条数都会划分到唯⼀⼀个 5 分钟的窗⼝中。

在这里插入图片描述

**应⽤场景:**按照⼀分钟对数据进⾏聚合,计算⼀分钟内 PV,UV 数据。

**实际案例:**分维度分钟级别统计在线⽤户数、总销售额。

滚动窗⼝在 1.13 版本之前和 1.13 及版本之后有两种 Flink SQL 实现⽅式

Group Window Aggregation(1.13 之前)和 Windowing TVF(1.13 及之后)

Group Window Aggregation ⽅案(⽀持 Batch\Streaming 任务):

-- 数据源表
CREATE TABLE source_table (
 -- 维度数据
 dim STRING,
 -- ⽤户 id
 user_id BIGINT,
 -- ⽤户
 price BIGINT,
 -- 事件时间戳
 row_time AS cast(CURRENT_TIMESTAMP as timestamp(3)),
 -- watermark 设置
 WATERMARK FOR row_time AS row_time - INTERVAL '5' SECOND
) WITH (
 'connector' = 'datagen',
 'rows-per-second' = '10',
 'fields.dim.length' = '1',
 'fields.user_id.min' = '1',
 'fields.user_id.max' = '100000',
 'fields.price.min' = '1',
 'fields.price.max' = '100000'
)

-- 数据汇表
CREATE TABLE sink_table (
 dim STRING,
 pv BIGINT,
 sum_price BIGINT,
 max_price BIGINT,
 min_price BIGINT,
 uv BIGINT,
 window_start bigint
) WITH (
 'connector' = 'print'
)

-- 数据处理逻辑
insert into sink_table
select
 dim,
 count(*) as pv,
 sum(price) as sum_price,
 max(price) as max_price,
 min(price) as min_price,
 -- 计算 uv 数
 count(distinct user_id) as uv,
 UNIX_TIMESTAMP(CAST(tumble_start(row_time, interval '1' minute) AS STRING)) * 10
from source_table
group by
 dim,
 tumble(row_time, interval '1' minute)

Group Window Aggregation 滚动窗⼝的 SQL 语法,把 tumble window 的声明写在了 group by ⼦句中,即 tumble(row_time, interval ‘1’ minute) ,第⼀个参数为事件时间的时间戳,第⼆个参数为滚动窗⼝⼤⼩。

Window TVF ⽅案(1.13 只⽀持 Streaming 任务):

-- 数据源表
CREATE TABLE source_table (
 -- 维度数据
 dim STRING,
 -- ⽤户 id
 user_id BIGINT,
 -- ⽤户
 price BIGINT,
 -- 事件时间戳
 row_time AS cast(CURRENT_TIMESTAMP as timestamp(3)),
 -- watermark 设置
 WATERMARK FOR row_time AS row_time - INTERVAL '5' SECOND
) WITH (
 'connector' = 'datagen',
 'rows-per-second' = '10',
 'fields.dim.length' = '1',
 'fields.user_id.min' = '1',
 'fields.user_id.max' = '100000',
 'fields.price.min' = '1',
 'fields.price.max' = '100000'
)

-- 数据汇表
CREATE TABLE sink_table (
 dim STRING,
 pv BIGINT,
 sum_price BIGINT,
 max_price BIGINT,
 min_price BIGINT,
 uv BIGINT,
 window_start bigint
) WITH (
 'connector' = 'print'
)

-- 数据处理逻辑
insert into sink_table
SELECT
 dim,
 UNIX_TIMESTAMP(CAST(window_start AS STRING)) * 1000 as window_start,
 count(*) as pv,
 sum(price) as sum_price,
 max(price) as max_price,
 min(price) as min_price,
 count(distinct user_id) as uv
FROM TABLE(TUMBLE(
 TABLE source_table
 , DESCRIPTOR(row_time)
 , INTERVAL '60' SECOND))
GROUP BY window_start, 
 window_end,
 dim

Windowing TVF 滚动窗⼝的写法把 tumble window 的声明写在了数据源的 Table ⼦句中,包含三部分参数:

TABLE(
TUMBLE(TABLE source_table, DESCRIPTOR(row_time), INTERVAL '60' SECOND)
) 

第⼀个参数 TABLE source_table 声明数据源表;

第⼆个参数 DESCRIPTOR(row_time) 声明数据源的时间戳字段;

第三个参数 INTERVAL ‘60’ SECOND 声明滚动窗⼝⼤⼩为 1 min。

实时场景 SQL 语义: 假设 Orders 为 kafka,target_table 也为 Kafka,这个 SQL ⽣成的实时任务,在执⾏时,会⽣成三个算⼦。

数据源算⼦(From Order):

连接到 Kafka topic,数据源算⼦⼀直运⾏,实时的从 Order Kafka 中⼀条⼀条的读取数据,然后⼀条⼀条发送给下游的 窗⼝聚合算⼦

窗⼝聚合算⼦(TUMBLE 算⼦):

接收到上游算⼦发的⼀条⼀条的数据,然后将每⼀条数据按照时间戳划分到对应的窗⼝中(根据事件时间、处理时间的不同语义进⾏划分),上述案例为事件时间,事件时间中,滚动窗⼝算⼦接收到上游的 Watermark ⼤于窗⼝的结束时间时,则说明当前这⼀分钟的滚动窗⼝已经结束了,将窗⼝计算完的结果发往下游算⼦(⼀条⼀条发给下游 数据汇算⼦ )

数据汇算⼦(INSERT INTO target_table):

接收到上游发的⼀条⼀条的数据,写⼊到 target_table Kafka 中

注意: 事件时间中滚动窗⼝的窗⼝计算触发是由 Watermark 推动的。

2.滑动窗⼝(HOP)

**滑动窗⼝定义:**滑动窗⼝是将元素指定给固定⻓度的窗⼝,与滚动窗⼝功能⼀样,也有窗⼝⼤⼩的概念,不⼀样的地⽅在于,滑动窗⼝有另⼀个参数控制窗⼝计算的频率(滑动窗⼝滑动的步⻓),如果滑动的步⻓⼩于窗⼝⼤⼩,则滑动窗⼝之间每个窗⼝是可以重叠,在这种情况下,⼀条数据就会分配到多个窗⼝当中。

**举例:**有 10 分钟⼤⼩的窗⼝,滑动步⻓为 5 分钟,每 5 分钟会划分⼀次窗⼝,这个窗⼝包含的数据是过去 10 分钟内的数据。

在这里插入图片描述

**应⽤场景:**计算同时在线的数据,要求结果的输出频率是 1 分钟⼀次,每次计算的数据是过去 5 分钟的数据(有的场景下⽤户可能在线,但是可能会 2 分钟不活跃,但是这也要算在同时在线数据中,所以取最近 5 分钟的数据就能计算进去了)

**实际案例:**分维度分钟级别同时在线⽤户数,1 分钟输出⼀次,计算最近 5 分钟的数据,Group Window Aggregation、Windowing TVF 两种⽅案

Group Window Aggregation ⽅案(⽀持 Batch\Streaming 任务):

CREATE TABLE source_table (
 -- 维度数据
 dim STRING,
 -- ⽤户 id
 user_id BIGINT,
 -- ⽤户
 price BIGINT,
 -- 事件时间戳
 row_time AS cast(CURRENT_TIMESTAMP as timestamp(3)),
 -- watermark 设置
 WATERMARK FOR row_time AS row_time - INTERVAL '5' SECOND
) WITH (
 'connector' = 'datagen',
 'rows-per-second' = '10',
 'fields.dim.length' = '1',
 'fields.user_id.min' = '1',
 'fields.user_id.max' = '100000',
 'fields.price.min' = '1',
 'fields.price.max' = '100000'
);

-- 数据汇表
CREATE TABLE sink_table (
 dim STRING,
 uv BIGINT,
 window_start bigint
) WITH (
 'connector' = 'print'
);

-- 数据处理逻辑
insert into sink_table
SELECT dim,
UNIX_TIMESTAMP(
	CAST(
		hop_start(row_time, interval '1' minute, interval '5' minute) 
		AS STRING)
	) * 10,
count(distinct user_id) as uv
FROM source_table
GROUP BY dim
 , hop(row_time, interval '1' minute, interval '5' minute)

Group Window Aggregation 滚动窗⼝的写法把 hop window 的声明写在了 group by ⼦句中,即

hop(row_time, interval '1' minute, interval '5' minute) 

第⼀个参数为事件时间的时间戳字段;

第⼆个参数为滑动窗⼝的滑动步⻓;

第三个参数为滑动窗⼝⼤⼩。

Windowing TVF ⽅案(1.13 只⽀持 Streaming 任务):

-- 数据源表
CREATE TABLE source_table (
 -- 维度数据
 dim STRING,
 -- ⽤户 id
 user_id BIGINT,
 -- ⽤户
 price BIGINT,
 -- 事件时间戳
 row_time AS cast(CURRENT_TIMESTAMP as timestamp(3)),
 -- watermark 设置
 WATERMARK FOR row_time AS row_time - INTERVAL '5' SECOND
) WITH (
 'connector' = 'datagen',
 'rows-per-second' = '10',
 'fields.dim.length' = '1',
 'fields.user_id.min' = '1',
 'fields.user_id.max' = '100000',
 'fields.price.min' = '1',
 'fields.price.max' = '100000'
);

-- 数据汇表
CREATE TABLE sink_table (
 dim STRING,
 uv BIGINT,
 window_start bigint
) WITH (
 'connector' = 'print'
);

-- 数据处理逻辑
insert into sink_table
SELECT
 dim,
 UNIX_TIMESTAMP(CAST(window_start AS STRING)) * 1000 as window_start, 
 count(distinct user_id) as bucket_uv
FROM TABLE(HOP(
 TABLE source_table
 , DESCRIPTOR(row_time)
 , INTERVAL '1' MINUTES, INTERVAL '5' MINUTES))
GROUP BY window_start, 
 window_end,
 dim

Windowing TVF 滑动窗⼝的写法把 hop window 的声明写在了数据源的 Table ⼦句中,即

TABLE(HOP(TABLE source_table, DESCRIPTOR(row_time), INTERVAL '1' MINUTES, INTERVAL '5' MINUTES))

第⼀个参数 TABLE source_table 声明数据源表;

第⼆个参数 DESCRIPTOR(row_time) 声明数据源的时间戳;

第三个参数 INTERVAL ‘1’ MINUTES 声明滚动窗⼝滑动步⻓⼤⼩为 1 min。

第四个参数 INTERVAL ‘5’ MINUTES 声明滚动窗⼝⼤⼩为 5 min。

3.Session 窗⼝

**Session 窗⼝定义:**Session 时间窗⼝和滚动、滑动窗⼝不⼀样,其没有固定的持续时间,如果在定义的间隔期(Session Gap)内没有新的数据出现,则 Session 就会窗⼝关闭。

在这里插入图片描述

**实际案例:**计算每个⽤户在活跃期间(⼀个 Session)总共购买的商品数量,如果⽤户 5 分钟没有活动,则视为 Session 断开

⽬前 1.13 版本中 Flink SQL 不⽀持 Session 窗⼝的 Window TVF,只介绍 Group Window Aggregation ⽅案。

Group Window Aggregation ⽅案(⽀持 Batch\Streaming 任务):

-- 数据源表,⽤户购买⾏为记录表
CREATE TABLE source_table (
 -- 维度数据
 dim STRING,
 -- ⽤户 id
 user_id BIGINT,
 -- ⽤户
 price BIGINT,
 -- 事件时间戳
 row_time AS cast(CURRENT_TIMESTAMP as timestamp(3)),
 -- watermark 设置
 WATERMARK FOR row_time AS row_time - INTERVAL '5' SECOND
) WITH (
 'connector' = 'datagen',
 'rows-per-second' = '10',
 'fields.dim.length' = '1',
 'fields.user_id.min' = '1',
 'fields.user_id.max' = '100000',
 'fields.price.min' = '1',
 'fields.price.max' = '100000'
);

-- 数据汇表
CREATE TABLE sink_table (
 dim STRING,
 pv BIGINT, -- 购买商品数量
 window_start bigint
) WITH (
 'connector' = 'print'
);

-- 数据处理逻辑
insert into sink_table
SELECT
 dim,
 UNIX_TIMESTAMP(CAST(session_start(row_time, interval '5' minute) AS STRING)) * 10,
 count(1) as pv
FROM source_table
GROUP BY dim
 , session(row_time, interval '5' minute)

**注意:**上述 SQL 任务是在整个 Session 窗⼝结束之后才会把数据输出,Session 窗⼝⽀持 处理时间 和 事件时间,但是处理时间只⽀持在 Streaming 任务中运⾏,Batch 任务不⽀持。

Group Window Aggregation 中 Session 窗⼝的写法把 session window 的声明写在了 group by ⼦句中

session(row_time, interval '5' minute)

第⼀个参数为事件时间的时间戳;

第⼆个参数为 Session gap 间隔。

4.渐进式窗⼝(CUMULATE)

**渐进式窗⼝定义(1.13 只⽀持 Streaming 任务):**渐进式窗⼝可以认为是⾸先开⼀个最⼤窗⼝⼤⼩的滚动窗⼝,然后根据⽤户设置的触发的时间间隔将这个滚动窗⼝拆分为多个窗⼝,这些窗⼝具有相同的窗⼝起点和不同的窗⼝终点。

**示例:**从每⽇零点到当前这⼀分钟绘制累积 UV,其中 10:00 时的 UV 表示从 00:00 到 10:00 的 UV 总数。

在这里插入图片描述

**应⽤场景:**周期内累计 PV,UV 指标(如每天累计到当前这⼀分钟的 PV,UV),这类指标是⼀段周期内的累计状态。

**实际案例:**每天的截⽌当前分钟的累计 money(sum(money)),去重 id 数(count(distinct id)),每天代表渐进式窗⼝⼤⼩为 1 天,分钟代表渐进式窗⼝移动步⻓为分钟级别。

明细输⼊数据:

在这里插入图片描述

预期经过渐进式窗⼝计算的输出数据:

在这里插入图片描述

**特点:**每⼀分钟的输出结果都是当天零点累计到当前的结果,渐进式窗⼝只有 Windowing TVF ⽅案⽀持。

Windowing TVF ⽅案(1.13 只⽀持 Streaming 任务)

-- 数据源表
CREATE TABLE source_table (
 -- ⽤户 id
 user_id BIGINT,
 -- ⽤户
 money BIGINT,
 -- 事件时间戳
 row_time AS cast(CURRENT_TIMESTAMP as timestamp(3)),
 -- watermark 设置
 WATERMARK FOR row_time AS row_time - INTERVAL '5' SECOND
) WITH (
 'connector' = 'datagen',
 'rows-per-second' = '10',
 'fields.user_id.min' = '1',
 'fields.user_id.max' = '100000',
 'fields.money.min' = '1',
 'fields.money.max' = '100000'
);

-- 数据汇表
CREATE TABLE sink_table (
 window_end bigint,
 window_start bigint,
 sum_money BIGINT,
 count_distinct_id bigint
) WITH (
 'connector' = 'print'
);

-- 数据处理逻辑
insert into sink_table
SELECT
 UNIX_TIMESTAMP(CAST(window_end AS STRING)) * 1000 as window_end, 
 window_start, 
 sum(money) as sum_money,
 count(distinct user_id) as count_distinct_id
FROM TABLE(CUMULATE(
 TABLE source_table
 , DESCRIPTOR(row_time)
 , INTERVAL '60' SECOND
 , INTERVAL '1' DAY))
GROUP BY
 window_start, 
 window_end

Windowing TVF 滚动窗⼝的写法把 cumulate window 的声明写在了数据源的 Table ⼦句中

TABLE(
	CUMULATE(
		TABLE source_table,
    DESCRIPTOR(row_time),
    INTERVAL '60' SECOND, INTERVAL '1' DAY)
) 

第⼀个参数 TABLE source_table 声明数据源表;

第⼆个参数 DESCRIPTOR(row_time) 声明数据源的时间戳;

第三个参数 INTERVAL ‘60’ SECOND 声明渐进式窗⼝触发的渐进步⻓为 1 min。

第四个参数 INTERVAL ‘1’ DAY 声明整个渐进式窗⼝的⼤⼩为 1 天,到了第⼆天新开⼀个窗⼝重新累计。

5.Window TVF ⽀持 Grouping Sets、Rollup、Cube

**应⽤场景:**多个维度组合(cube)计算,把每个维度写⼀遍 union all 起来麻烦⽽且会导致⼀个数据源读取多遍。

⽤ Grouping Sets 将维度组合写在⼀条 SQL 中,⽅便且执⾏效率⾼,⽬前 Grouping Sets 只在 Window TVF 中⽀持,不⽀持 Group Window Aggregation。

**示例:**计算每⽇零点累计到当前这⼀分钟的,分汇总、age、sex、age+sex 维度的⽤户数。

-- ⽤户访问明细表
CREATE TABLE source_table (
 age STRING,
 sex STRING,
 user_id BIGINT,
 row_time AS cast(CURRENT_TIMESTAMP as timestamp(3)),
 WATERMARK FOR row_time AS row_time - INTERVAL '5' SECOND
) WITH (
 'connector' = 'datagen',
 'rows-per-second' = '1',
 'fields.age.length' = '1',
 'fields.sex.length' = '1',
 'fields.user_id.min' = '1',
 'fields.user_id.max' = '100000'
);

CREATE TABLE sink_table (
 age STRING,
 sex STRING,
 uv BIGINT,
 window_end bigint
) WITH (
 'connector' = 'print'
);

insert into sink_table
SELECT
 UNIX_TIMESTAMP(CAST(window_end AS STRING)) * 1000 as window_end,
 if (age is null, 'ALL', age) as age,
 if (sex is null, 'ALL', sex) as sex,
 count(distinct user_id) as bucket_uv
FROM TABLE(CUMULATE(
 TABLE source_table
 , DESCRIPTOR(row_time)
 , INTERVAL '5' SECOND
 , INTERVAL '1' DAY))
GROUP BY
 window_start, 
 window_end,
 -- grouping sets 写法
 GROUPING SETS (
 ()
 , (age)
 , (sex)
 , (age, sex)
 )

Flink SQL 中 Grouping Sets 的语法和 Hive SQL 的语法有不同,使⽤ Hive SQL 实现上述 SQL 的语义,实现如下:

insert into sink_table
SELECT
 UNIX_TIMESTAMP(CAST(window_end AS STRING)) * 1000 as window_end, 
 if (age is null, 'ALL', age) as age,
 if (sex is null, 'ALL', sex) as sex,
 count(distinct user_id) as bucket_uv
FROM source_table
GROUP BY
 age
 , sex
-- hive sql grouping sets 写法
GROUPING SETS (
 ()
 , (age)
 , (sex)
 , (age, sex)
)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1170630.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Activiti7工作原理

Java Activiti是一个开源的工作流引擎,用于管理和执行业务流程。 它是基于BPMN 2.0标准的,提供了丰富的功能和灵活性。 Java Activiti的工作原理如下: 1.Java Activiti 流程建模 使用BPMN 2.0标准的图形化编辑器,可以创建和定义…

基于饥饿游戏算法的无人机航迹规划-附代码

基于饥饿游戏算法的无人机航迹规划 文章目录 基于饥饿游戏算法的无人机航迹规划1.饥饿游戏搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用饥饿游戏算法来优化无人机航迹规划。 …

Docker容器技术实战3

8、docker原生网络 Docker原生网络基于Linux桥接技术和虚拟网络接口,使用了Linux内核的网络功能。每个Docker容器都有自己的网络命名空间,这使得容器之间可以使用独立的IP地址,并隔离了容器的网络栈。 当创建一个Docker原生网络时&#xff…

Apache Flink 1.12.0 on Yarn(3.1.1) 所遇到的問題

Apache Flink 1.12.0 on Yarn(3.1.1) 所遇到的問題 新搭建的FLINK集群出现的问题汇总 1.新搭建的Flink集群和Hadoop集群无法正常启动Flink任务 查看这个提交任务的日志无法发现有用的错误信息。 进一步查看yarn日志: 发现只有JobManager的错误日志出现了如下的…

JOSEF约瑟 数显三相电压继电器 HJY-931A/D 导轨安装

名称:数字交流三相电压继电器型号:HJY-93系列品牌:JOSEF约瑟电压整定范围:10~450VAC额定电压:200、400VAC功率消耗:≤5W HJY系列 数字交流三相电压继电器 系列型号 HJY-931A/D数字式交流三相电压继电器&am…

吴恩达《机器学习》5-6:向量化

在深度学习和数值计算中,效率和性能是至关重要的。一个有效的方法是使用向量化技术,它可以显著提高计算速度,减少代码的复杂性。接下来将介绍向量化的概念以及如何在不同编程语言和工具中应用它,包括 Octave、MATLAB、Python、Num…

lvgl生成图片

网址:https://lvgl.io/tools/imageconverter CF_TRUE_COLOR:可以生成565,232,等多种形式的数组,选择Carray,会生成C数组。

2023.11.2事件纪念

然而造化又常常为庸人设计,以时间的流逝,来洗涤旧迹,仅以留下淡红的血色和微漠的悲哀。 回顾这次事件,最深的感触就是什么是团队的力量! 当我们看到希望快要成功的时候,大家洋溢出兴奋开心的表情,一起的欢声笑语;但看…

抖音群控软件的作用是什么?

随着智能手机的普及和社交媒体的兴起,抖音成为了人们日常生活中不可或缺的一部分,许多人都通过抖音平台分享自己的生活、展示才艺、开展商业活动等。 然而,要想在抖音上获得更多的关注和收益,需要投入大量的时间和精力&#xff0…

【C语言初学者周冲刺计划】3.2将一个数组中的值逆序重新存放

目录 1解题思路&#xff1a; 2代码 3运行代码如图&#xff1a; 4总结&#xff1a; 1解题思路&#xff1a; 首先学会如何利用循环输入位数和输入数值&#xff0c;然后再利用循环逆序即可 2代码 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int…

佳易王钟表铭表维修养护拍图留存查询手表保养跟踪记录系统软件下载

佳易王钟表铭表维修养护拍图留存查询手表保养跟踪记录系统软件下载 【软件试用版下载、软件资讯或技术支持服务可以点击文章最下方官网】 佳易王钟表养护维修管理系统V16.3&#xff0c;录入维修订单&#xff0c;维修进度查询&#xff0c;会员活动方案&#xff0c;打印服务报…

并发安全问题之--锁失效和锁边界问题

并发安全问题之–锁失效和锁边界问题 此处为新增insert无法在SQL中通过数量限制(除非插入SQL中有子查询)&#xff0c;上面改进的乐观锁失效&#xff08;前一节的乐观锁适合修改数据&#xff09; 故使用悲观锁&#xff0c;synchronized如果加在方法上范围是this是整个service&…

OSG多视口创建:osgViewer::CompositeViewer

1、效果 在osg的实际应用场景中&#xff0c;有时候需要同时创建多个场景视图&#xff0c;并保证各个场景视图中有不一样的显示和操作&#xff1a;例如&#xff1a;漫游器、照相机、粒子效果、多个模型组合等。此时就要用到OSG提供的osgViewer::CompositeViewer类来实现这个需求…

音乐推荐与管理系统Python+Django网页界面+协同过滤推荐算法

一、介绍 音乐推荐与管理系统。本系统采用Python作为主要开发语言&#xff0c;前端使用HTML、CSS、BootStrap等技术搭建界面平台&#xff0c;后端使用Django框架处理请求&#xff0c;并基于Ajax等技术实现前端与后端的数据通信。在音乐个性推荐功能模块中采用通过Python编写协…

Jmeter和Postman哪个做接口测试会更好

软件测试行业做功能测试和接口测试的人相对比较多。在测试工作中&#xff0c;有高手&#xff0c;自然也会有小白&#xff0c;但有一点我们无法否认&#xff0c;就是每一个高手都是从小白开始的&#xff0c;所以今天我们就来谈谈一大部分人在做的接口测试&#xff0c;小白变高手…

gcc -static 在centos stream8 和centos stream9中运行报错的解决办法

gcc -static 在centos stream8 和centos stream9中运行报错的解决办法&#xff1a; 报/usr/bin/ld: cannot find -lc 我们下载glibc-static&#xff1a; 选择x86_64的。 还有一个是libxcrypt-static&#xff0c;依旧在这个网站里搜。 rpm -ivh glibc-static-2.28-239.el8.x…

项目实战之理解代码一(vue.config.js)

文章目录 CDN 面经天天背&#xff0c;今天总算见到真的了。 OK&#xff0c;接下来让我们走进前端优化性能方式之一&#xff1a;CDN CDN CDN&#xff08;Content Delivery Network&#xff0c;内容分发网络&#xff09;是用于存储和传输静态资源&#xff08;如 JavaScript、CSS…

如何为一个Type类赋值

如何为一个Type类赋值 前言案例准备一、简单赋值 前言 今天我在写代码的时候遇到一个神奇的类——Type,虽然说我们都心知肚明这个类代表着什么&#xff08;字面意思嘛&#xff0c;很好理解&#xff09;&#xff0c;但是实操起来却无从下手&#xff0c;就如何对Type类进行赋值&…

基于 golang 从零到一实现时间轮算法 (二)

Go实现单机版时间轮 上一章介绍了时间轮的相关概念&#xff0c;接下来我们会使用 golang 标准库的定时器工具 time ticker 结合环状数组的设计思路&#xff0c;实现一个单机版的单级时间轮。 首先我们先运行一下下面的源码&#xff0c;看一下如何使用。 https://github.com/x…

一招优化百度网盘下载速度,不开会员也能提高几十倍倍下载速度

​ 百度网盘&#xff08;原百度云&#xff09;是百度推出的一项云存储服务&#xff0c;已覆盖主流PC和手机操作系统&#xff0c;包含Web版、Windows版、Mac版、Android版、Linux信创版、青春版、TV版、iPhone版和iPad版&#xff0c;并覆盖了主流联网车和非联网车。 用…