FLINK SQL时区问题
SQL时区问题
在Flink SQL中,时区问题是一个需要特别关注的点,因为时区的不一致可能会导致数据的不一致性。以下是对Flink SQL时区问题的详细解释和解决方案:
一、时区问题背景
- 时间类型与时区:
- 在Flink SQL中,时间类型主要分为TIMESTAMP(不带时区信息的时间)和TIMESTAMP_LTZ(带时区信息的时间)。
- TIMESTAMP类型的时间戳不带任何时区信息,默认为UTC时间(协调世界时)。
- TIMESTAMP_LTZ类型的时间戳则带有时区信息。
- 时区不一致的影响:
- 当数据源(如MySQL)的时区设置与Flink的时区设置不一致时,可能会导致读取到的时间数据与实际时间存在偏差。
- 在进行窗口聚合、时间比较等操作时,时区的不一致可能会导致结果的不准确。
二、解决时区问题的方案
- 确认MySQL的时区设置:
- 通过SQL查询获取MySQL的全局和会话时区:SELECT @@global.time_zone, @@session.time_zone;。
- 如果需要,可以通过修改MySQL的配置文件(如my.cnf)来设置时区,然后重启MySQL使配置生效。
- 配置Flink的时区:
- 在Flink的配置文件(如flink-conf.yaml)中,可以通过设置java.opts参数来指定JVM的时区,例如:java.opts: “-Duser.timezone=Asia/Shanghai”。
- 在Flink SQL中,可以在创建表时通过连接参数指定时区,例如:
CREATE TABLE your_table ( id INT, created_time TIMESTAMP(3)
) WITH ( 'connector' = 'jdbc', 'url' = 'jdbc:mysql://hostname:3306/database', 'username' = 'username', 'password' = 'password', 'driver' = 'com.mysql.cj.jdbc.Driver', 'timezone' = 'Asia/Shanghai' -- 设置连接时区
);
- 使用带时区的时间类型:
- 在Flink SQL中,尽量使用TIMESTAMP_LTZ类型的时间戳,以避免时区不一致带来的问题。
- 可以通过配置参数table.local-time-zone来设置Flink任务的时区,这样可以将不带时区信息的时间戳转换为带时区信息的字符串。
- 注意数据源的时区设置:
- 确保数据源(如MySQL、Kafka等)的时区设置与Flink的时区设置一致,或者在读取数据时进行相应的时区转换。
- 验证时区配置:
- 通过执行SQL查询来验证时区配置是否成功,例如:检查数据的时间戳是否与预期一致。
SQL时间类型
在Flink SQL中,时间类型是一个重要的概念,它涉及到数据的处理、窗口的划分以及时间的转换等多个方面。以下是Flink SQL中常见的时间类型及其相关说明:
一、基本时间类型
- TIMESTAMP:不带时区信息的时间戳。它表示的是一个具体的时间点,但不包含该时间点所对应的时区信息。这种类型的时间戳通常用于那些对时区要求不高的场景,或者在处理数据时已经明确知道了时区信息,不需要在数据层面进行额外的时区转换。
- TIMESTAMP_LTZ(TIMESTAMP WITH LOCAL TIME ZONE):带时区信息的时间戳。与TIMESTAMP不同,TIMESTAMP_LTZ在表示时间点的同时,还包含了该时间点所对应的时区信息。这种类型的时间戳在处理跨时区的数据时非常有用,因为它可以确保数据在不同时区之间转换时保持一致性。
二、时间属性的概念
在Flink SQL中,除了基本的时间类型外,还有与时间属性相关的概念,这些概念对于理解Flink SQL中的时间处理至关重要:
- Event Time:事件产生的时间,它通常由事件中的时间戳来描述。在Flink中,Event Time是业务上最关心的时间,因为它代表了数据的实际发生时间。
- Ingestion Time:数据进入Flink系统的时间。这个时间通常用于那些对数据的实时性要求不高的场景,或者在处理数据时不需要考虑数据的实际发生时间。
- Processing Time:数据被Flink算子处理的时间。Processing Time是Flink系统内部的时间,它通常用于那些对时间要求不严格或者需要快速响应的场景。
三、时间属性的使用
在Flink SQL中,可以通过以下方式来使用不同的时间属性:
- 指定时间属性:在创建表时,可以通过CREATE TABLE语句中的WITH子句来指定时间属性。例如,可以使用rowtime属性来指定Event Time,或者使用proctime属性来指定Processing Time。
- 时间戳和水位线(Watermark):在使用Event Time时,通常需要指定时间戳的提取方式和水位线的生成策略。时间戳用于从事件中提取Event Time,而水位线则用于处理乱序事件,确保窗口的及时关闭。
- 时区设置:在处理带时区信息的时间戳时,需要确保Flink任务的时区设置与数据源的时区设置一致。可以通过配置参数table.local-time-zone来设置Flink任务的时区。
注意事项
- 时区一致性:在处理跨时区的数据时,需要确保数据源、Flink任务以及最终存储或展示数据的系统的时区设置一致,以避免时区不一致带来的数据问题。
- 时间戳精度:在指定时间戳时,需要注意时间戳的精度。不同的精度可能会导致数据在处理时存在差异。
- 乱序事件处理:在使用Event Time时,需要特别注意乱序事件的处理。乱序事件可能会导致窗口的延迟关闭,因此需要合理设置水位线的生成策略来确保窗口的及时关闭。
时区参数生效的SQL时间函数
在Flink中,时区参数对于SQL时间函数的结果有着直接的影响。以下是几个常见的、受时区参数影响的时间函数,以及它们的使用方式和注意事项:
一、CURRENT_TIMESTAMP 与 LOCALTIMESTAMP
- CURRENT_TIMESTAMP:返回当前UTC(GMT+0)时间戳,时间戳单位为毫秒。这个函数返回的时间不受会话时区的影响,始终为UTC时间。
- LOCALTIMESTAMP:返回当前系统的时间戳,时间戳包含时区信息。这个函数返回的时间受会话时区的影响,会根据当前会话的时区设置进行相应的调整。
二、CURRENT_TIME 与 LOCALTIME
- CURRENT_TIME:返回当前UTC时区的当前时间(时分秒)。与CURRENT_TIMESTAMP类似,这个函数返回的时间也是UTC时间,不受会话时区的影响。
- LOCALTIME:返回当前时区的当前时间(时分秒)。这个函数返回的时间受会话时区的影响,会根据当前会话的时区设置进行相应的调整。
三、带时区转换的时间函数
- CONVERT_TZ(string1, string2, string3):将datetime string1(使用默认的ISO时间戳格式’yyyy-MM-dd HH:mm:ss’)从时区string2转换为时区string3。时区格式可以是缩写(如"PST")、全称(如"America/Los_Angeles")或自定义ID(如“GMT-08:00”)。这个函数允许用户在不同时区之间进行时间的转换。
- FROM_UNIXTIME(numeric[, string]):以字符串格式返回数字参数的表示形式(默认为’yyyy-MM-dd HH:mm:ss’),该返回值用会话时区表示。numeric是一个内部时间戳值,表示自UTC '1970-01-01 00:00:00’以来的秒数。这个函数允许用户将Unix时间戳转换为指定时区的日期时间字符串。
四、其他受时区影响的时间函数
- DATE_FORMAT(timestamp, string):虽然这个函数本身不直接处理时区转换,但它返回的时间字符串格式会受到时区设置的影响。因此,在使用这个函数时,需要注意当前会话的时区设置。
- TIMESTAMPADD(interval, INT add, [TIMESTAMP | DATE] datetime_expr):这个函数用于在指定的时间间隔上添加或减去一个值。虽然它本身不直接处理时区转换,但返回的时间值会受到时区设置的影响。
- TIMESTAMPDIFF(timeintervalunit, timepoint1, timepoint2):返回两个时间点之间的时间间隔。同样地,这个函数返回的时间间隔值会受到时区设置的影响。
注意事项
- 时区设置:在使用上述时间函数时,需要确保Flink任务的时区设置与数据源的时区设置一致,以避免时区不一致带来的数据问题。可以通过配置参数table.local-time-zone来设置Flink任务的时区。
- 时间戳精度:在指定时间戳时,需要注意时间戳的精度。不同的精度可能会导致数据在处理时存在差异。
- 函数选择:根据具体需求选择合适的时间函数。例如,如果需要获取当前系统的日期和时间戳,并且需要包含时区信息,则应使用LOCALTIMESTAMP函数;如果需要获取UTC时间的日期和时间戳,则应使用CURRENT_TIMESTAMP函数。
事件时间和时区应用案例
在Apache Flink中,事件时间(Event Time)和时区是两个重要的概念,它们在处理流式数据时尤其关键。以下是一个关于Flink事件时间和时区应用的案例,展示了如何在Flink中设置时区并使用事件时间进行窗口聚合。
案例背景
假设有一个实时数据流,其中包含用户的行为数据,每条数据都有一个时间戳表示事件发生的时间。目标是基于这些事件时间对用户的行为进行窗口聚合,统计每个窗口内的用户行为数量。由于数据可能来自不同的时区,需要确保在处理数据时能够正确应用时区设置。
步骤一:设置时区
在Flink中,可以通过配置参数来设置全局时区。这可以通过修改Flink配置文件(如flink-conf.yaml)或在代码中动态设置来实现。例如,可以将时区设置为“Asia/Shanghai”:
# 在flink-conf.yaml中设置
table.local-time-zone: Asia/Shanghai
或者在代码中设置:
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.getConfig().setGlobalJobParameters(new GlobalJobParameters.Builder() .setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")) .build());
步骤二:定义数据源和事件时间
接下来,需要定义数据源,并指定如何从数据中提取事件时间戳。这通常通过实现TimestampAssigner接口或使用Flink提供的便捷类来完成。例如,如果数据是JSON格式的字符串,并且包含一个名为timestamp的字段,可以这样设置:
DataStream<String> inputStream = ...; // 数据源 DataStream<MyEvent> eventStream = inputStream .map(jsonLine -> { // 解析JSON并创建MyEvent对象 // ... return new MyEvent(...); }) .assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor<MyEvent>(Time.seconds(5)) { @Override public long extractTimestamp(MyEvent event) { return event.getTimestamp(); // 从MyEvent对象中提取时间戳 } });
步骤三:应用窗口聚合
现在已经设置了事件时间,接下来可以基于事件时间应用窗口聚合。例如,可以使用滚动窗口(Tumbling Window)来统计每个5秒窗口内的用户行为数量:
eventStream .keyBy(event -> event.getUserId()) // 按用户ID分组 .window(TumblingEventTimeWindows.of(Time.seconds(5))) // 设置5秒滚动窗口 .sum("behaviorCount"); // 对行为数量进行求和
步骤四:处理时区转换(如果需要)
如果数据源中的时间戳不是基于设置的时区(例如,它们是UTC时间戳),可能需要在提取时间戳时进行时区转换。这可以通过在extractTimestamp方法中添加适当的逻辑来实现,例如将UTC时间戳转换为指定的时区时间戳。
然而,在大多数情况下,如果数据源已经包含了正确时区的时间戳,或者只需要在最终展示结果时考虑时区差异,那么就不需要在Flink处理过程中进行显式的时区转换。相反,可以在结果展示阶段(例如,在将数据写入数据库或生成报告时)进行时区转换。
处理时间和时区应用案例
在Apache Flink中,处理时间(Processing Time)和时区是两个在处理流数据时经常需要考虑的因素。以下是一个关于Flink处理时间和时区应用的案例,该案例展示了如何在Flink中基于处理时间进行窗口聚合,并考虑时区的影响。
案例背景
假设有一个实时数据流,该数据流包含来自不同地理位置的传感器数据。每条数据都有一个时间戳,但该时间戳是数据到达Flink系统的时间(即处理时间),而不是数据实际产生的时间(即事件时间)。目标是对这些数据进行窗口聚合,统计每个窗口内的传感器数据平均值,并且考虑时区的影响以确保结果的准确性。
步骤一:设置时区
在Flink中,时区可以通过配置参数来设置。这可以通过修改Flink配置文件(如flink-conf.yaml)或在代码中动态设置来实现。在这个案例中,假设系统默认时区是UTC,但希望结果以“Asia/Shanghai”时区展示。
步骤二:定义数据源
定义一个数据源,该数据源产生包含传感器值和到达时间戳的流数据。在Flink中,这通常通过实现SourceFunction接口或使用Flink提供的连接器(如Kafka连接器)来完成。
步骤三:基于处理时间的窗口聚合
由于使用的是处理时间,Flink会自动使用数据到达系统的时间作为窗口聚合的依据。可以使用滚动窗口(Tumbling Window)或滑动窗口(Sliding Window)来进行聚合。在这个案例中,使用滚动窗口。
DataStream<SensorData> sensorDataStream = ...; // 数据源 // 基于处理时间的5分钟滚动窗口进行聚合
DataStream<SensorDataAggregate> aggregatedStream = sensorDataStream .keyBy(sensorData -> sensorData.getSensorId()) // 按传感器ID分组 .window(TumblingProcessingTimeWindows.of(Time.minutes(5))) // 设置5分钟滚动窗口 .apply(new WindowFunction<SensorData, SensorDataAggregate, String, TimeWindow>() { @Override public void apply(String sensorId, TimeWindow window, Iterable<SensorData> input, Collector<SensorDataAggregate> out) { // 计算窗口内数据的平均值 List<SensorData> dataList = new ArrayList<>(input); double averageValue = dataList.stream() .mapToDouble(SensorData::getValue) .average() .orElse(0.0); // 创建聚合结果对象 SensorDataAggregate aggregate = new SensorDataAggregate(sensorId, window.getStart(), window.getEnd(), averageValue); // 输出聚合结果 out.collect(aggregate); } });
步骤四:处理时区转换(如果需要)
在这个案例中,假设数据的时间戳已经是处理时间(即数据到达系统的时间),因此不需要进行时区转换。但是,如果需要将结果以特定时区展示,可以在输出聚合结果之前进行时区转换。
例如,可以将UTC时间转换为“Asia/Shanghai”时间:
// 假设aggregate.getWindowEnd()返回的是UTC时间戳(毫秒)
long utcEndTime = aggregate.getWindowEnd();
TimeZone utcZone = TimeZone.getTimeZone("UTC");
TimeZone shanghaiZone = TimeZone.getTimeZone("Asia/Shanghai"); // 将UTC时间转换为Shanghai时间
SimpleDateFormat utcFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
utcFormatter.setTimeZone(utcZone);
String utcTimeString = utcFormatter.format(new Date(utcEndTime)); SimpleDateFormat shanghaiFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
shanghaiFormatter.setTimeZone(shanghaiZone);
Date shanghaiDate = utcFormatter.parse(utcTimeString); // 注意这里可能会抛出ParseException
String shanghaiTimeString = shanghaiFormatter.format(shanghaiDate); // 现在可以使用shanghaiTimeString作为结果的一部分进行输出
注意:上述时区转换代码示例是为了说明如何进行时区转换,但在实际应用中,应该使用更健壮的日期时间处理库(如Java 8的java.time包)来避免潜在的解析和格式化错误。
SQL时间函数返回在流批任务中的异同
在Flink中,SQL时间函数在流批任务中的返回结果存在一些异同。这主要源于流处理和批处理在处理数据时的本质区别:流处理是实时、连续的数据处理,而批处理则是对静态、有界的数据集进行处理。
共同点
- 时间函数的存在:无论是流处理还是批处理,Flink都提供了一系列的时间函数,用于获取当前时间、日期或进行时间计算等。
- 时间类型的支持:Flink SQL支持多种时间类型,如TIME、TIMESTAMP等,这些类型在流批任务中都是通用的。
不同点
- 评估时机:
- 流处理:在流模式下,时间函数通常会对每条记录进行评估,即每次处理一条数据时都会调用时间函数以获取当前时间。例如,CURRENT_TIMESTAMP函数在流模式下会返回每条记录处理时的当前时间戳。
- 批处理:在批处理模式下,时间函数可能在查询开始时被评估一次,并对每一行使用相同的结果。这是因为批处理是对静态数据集进行操作,所以时间函数只需要在查询开始时获取一次时间值即可。然而,也有些时间函数(如CURRENT_ROW_TIMESTAMP())在批处理模式下仍然会对每个记录进行评估。
- 时间语义:
- 流处理:在流处理中,时间函数通常与事件时间、处理时间或摄入时间等时间属性相关联。事件时间是指数据实际发生的时间,处理时间是指数据到达Flink系统的时间,而摄入时间则是指数据被Flink系统接收并处理的时间(通常与处理时间相近,但可能因系统延迟而略有不同)。
- 批处理:在批处理中,由于数据集是静态的,所以时间函数通常只与处理时间相关,因为事件时间和摄入时间在批处理上下文中没有明确的意义。
- 时区处理:
- 在Flink中,时间函数返回的时间值通常与系统的时区设置相关。在流处理和批处理任务中,都需要考虑时区的影响以确保结果的准确性。然而,由于流处理可能涉及跨时区的数据传输和处理,因此在处理时区转换时可能需要更加谨慎。
示例
- 流处理:
SELECT CURRENT_TIMESTAMP, user_id, purchase_amount
FROM OrderLog
在流处理中,CURRENT_TIMESTAMP会为每条记录返回处理该记录时的当前时间戳。
- 批处理:
SELECT CURRENT_TIMESTAMP, SUM(purchase_amount) AS total_amount
FROM OrderTable
GROUP BY user_id
在批处理中,CURRENT_TIMESTAMP可能在查询开始时被评估一次,并对每一行使用相同的结果(取决于具体的Flink版本和配置)。然而,如果使用了CURRENT_ROW_TIMESTAMP()函数,则会对每个记录进行评估。
相关文章:
FLINK SQL时区问题
SQL时区问题 在Flink SQL中,时区问题是一个需要特别关注的点,因为时区的不一致可能会导致数据的不一致性。以下是对Flink SQL时区问题的详细解释和解决方案: 一、时区问题背景 时间类型与时区: 在Flink SQL中,时间类…...
LibreOffice SDK是LibreOffice软件的开发工具包
LibreOffice SDK是LibreOffice软件的开发工具包,它提供了一系列工具和库,使得开发者可以基于LibreOffice进行扩展或开发新的应用程序。以下是对LibreOffice SDK的详细介绍: 一、下载与安装 下载地址: 可以在LibreOffice的官方网站…...
第十五届蓝桥杯C/C++学B组(解)
1.握手问题 解题思路一 数学方法 50个人互相握手 (491)*49/2 ,减去7个人没有互相握手(61)*6/2 答案:1024 解题思路二 package 十五届;public class Min {public static void main(String[] args) {i…...
在docker的容器内如何查看Ubuntu系统版本
文章目录 写在前面一、问题描述二、解决方法参考链接 写在前面 自己的测试环境: docker 一、问题描述 由于 lsb_release -a 只能查看自己电脑(宿主机)的系统版本,如果在docker的容器内又应该如何查看Ubuntu系统版本呢ÿ…...
Google Play服务端获取订单和核销订单
官方文档地址:https://developers.google.cn/android-publisher/api-ref/rest/v3/purchases.products?hlzh-cn java依赖 <!-- google play --><dependency><groupId>com.google.apis</groupId><artifactId>google-api-services-and…...
Spring Security 与 OAuth 2.0 登录实现指南
文章目录 一、项目概述二、环境准备三、创建GitHub OAuth应用四、项目依赖配置五、配置OAuth 2.0六、创建控制器七、创建视图八、运行应用九、用户界面展示十、总结 在现代的Web应用中,安全性是一个不可忽视的因素。OAuth 2.0作为一种流行的授权框架,提供…...
02 django管理系统 - base.html模板的搭建
下面,我们正式开始XX市第X医院员工信息管理系统的开发 首先,我们项目的目录结构如下: 然后,先把模板【base.html】界面的框架搭起来 {% load static %}<!DOCTYPE html> <html lang"en"><head><m…...
ES6语法有哪些
ES6语法包括let和const声明、箭头函数、模板字符串、解构赋值、扩展运算符、类和模块化等。以下是这些特性的具体介绍: let和const声明 let声明:let允许程序员在块级作用域内声明变量,这意味着变量只在其定义的代码块(由大括号包围…...
每天一个数据分析题(五百零四)- 抽取样本
下列哪种方法,会重复抽取训练数据集中的数据,且每笔被抽中的概率始终保持一样? A. 袋装法(Bagging) B. 提升法(Boosting) C. 支持向量机(SVM) D. 以上皆是 数据分析…...
SAP动态安全库存(Dynamic Safety stock)配置及计算逻辑说明测试
SAP动态安全库存(Dynamic Safety stock)配置及计算逻辑说明测试 概念及计算逻辑: 动态安全库存(Dynamic Safety stock): 它根据平均的日需求(Average daily requirements)数量&am…...
什么是TDZ?在JavaScript当中怎么避免?
简介 TDZ 是 Temporal Dead Zone(暂时性死区)的缩写,是 JavaScript 中 let 和 const 变量的一个概念。在 ES6 中,let 和 const 引入了块级作用域(block scope),而它们声明的变量在声明之前的作…...
电阻分压电路:【图文讲解】
在电子电路中,电阻同样发挥着重要作用,同时也是一个最基本的元器件,电阻在电路中可以起到限流、分流、分压、发热的作用。 本节,我们重点来聊聊电阻的分压电路。如下图,是一个经典的电阻分压电路。 1:电路…...
【AI论文精读14】RAG论文综述2(微软亚研院 2409)P6(完)-隐含推理查询L4
AI知识点总结:【AI知识点】 AI论文精读、项目、思考:【AI修炼之路】 P1,P2,P3,P4,P5 六、隐藏推理查询(L4) ps:P2有四种查询(L1,L2,L3…...
FFmpeg的简单使用【Windows】--- 视频倒叙播放
实现功能 点击【选择文件】按钮可以选择视频,当点击【开始处理】按钮之后,会先将视频上传到服务器,然后开始进行视频倒叙播放的处理,当视频处理完毕之后会将输出的文件路径返回,同时在页面中将处理好的视频展示出来。…...
5分钟了解docker的Swarm机制
Swarm框架概述 1.1 Swarm的基本概念 在容器化技术的浪潮中,Docker无疑是最为耀眼的明星之一。而作为Docker生态系统中的重要组成部分,Swarm框架则扮演着至关重要的角色。Swarm,顾名思义,就是“群”的意思,它是一个开…...
python实现ppt转pdf
要实现将PPT文件转换为PDF文件,可以使用Python中的python-pptx库来读取PPT文件,并使用reportlab库来生成PDF。又或者,你也可以使用其他库如pypdf和pypptx等进行处理。 以下是一个使用unoconv工具以及Python的示例,可以将PPT转换为…...
VS2017 编译 SQLite3 动态库
首先官方下载源码: Tags sqlite/sqlite (github.com) 1.安装 VS2017 community edition 2.打开VS2017命令行工具 3.安装TCL 开发库,推荐 TCL 9.0 先下载源码: Tcl/Tk 9.0 使用vs2017编译tcl&...
Linux运维_Apache更改默认网站目录
1.首先创建目录 并且在目录下新建测试文件 index.html mkdir -p /home/test/ap_web 直接wget 百度官网 wget www.baidu.com 2.编辑配置文件 /etc/apache2/sites-available/000-default.conf(找到 DocumentRoot)更改为刚刚创建的目录 接着在添加 最终文件: 3.给文件 添加属…...
QT QString学习笔记
1.操作字符串 1.提供双元运算符 “” QString str1"cccc"; str1 str1 "ddddd"; qDebug()<<str1; qDebug()<<qPrintable(str1); 2.提供操作符 append() QString str1 "Good"; QString str2 "bye"; str1.append(str2); …...
4.stm32 GPIO输入
按键简介 按键:常见的输入设备,按下导通,松手断开 按键抖动:由于按键内部使用的是机械式弹簧片来进行通断的,所以在按下和松手的瞬间会伴随有一连串的抖动 传感器模块简介 传感器模块:传感器元件&#…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...
