Apache Doris 基础 -- 数据表设计(模式更改)
用户可以通过schema Change操作修改现有表的模式。表的模式主要包括对列的修改和对索引的修改。这里我们主要介绍与列相关的Scheme更改。对于与索引相关的更改,可以查看数据表设计/表索引,查看每个索引的更改方法。
1、术语
- 基本表(Base Table):创建每个表时,它对应于一个基表。
- Rollup:基于基表或其他上Rollup创建的上Rollup表。
- Index: 物化索引(materialized index)。汇总(Rollup )表或基表都称为物化索引。
- Transaction:每个导入任务都是一个事务,每个事务都有一个惟一的递增事务ID。
2、介绍
Light Schema Change
在介绍之前,有必要了解Apache Doris 1.2.0版本之前的三个Schema Change实现,它们都是异步的:
- 硬链接模式更改(
Hard Linked Schema Change
) 主要对值列进行加减操作,不需要修改数据文件。 - 直接模式更改(
Direct Schema Change
)主要用于更改值列的类型,需要重写数据,但不涉及键列,也不需要重新排序。 - 排序模式更改(
Sort schema change
)主要用于键列模式更改,因为键列加/减/修改类型等操作会影响现有数据的排序,所以需要将数据再次读出,修改,然后排序。
自Apache Doris 1.2.0以来,对于第一种类型,已经引入了轻量级模式更改(light schema change)的新特性。新的轻型模式更改允许在毫秒内完成值列的加减。从Apache Doris 2.0.0开始,默认情况下,所有新创建的表都支持轻模式更改。
除了添加和删除value列之外,其他类型的模式更改的主要原则如下:
执行模式更改的基本过程是从原始表/Index
数据中的数据/Index
生成新的模式表。数据转换主要有两部分,一部分是对已有历史数据的转换,另一部分是对执行模式更改时新导入的数据进行转换。
+----------+
| Load Job |
+----+-----+|| Load job generates both origin and new Index data|| +------------------+ +---------------+| | Origin Index | | Origin Index |+------> New Incoming Data| | History Data || +------------------+ +------+--------+| || | Convert history data| || +------------------+ +------v--------+| | New Index | | New Index |+------> New Incoming Data| | History Data |+------------------+ +---------------+
在开始转换历史数据之前,Doris将获取一个最新的事务ID,并等待该事务ID完成之前的所有导入事务。这个事务ID成为一个分水岭。这意味着Doris确保分水岭之后的所有导入任务将同时为原始表/索引和新表/索引生成数据。这样,当历史数据转换完成后,就可以保证新表中的数据是完整的。
创建模式更改的特定语法可以在帮助ALTER TABLE COLUMN的模式更改部分中找到。
3、将位于指定位置的列添加到指定索引
ALTER TABLE table_name ADD COLUMN column_name column_type [KEY | agg_type] [DEFAULT "default_value"]
[AFTER column_name|FIRST]
[TO rollup_index_name]
[PROPERTIES ("key"="value", ...)]
- 对于aggregate 模型,如果添加值列,则指定
agg_type
。 - 对于非聚合模型(例如,
DUPLICATE KEY
),如果添加键列,请指定KEY
关键字。 - 不能在 Rollup Index 中增加 Base Index 中已经存在的列(如有需要,可以重新创建一个 Rollup Index)。
Examples
- 在
example_rollup_index
的col1
之后添加一个键列new_col
(非聚合模型)
ALTER TABLE example_db.my_table
ADD COLUMN new_col INT KEY DEFAULT "0" AFTER col1
TO example_rollup_index;
- 向
example_rollup_index
添加一个值列new_col(非聚合模型),它在col1之后的默认值为0
ALTER TABLE example_db.my_table
ADD COLUMN new_col INT DEFAULT "0" AFTER col1
TO example_rollup_index;
- 在
example_rollup_index
的col1
之后添加一个键列new_col
(聚合模型)
ALTER TABLE example_db.my_table
ADD COLUMN new_col INT DEFAULT "0" AFTER col1
TO example_rollup_index;
- 向
example_rollup_index
添加col1
之后具有SUM聚合类型(聚合模型)的值列new_col
ALTER TABLE example_db.my_table
ADD COLUMN new_col INT SUM DEFAULT "0" AFTER col1
TO example_rollup_index;
4、向指定索引添加多个列
ALTER TABLE table_name ADD COLUMN (column_name1 column_type [KEY | agg_type] DEFAULT "default_value", ...)
[TO rollup_index_name]
[PROPERTIES ("key"="value", ...)]
- 对于聚合模型,如果添加值列,则指定
agg_type
。 - 对于聚合模型,如果添加键列,请指定
KEY
关键字。(?) - 不能向基本索引中已经存在的rollup索引添加列(如果需要,可以创建新的rollup索引)。
Example
向example_rollup_index
添加多个列(聚合模型):
ALTER TABLE example_db.my_table
ADD COLUMN (col1 INT DEFAULT "1", col2 FLOAT SUM DEFAULT "2.3")
TO example_rollup_index;
5、从指定索引中删除列
ALTER TABLE table_name DROP COLUMN column_name
[FROM rollup_index_name]
- 不能删除分区列。
- 如果是从 Base Index 中删除列,则如果 Rollup Index 中包含该列,也会被删除
Example
从example_rollup_index
中删除col2
列:
ALTER TABLE example_db.my_table
DROP COLUMN col2
FROM example_rollup_index;
6、修改指定索引的列类型和位置
ALTER TABLE table_name MODIFY COLUMN column_name column_type [KEY | agg_type] [NULL | NOT NULL] [DEFAULT "default_value"]
[AFTER column_name|FIRST]
[FROM rollup_index_name]
[PROPERTIES ("key"="value", ...)]
- 对于聚合模型,如果修改值列,则指定
agg_type
。 - 对于非聚合模型,如果修改键列,请指定KEY 关键字。
- **只有列类型可以修改,其他列属性保持不变(**即,其他属性需要显式写入语句中,参见例8)。
- 不能修改分区列和桶列。
- 目前支持以下类型转换(用户需要保证精度损失):
- 从TINYINT/SMALLINT/INT/BIGINT/LARGEINT/FLOAT/DOUBLE转换为更大的数字类型。
- 从TINYINT/SMALLINT/INT/BIGINT/LARGEINT/FLOAT/DOUBLE/DECIMAL到VARCHAR的转换。
- 修改VARCHAR的最大长度
- 从VARCHAR/CHAR转换为TINYINT/SMALLINT/INT/BIGINT/LARGEINT/FLOAT/DOUBLE。
- 从VARCHAR/CHAR到DATE的转换(支持六种格式:
"%Y-%m-%d", "%y-%m-%d", "%Y%m%d", "%y%m%d", "%Y/%m/%d", "%y/%m/%d"
) - 从DATETIME转换到DATE(仅保留年-月-日信息,例如:
2019-12-09 21:47:05 <--> 2019-12-09
) - 从DATE到DATETIME的转换(自动为小时、分钟和秒添加零,例如:
2019-12-09 <--> 2019-12-09 00:00:00
) - 从FLOAT到DOUBLE的转换
- 从INT到DATE的转换(如果INT类型数据无效,转换失败,原始数据保持不变)。
- 除了DATE和DATETIME以外的所有类型都可以转换为STRING,但是STRING不能转换为其他类型。
Examples
- 修改基索引中键列
col1
的列类型为BIGINT,并将其移动到列col2
之后
ALTER TABLE example_db.my_table
MODIFY COLUMN col1 BIGINT KEY DEFAULT "1" AFTER col2;
注意:无论是修改键列还是值列,都需要声明完整的列信息。
- 修改Base Index中列
val1
的最大长度。原来的val1
是(val1 VARCHAR(32) REPLACE DEFAULT "abc"
)
ALTER TABLE example_db.my_table
MODIFY COLUMN val1 VARCHAR(64) REPLACE DEFAULT "abc"
注意:在保持列的其他属性不变的情况下,只能修改列的类型。
- 修改duplicate key 表的键列中字段的长度
alter table example_tbl modify column k3 varchar(50) key null comment 'to 50'
7、为指定索引重新排序列
ALTER TABLE table_name ORDER BY (column_name1, column_name2, ...)
[FROM rollup_index_name]
[PROPERTIES ("key"="value", ...)]
- 应该列出索引中的所有列
- 值列在键列之后。
Example
重新排序索引example_rollup_index中的列(假设原始列顺序为:k1、k2、k3、v1、v2
)。
ALTER TABLE example_db.my_table
ORDER BY (k3,k1,k2,v2,v1)
FROM example_rollup_index;
8、在一次提交中执行多个更改
模式更改可以在单个作业中修改多个索引。
Example 1
可以使用以下命令将列k4添加到rollup1
和rollup2
,并将列k5添加到rollup2
:
ALTER TABLE tbl1
ADD COLUMN k4 INT default "1" to rollup1,
ADD COLUMN k4 INT default "1" to rollup2,
ADD COLUMN k5 INT default "1" to rollup2;
完成后,模式变为:
如所见,基表tbl1
自动包含列k4
和k5
。添加到rollup
中的任何列都将自动添加到基表中。
此外,不允许向rollup 中添加已经存在于基表中的列。如果用户需要这样做,他们可以使用附加列创建一个新的汇总,然后删除原始的汇总。
Example 2
ALTER TABLE example_db.my_table
ADD COLUMN v2 INT MAX DEFAULT "0" AFTER k2 TO example_rollup_index,
ORDER BY (k3,k1,k2,v2,v1) FROM example_rollup_index;
9、修改列名称
ALTER TABLE RENAME COLUMN old_column_name new_column_name;
10、检查作业状态
模式更改的创建是一个异步过程。作业提交成功后,用户需要使用SHOW ALTER TABLE COLUMN
命令查看作业的进度。
SHOW ALTER TABLE COLUMN
允许您查看当前正在执行或已完成的模式更改作业。当模式更改作业涉及多个索引时,该命令将显示多行,每行对应一个索引。例如:
mysql SHOW ALTER TABLE COLUMN\G;
*************************** 1. row ***************************JobId: 20021TableName: tbl1CreateTime: 2019-08-05 23:03:13FinishTime: 2019-08-05 23:03:42IndexName: tbl1IndexId: 20022
OriginIndexId: 20017
SchemaVersion: 2:792557838
TransactionId: 10023State: FINISHEDMsg: Progress: NULLTimeout: 86400
1 row in set (0.00 sec)
-
JobId:每个模式修改作业的唯一ID。
-
TableName:与模式更改相关联的基表的名称。
-
CreateTime:作业创建时间。
-
FinishTime:任务完成时间。如果未完成,则显示“N/A”。
-
IndexName:要修改的索引的名称。
-
IndexId:新索引的唯一ID。
-
OriginIndexId:旧索引的唯一ID。
-
SchemaVersion:以M:N的格式显示,其中M表示schema change 变更的版本,N表示对应的哈希值。版本随着每次模式更改而增加。
-
TransactionId: 转换历史数据的分水岭 Transaction ID。
-
State:当前工作的状态。
PENDING
:该作业正在等待调度队列中。WAITING_TXN
:等待边界事务ID完成前的导入任务。RUNNING
:正在进行历史数据转换。FINISHED
:工作成功完成。CANCELLED
:作业被取消。
-
Msg:如果任务失败,该字段显示失败消息。
-
Progress: 工作进展。只有状态为RUNNING时才会显示。进度以M/N的格式显示,其中N是模式更改中涉及的副本总数,M是完成历史数据转换的副本数量。
-
Timeout:作业超时(以秒为单位)。
11、取消作业
当任务状态不是FINISHED或CANCELLED时,可以使用以下命令取消模式修改任务:
CANCEL ALTER TABLE COLUMN FROM tbl_name;
说明
- 一次只能在一个表上运行一个模式更改作业。
- 模式更改操作不会阻塞导入和查询操作。
- 不能修改分区列和桶列。
- 如果模式包含使用
REPLACE
方法聚合的值列,则不允许删除键列。 - 如果键列被删除,Doris无法确定
REPLACE
列的值。 - Unique 数据模型表的所有非 Key 列都是 REPLACE 聚合方式。
- 在添加聚合类型为
SUM
或REPLACE
的值列时,该列的默认值对于历史数据没有任何意义。 - 由于历史数据丢失了详细信息,默认值不能反映实际的聚合值。
- 修改列类型时,除type外的所有字段都需要根据原列的信息填写。
- 例如,要将列k1从
INT SUM NULL DEFAULT "1"
修改为BIGINT
,命令如下:ALTER TABLE tbl1 MODIFY COLUMN k1 BIGINT SUM NULL DEFAULT "1"
; - 请注意,除了新的列类型之外,聚合方法、可空属性和默认值等其他属性都应该根据原始信息完成。
- 不支持修改聚合类型、可空属性、默认值或列注释。
FAQs
模式更改的执行速度
对于轻型模式更改(例如添加或删除Value列),执行速度可以在毫秒范围内。对于其他类型的Schema Change,在最坏的情况下,执行速度估计在10MB/s左右。作为保守的度量,用户可以根据这个速度设置作业超时。
错误:提交作业时提示“Table xxx is not stable
”
只有当表数据完成且处于平衡状态时,才能启动Schema Change。如果表的某些数据分片副本不完整,或者某些副本正在进行平衡操作,则提交将被拒绝。使用命令查看数据分片副本是否完成。
SHOW REPLICA STATUS FROM tbl WHERE STATUS != "OK";
如果返回任何结果,则表明副本存在问题。通常,系统将自动修复这些问题,但用户可以使用以下命令优先修复特定表:
ADMIN REPAIR TABLE tbl1;
使用实例查询是否有正在运行的均衡任务。
SHOW PROC "/cluster_balance/pending_tablets";
等待均衡任务完成或暂时停止均衡操作。
ADMIN SET FRONTEND CONFIG ("disable_balance" = "true");
配置
FE 配置
alter_table_timeout_second
:作业的默认超时时间,设置为86400秒。
BE 配置
alter_tablet_worker_count
:BE端用于执行历史数据转换的线程数。默认值是3。如果希望加速Schema Change作业,可以增大此参数并重新启动BE。然而,拥有太多的转换线程可能会增加IO压力并影响其他操作。该线程与Rollup作业共享。alter_index_worker_count
:BE端用于在历史数据上构建索引的线程数(目前只支持倒排索引)。默认值是3。如果要加速Index Change作业,可以增大此参数并重新启动BE。但是,线程太多可能会增加IO压力并影响其他操作。
更多细节
有关Schema Change的更详细语法和最佳实践,请参阅ALTER TABLE COLUMN命令手册。您也可以在MySQL客户端命令行中输入HELP ALTER TABLE COLUMN
获取更多帮助信息。
相关文章:
Apache Doris 基础 -- 数据表设计(模式更改)
用户可以通过schema Change操作修改现有表的模式。表的模式主要包括对列的修改和对索引的修改。这里我们主要介绍与列相关的Scheme更改。对于与索引相关的更改,可以查看数据表设计/表索引,查看每个索引的更改方法。 1、术语 基本表(Base Ta…...
【机器学习】【遗传算法】【项目实战】药品分拣的优化策略【附Python源码】
仅供学习、参考使用 一、遗传算法简介 遗传算法(Genetic Algorithm, GA)是机器学习领域中常见的一类算法,其基本思想可以用下述流程图简要表示: (图参考论文:Optimization of Worker Scheduling at Logi…...
电子电气架构 ---车载安全防火墙
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…...
解决selenium加载网页过慢影响程序运行时间的问题
在用selenium爬取动态加载网页时,发现网页内容都全部加载完了,但是页面还在转圈,并且获取页面内容的代码也没有执行,后面了解到selenium元素操作等方法是需要等待页面所有元素完全加载完成后才开始执行的,所以在页面未…...
何为云防护?有何作用
云防护又称云防御。随着Internet互联网络带宽的增加和多种DDOS 黑客工具的不断发布,云计算越演越热,DDOS拒绝服务攻击的实施越来越容易,DDOS攻击事件正在成上升趋势。出于商业竞争、打击报复和网络敲诈等多种因素,导致很多IDC 托管…...
2024050402-重学 Java 设计模式《实战责任链模式》
重学 Java 设计模式:实战责任链模式「模拟618电商大促期间,项目上线流程多级负责人审批场景」 一、前言 场地和场景的重要性 射击🏹需要去靶场学习、滑雪🏂需要去雪场体验、开车🚗需要能上路实践,而编程…...
centos7安装字体
1.安装命令 yum install fontconfig #字体库命令 yum install mkfontscale #更新字体命令2.安装字体(注意权限问题) 进入目录 /usr/share/fonts ,该目录是 centos7 字体库的默认安装目录。在该目录下创建一个文件夹 ekp (名字…...
Llama模型家族之使用 ReFT技术对 Llama-3 进行微调(三)为 ReFT 微调准备模型及数据集
LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (一) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (二) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (三) 基于 LlaMA…...
学习Canvas过程中2D的方法、注释及感悟一(通俗易懂)
1.了解Canvas: Canvas是前端一个很重要的知识点,<canvas>标签用于创建画布绘制图形,通过JavaScript进行操作。它为开发者提供一个动态绘制图形的区域,用于创建图标、游戏动画、图像处理等。 对于能够熟练使用Canvas的开发者…...
《TCP/IP网络编程》(第十三章)多种I/O函数(2)
使用readv和writev函数可以提高数据通信的效率,它们的功能可以概括为**“对数据进行整合传输及发送”**。 即使用writev函数可以将分散在多个缓冲中的数据一并发送,使用readv函数可以由多个缓冲分别接受,所以适当使用他们可以减少I/O函数的调…...
Java集合汇总
Java中的集合框架是Java语言的核心部分,提供了强大的数据结构来存储和操作对象集合。集合框架位于java.util包中,主要可以分为两大类:Collection(单列集合)和Map(双列集合)。下面是对它们的总结…...
度小满金融大模型的应用创新
XuanYuan/README.md at main Duxiaoman-DI/XuanYuan GitHub...
Android WebView上传文件/自定义弹窗技术,附件的解决方案
安卓内核开发 其实是Android的webview默认是不支持<input type"file"/>文件上传的。现在的前端页面需要处理的是: 权限 文件路径AndroidManifest.xml <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE"/&g…...
selenium 输入框、按钮,输入点击,获取元素属性等简单例子
元素操作 nput框 输入send_keys, input框 清除clear(), 按钮 点击click() 按钮 提交submit() 获取元素 tag_name、 class属性值、 坐标尺寸 """ input框 输入1次,再追加输入一次, 清除, 再重新输入&…...
结构体构造函数
【知识点:结构体构造函数】下面两段代码等价。 (1)结构体构造函数写法 struct LinkNode {int data;LinkNode* next;LinkNode(int x):data(x),next(NULL) {} }; LinkNode* Lnew LinkNode(123); (2)非结构体构造函数写…...
基于单片机的电子万年历设计
摘要: 本设计以 AT89C51 单片机为主控器,使用 DS1302 时钟芯片、DS18B20 温度芯片、LCD1602 显示模块,利用Proteus 仿真软件和 Keil 编译软件进行了基于单片机的电子万年历仿真,设计的万年历可以在液晶上显示时间,同时还具有时间校准、温度显示等功能。 关键词 :单片机…...
大厂真实面试题(一)
滴滴大数据sql 取出累计值与1000差值最小的记录 1.题目 已知有表t_cost_detail包含id和money两列,id为自增,请累加计算money值,并求出累加值与1000差值最小的记录。 2.分析 本题主要是想找到累加值域1000差距最小的记录,也就是我们要对上述按照id进行排序并且累加,并…...
Docker搭建ELKF日志分析系统
Docker搭建ELKF日志分析系统 文章目录 Docker搭建ELKF日志分析系统资源列表基础环境一、系统环境准备1.1、创建所需的映射目录1.2、修改系统参数1.3、单击创建elk-kgc网络桥接 二、基于Dockerfile构建Elasticsearch镜像2.1、创建Elasticsearch工作目录2.2、上传资源到指定工作路…...
把系统引导做到U盘,实现插上U盘才能开机
前言 有个小伙伴提出了这样一个问题:能不能把U盘制作成电脑开机的钥匙? 小白稍微思考了一下,便做了这样一个回复:可以。 至于为什么要思考一下,这样会显得我有认真思考他提出的问题。 Windows7或以上系统均支持UEF…...
【计算机网络基础知识】
首先举一个生活化的例子,当你和朋友打电话时,你可能会使用三次握手和四次挥手的过程进行类比: 三次握手(Three-Way Handshake): 你打电话给朋友:你首先拨打你朋友的电话号码并等待他接听。这就…...
个股场外期权个人如何参与买卖?
个股场外期权作为一种金融衍生品,为个人投资者提供了多样化的投资选择和风险管理工具。想要参与个股场外期权的买卖,以下是一些关键步骤和考虑因素。 文章来源/:财智财经 第一步:选择合适的金融机构 首先,个人投资者需…...
程序猿大战Python——pycharm软件的使用
基础配置 目标:了解PyCharm软件的基础配置处理。 修改背景颜色: Appearance -> Theme 修改字体大小: 搜索font -> Font 例如,一起完成背景、字体大小的修改。 总结: (1)如果要对PyChar…...
Unity Standard shader 修改(增加本地坐标裁剪)
本想随便找一个裁剪的shader,可无奈的是没找到一个shader符合要求,美术制作的场景都是用的都标准的着色器他们不在乎你的功能逻辑需求,他们只关心场景的表现,那又找不到和unity标准着色器表现一样的shader 1.通过贴图的透明通道做…...
【数据结构】排序——插入排序,选择排序
前言 本篇博客我们正式开启数据结构中的排序,说到排序,我们能联想到我之前在C语言博客中的冒泡排序,它是排序中的一种,但实现效率太慢,这篇博客我们介绍两种新排序,并好好深入理解排序 💓 个人主…...
2024.6.9刷题记录
目录 一、1103. 分糖果 II 1.模拟 2.数学 二、312. 戳气球 1.递归-记忆化搜索 2.区间dp 三、2. 两数相加 1.迭代 2.递归-新建节点 3.递归-原节点 四、4. 寻找两个正序数组的中位数 1.堆 2.双指针二分 五、5. 最长回文子串 1.动态规划 2.中心扩展算法 六、6. Z…...
Matlab|遗传粒子群-混沌粒子群-基本粒子群
目录 1 主要内容 2 部分代码 3 效果图 4 下载链接 1 主要内容 很多同学在发文章时候最犯愁的就是创新点创新点创新点(重要的事情说三遍),对于采用智能算法的模型,可以采用算法改进的方式来达到提高整个文章创新水平的目的&…...
31|HTTP3:甩掉TCP、TLS 的包袱,构建高效网络
前面两篇文章我们分析了HTTP/1和HTTP/2,在HTTP/2出现之前,开发者需要采取很多变通的方式来解决HTTP/1所存在的问题,不过HTTP/2在2018年就开始得到了大规模的应用,HTTP/1中存在的一大堆缺陷都得到了解决。 HTTP/2的一个核心特性是…...
2 程序的灵魂—算法-2.2 简单算法举例-【例 2.3】
【例 2.3】判定 2000 — 2500 年中的每一年是否闰年,将结果输出。 润年的条件: 1. 能被 4 整除,但不能被 100 整除的年份; 2. 能被 100 整除,又能被 400 整除的年份; 设 y 为被检测的年份,则算法可表示如下…...
Python中的上下文管理器(contextlib)模块
Python中的contextlib模块提供了一些用于创建和管理上下文管理器(context managers)的工具。上下文管理器是实现了__enter__()和__exit__()方法的对象,它们通常用于确保在代码块执行前后执行某些操作,比如资源获取与释放、设置和重…...
C语言:定义和使用结构体变量
定义和使用结构体变量 介绍基础用法1.定义结构体2. 声明结构体变量3. 初始化和访问结构体成员4. 使用指针访问结构体成员5. 使用结构体数组 高级用法6. 嵌套结构体7. 匿名结构体8. 结构体和动态内存分配9. 结构体作为函数参数按值传递按引用传递 介绍 在C语言中,结…...
百度云附件 wordpress/东莞seo外包平台
关于如何架设PT请参考:NexusPHP架设PT服务站点教程 安装完成后发现可以局域网内可以做种,但是外网就不行了,查看种子下载地址列表会显示可连接性为否,查看了announce.php文件,可连接性由这段代码决定 $sockres pfsock…...
seo批量建站/怎样创建自己的网站
回收宝给出的今年低配高价手机排名数据显示,国产手机四强的华为、OPPO、vivo的手机均上榜,仅有小米的手机未有入榜。回收宝给出的数据显示,今年低配高价手机前十名当中以三星Galaxy note20居于第一名,华为有四款手机入榜ÿ…...
云南微网站搭建费用/百度竞价推广是什么工作
参考网址: https://www.jianshu.com/p/2a4a39e3704f转载于:https://www.cnblogs.com/maohuidong/p/10487729.html...
宁波网站制作首推蓉胜网络好/百度指数api
文章目录前言1.功能开关的概念2.功能开关的优点一、ASP.NET Core中间件实现1.相关依赖2.中间件代码3.在管道中的使用4.修改配置控制二、IFeatureFilter过滤器1.过滤去代码2.配置文件3.改写功能开关中间件前言 1.功能开关的概念 功能开关,相当于可以控制访问的流转…...
品牌网站建设c重庆/如何做网络营销?
文章目录Search模块根据不同参数获取数据展示封装数据请求根据参数获取数据监听路由的变化再次发起请求获取数据Search模块根据不同参数获取数据展示 封装数据请求 由于Search模块搜索通常是多次,因此发送数据请求页会是多次,而在上一节中,…...
全屋定制十大名牌排行2023/北京seo推广外包
在上一篇文章里,我介绍了如何对一个简单的Activity进行单元测试。(参见上一篇)我们为Activity提供了两个参数LastName和FirstName,Activity会根据这两个参数生成一个Email地址。在上一篇中,我们输入了两个“合法”的参…...