doris:查询熔断
查询熔断是一种保护机制,用于防止长时间运行或消耗过多资源的查询对系统产生负面影响。当查询超过预设的资源或时间限制时,熔断机制会自动终止该查询,以避免对系统性能、资源使用以及其他查询造成不利影响。这种机制确保了集群在多用户环境下的稳定性,防止单个查询导致系统资源耗尽、响应变慢,从而提高整体的可用性和效率。
在 Doris 内,有两种熔断策略:
-
规划时熔断,即 SQL Block Rule,用于阻止符合特定模式的语句执行。阻止规则对任意的语句生效,包括 DDL 和 DML。通常,阻止规则由数据库管理员(DBA)进行配置,用以提升集群的稳定性。比如,
-
阻止一个查询扫描过多行的数据
-
阻止一个查询扫描过多的分区
-
阻止一个修改全局变量的语句,以防止集群配置被意外的修改。
-
阻止一个通常会占用非常多资源的查询模式
-
-
运行时熔断,即 Workload Policy,它是在运行时,实时监测查询的执行时间,扫描的数据量,消耗的内存,实现基于规则的查询熔断。
SQL Block Rule
按照阻止模式,可以分为:
- 扫描行数阻止规则
- 扫描分区数阻止规则
- 扫描分桶数阻止规则
- 查询语句正则匹配阻止规则
- 查询语句哈希值匹配阻止规则
阻止规则按照阻止范围,可以分为:
- 全局级别阻止规则
- 用户级别阻止规则
使用方法
全局级别阻止规则
CREATE SQL_BLOCK_RULE rule_001
PROPERTIES ("SQL"="select \\* from t","global" = "true","enable" = "true"
)
这样,我们就创建了一个全局级别的阻止规则。规则名为 rule_001。配置了查询语句正则匹配规则,用于阻止所有可以被正则 select \\* from t 所匹配的查询语句。
由于是全局级别的阻止规则,所以任意用户执行可以被上述正则匹配的语句都会被阻止。例如:
MySQL root@127.0.0.1:test> select * from t;
(1105, 'errCode = 2, detailMessage = errCode = 2, detailMessage = SQL match regex SQL block rule: rule_001')
用户级别阻止规则
CREATE SQL_BLOCK_RULE rule_001
PROPERTIES ("SQL"="select * from t","global" = "false","enable" = "true"
)
不同于全局级别的阻止规则。用户级别的阻止规则只对指定用户生效。当我们创建阻止规则时,设置属性"global"为"false"。那么这个阻止规则,将被视为用户级别的阻止规则。
为了使得用户级别的阻止规则生效。还需要为需要使用此规则的用户设置相应的属性。例如:
set property for 'root' 'SQL_block_rules' = 'rule_001';
这样,经过上面的配置,root 用户在执行查询时,将被应用名为 rule_001 的阻止规则。
MySQL root@127.0.0.1:test> set property for 'root' 'SQL_block_rules' = '';
Query OK, 0 rows affected
Time: 0.018s
MySQL root@127.0.0.1:test> select * from t;
+----+----+
| id | c1 |
+----+----+
| 1 | 1 |
+----+----+1 row in set
Time: 0.027s
MySQL root@127.0.0.1:test> set property for 'root' 'SQL_block_rules' = 'rule_001';
Query OK, 0 rows affected
Time: 0.008s
MySQL root@127.0.0.1:test> select * from t;
(1105, 'errCode = 2, detailMessage = errCode = 2, detailMessage = SQL match regex SQL block rule: rule_001')
- 如果想对一个用户添加多个用户级别的阻止规则。在规则列表中列举所有的规则名字,以英文逗号隔开。
- 如果想移除一个用户的所有用户级别阻止规则。将规则列表置为空字符串即可。
其他操作
如果需要修改或者删除阻止规则,可以参考阻止规则的 SQL 手册。
使用场景
可以在以下几种场景使用:
-
阻止扫描超过指定行数的数据
-
阻止扫描超过指定分区数量的数据
-
阻止扫描超过指定分桶数量的数据
-
阻止特定模式的查询
阻止扫描超过指定行数的数据
由于扫描数据会显著消耗 BE 的 IO 资源和 CPU 资源。所以,不必要的数据扫描会对集群的稳定性带来比较大的挑战。日常使用中,经常会出现盲目的全表扫描操作。例如 SELECT * FROM t。为了防止这种查询对集群产生破坏。可以设置单个查询扫描单表行数的上限。
CREATE SQL_BLOCK_RULE rule_card
PROPERTIES
("cardinality" = "1000","global" = "true","enable" = "true"
);
当设置了如上的规则,当单表扫描超过 1000 行时,将禁止此查询的执行。 需要注意,由于扫描行数的计算是在规划阶段,而非执行阶段完成的。所以计算行数时,只会考虑分区和分桶裁剪,而不会考虑其他过滤条件对于扫描行数的影响。也就是考虑最坏情况。所以,实际扫描的行数小于设置值的查询也有可能被阻止。
阻止扫描超过指定分区数量的数据
对过多分区的扫描会显著的增加 BE 的 CPU 消耗。同时,如果查询的外表,那更有可能带来显著的网络开销和元数据拉取的开销。在日常使用中,这多是由于忘记写分区列上的过滤条件或者写错导致的。为了防止这种查询对集群产生破坏。可以设置单个查询扫描单表的分区数的上限。
CREATE SQL_BLOCK_RULE rule_part_num
PROPERTIES
("partition_num" = "30","global" = "true","enable" = "true"
);
当设置了如上的规则,当单表扫描分区数超过 30 个时,则禁止此查询的执行。 需要注意的是,由于扫描分区数的计算是在规划阶段,而非执行阶段完成的。所以有可能出现因为分区裁剪不完全,而保留了更多分区的情况。所以,实际扫描的分区数小于设置值的查询也有可能被阻止。
阻止扫描超过指定分桶数量的数据
对过多分桶的扫描会显著的增加 BE 的 CPU 消耗。为了防止这种查询对集群产生破坏。可以设置单个查询扫描单表的分区数的上限。
CREATE SQL_BLOCK_RULE rule_teblet_num
PROPERTIES
("tablet_num" = "200","global" = "true","enable" = "true"
);
当设置了如上的规则,当单表扫描分桶数量超过 200 个时,则禁止此查询的执行。 需要注意的是,由于扫描分桶数的计算是在规划阶段,而非执行阶段完成的。所以有可能出现因为分桶裁剪不完全,而保留了更多分区的情况。所以,实际扫描的分桶数小于设置值的查询也有可能被阻止。
阻止特定模式的查询
由于各种原因,比如计算复杂度高,规划时间长等,可能会希望阻止使用模式的查询。 以阻止函数 abs 举例。可以使用如下的正则表达式阻止规则,完成此目的。
CREATE SQL_BLOCK_RULE rule_abs
PROPERTIES("SQL"="(?i)abs\\s*\\(.+\\)","global"="true","enable"="true"
);
上述正则表达式中
-
(?i) 表示大小写不敏感
-
abs 为想要阻止的目标函数
-
\s*表示在 abs 和左括号之间可以有任意个空白
-
\(.+\) 匹配函数参数 同理,也可以使用类似的方法阻止 set global,以防止非预期的变量改变。或者阻止 truncate table,以防止非预期的删除数据。
常见问题
Q:正则匹配阻止规则会对集群产生副作用吗?
A:是的。由于正则匹配是计算密集型的。当使用复杂的正则表达式,或者正则匹配规则过多时。会给 FE 的 CPU 带来显著的压力提升。所以,要谨慎添加正则匹配的阻止规则。除非必要,尽量不要使用复杂的正则表达式。
Q:可以临时关闭一个阻止规则吗?
A:可以。修改阻止规则,将其属性中的"enable"改为"false"即可。
Q:阻止规则中的正则表达式使用哪种规范?
A:阻止规则的正则表达式使用 java 的正则表达式规范。常用表达式可以参考 SQL 语法手册。完整的手册可以参考 Pattern (Java Platform SE 8 )
Workload Policy
SQL Block Rule 是一种在规划时进行熔断的配置,但是由于规划中代价的计算可能不准确(尤其是针对一些非常复杂的查询时,更加难以准确估算),所以会导致规则不生效或者误判。Workload Policy 弥补了这个缺陷,它可以在查询运行时对一些指标进行实时的监测,对运行时状态不符合预期的查询进行熔断,避免不符合预期的大查询占用过多资源从而影响集群的稳定性,常用的运行时监控指标如下:
- 查询执行时间
- 查询在单 BE 上的扫描行数
- 查询在单 BE 上的扫描行数扫描字节数
- 查询的在单 BE 上的内存使用
版本说明
自 Doris 2.1 版本起,可以通过 Workload Policy 可以实现大查询的熔断。
| 版本 | 2.1 |
|---|---|
| select | √ |
| insert into select | √ |
| insert into values | X |
| stream load | √ |
| routine load | √ |
| backup | X |
| compaction | X |
创建熔断策略
使用 CREATE WORKLOAD Policy 命令可以创建资源管理策略。
在下面的例子中创建一个名为 test_cancel_Policy 的 Policy,它会取消掉集群中运行时间超过 1000ms 的查询,当前状态为启用。创建 Workload Policy 需要 admin_priv 权限。
create workload Policy test_cancel_Policy
Conditions(query_time > 1000)
Actions(cancel_query)
properties('enabled'='true');
在创建 Workload Policy 时需要指定以下内容:
- Condition 表示策略触发条件,可以多个 Condition 串联,使用逗号“,”隔开,表示“与”的关系。在上例中 query_time > 1000 表示在查询时间大于 1s 时触发 Policy;目前支持的 Conditions 有:
| Conditions | 说明 |
|---|---|
| username | 查询携带的用户名,只会在 FE 触发 set_session_variable Action |
| be_scan_rows | 一个 SQL 在单个 BE 进程内 scan 的行数,如果这个 SQL 在 BE 上是多并发执行,那么就是多个并发的累加值。 |
| be_scan_bytes | 一个 SQL 在单个 BE 进程内 scan 的字节数,如果这个 SQL 在 BE 上是多并发执行,那么就是多个并发的累加值,单位是字节。 |
| query_time | 一个 SQL 在单个 BE 进程上的运行时间,时间单位是毫秒。 |
| query_be_memory_bytes | 一个 SQL 在单个 BE 进程内使用的内存用量,如果这个 SQL 在 BE 上是多并发执行,那么就是多个并发的累加值,单位是字节。 |
- Action 表示条件触发时采取的动作,目前一个 Policy 只能定义一个 Action(除 set_session_variable)。在上例中,cancel_query 表示取消查询;目前支持的 Actions 有:
| Actions | 说明 |
|---|---|
| cancel_query | 取消查询。 |
| set_session_variable | 触发 set session variable 语句。同一个 policy 可以有多个 set_session_variable 选项,目前只会在 FE 由 username Condition 触发 |
- Properties,定义了当前 Policy 的属性,包括是否启用和优先级。
| Properties | 说明 |
|---|---|
| enabled | 取值为 true 或 false,默认值为 true,表示当前 Policy 处于启用状态,false 表示当前 Policy 处于禁用状态 |
| priority | 取值范围为 0 到 100 的正整数,默认值为 0,代表 Policy 的优先级,该值越大,优先级越高。这个属性的主要作用是,当查询匹配到多个 Policy 时,只选择优先级最高的 Policy。 |
| workload_group | 目前一个 Policy 可以绑定一个 workload group,代表这个 Policy 只对某个 Workload Group 的查询生效。默认为空,代表对所有查询生效。 |
将熔断策略绑定 Workload Group
默认情况下,Workload Policy 会对所有支持的查询生效。如果想指定 Policy 只针对与某一个 Workload Group,需要通过 workload_group 选项绑定 Workload Group。语句如下:
create workload Policy test_cancel_big_query
Conditions(query_time > 1000)
Actions(cancel_query)
properties('workload_group'='normal')
注意事项
- 同一个 Policy 的 Condition 和 Action 要么都是 FE 的,要么都是 BE 的,比如 set_session_variable 和 cancel_query 无法配置到同一个 Policy 中。Condition be_scan_rows 和 Condition username 无法配置到同一个 Policy 中。
- 由于目前的 Policy 是异步线程以固定时间间隔执行的,因此策略的生效存在一定的滞后性。比如用户配置了 scan 行数大于 100 万就取消查询的策略,如果此时集群资源比较空闲,那么有可能在取消策略生效之前查询就已经结束了。目前这个时间间隔为 500ms,这意味着运行时间过短的查询可能会绕过策略的检查。
- 当前支持的负载类型包括 select/insert select/stream load/broker load/routine load。
- 一个查询可能匹配到多个 Policy,但是只有优先级最高的 Policy 会生效。
- 目前不支持 Action 和 Condition 的修改,只能通过删除新建的方式修改。
Workload Policy 效果演示
1 session 变量修改测试
尝试修改 Admin 账户的 session 变量中的并发相关的参数
// 登录 admin账户查看并发参数
mySQL [(none)]>show variables like '%parallel_fragment_exec_instance_num%';
+-------------------------------------+-------+---------------+---------+
| Variable_name | Value | Default_Value | Changed |
+-------------------------------------+-------+---------------+---------+
| parallel_fragment_exec_instance_num | 8 | 8 | 0 |
+-------------------------------------+-------+---------------+---------+
1 row in set (0.00 sec)// 创建修改admin账户并发参数的Policy
create workload Policy test_set_var_Policy
Conditions(username='admin')
Actions(set_session_variable 'parallel_fragment_exec_instance_num=1') // 过段时间后再次查看admin账户的参数
mySQL [(none)]>show variables like '%parallel_fragment_exec_instance_num%';
+-------------------------------------+-------+---------------+---------+
| Variable_name | Value | Default_Value | Changed |
+-------------------------------------+-------+---------------+---------+
| parallel_fragment_exec_instance_num | 1 | 8 | 1 |
+-------------------------------------+-------+---------------+---------+
1 row in set (0.01 sec)
2 大查询熔断测试
测试对运行时间超过 3s 的查询进行熔断,以下是一个 ckbench 的 q29 运行成功时的审计日志,可以看到这个 SQL 跑完需要 4.5s 的时间
mySQL [hits]>SELECT REGEXP_REPLACE(Referer, '^https?://(?:www\.)?([^/]+)/.*$', '\1') AS k, AVG(length(Referer)) AS l, COUNT(*) AS c, MIN(Referer) FROM hits WHERE Referer <> '' GROUP BY k HAVING COUNT(*) > 100000 ORDER BY l DESC LIMIT 25;
+-----------------------------------------------------------------------+------------------+----------+---------------------------------------------------------------------------------------------------------------------+
| k | l | c | min(Referer) |
+-----------------------------------------------------------------------+------------------+----------+---------------------------------------------------------------------------------------------------------------------+
| 1 | 85.4611926713085 | 67259319 | http://%26ad%3D1%25EA%25D0%26utm_source=web&cd=19590&input_onlist/би-2 место будущей кондицин |
| http:%2F%2Fwwww.regnancies/search&evL8gE&where=all&filmId=bEmYZc_WTDE | 69 | 207347 | http:%2F%2Fwwww.regnancies/search&evL8gE&where=all&filmId=bEmYZc_WTDE |
| http://новострашная | 31 | 740277 | http://новострашная |
| http://loveche.html?ctid | 24 | 144901 | http://loveche.html?ctid |
| http://rukodeliveresult | 23 | 226135 | http://rukodeliveresult |
| http://holodilnik.ru | 20 | 133893 | http://holodilnik.ru |
| http://smeshariki.ru | 20 | 210736 | http://smeshariki.ru |
| http:%2F%2Fviewtopic | 20 | 391115 | http:%2F%2Fviewtopic |
| http:%2F%2Fwwww.ukr | 19 | 655178 | http:%2F%2Fwwww.ukr |
| http:%2F%2FviewType | 19 | 148907 | http:%2F%2FviewType |
| http://state=2008 | 17 | 139630 | http://state=2008 |
+-----------------------------------------------------------------------+------------------+----------+---------------------------------------------------------------------------------------------------------------------+
11 rows in set (4.50 sec)
创建一个运行时间超过 3s 就取消查询的 Policy
create workload Policy test_cancel_3s_query
Conditions(query_time > 3000)
Actions(cancel_query)
再次执行 SQL 可以看到 SQL 执行会直接报错
mySQL [hits]>SELECT REGEXP_REPLACE(Referer, '^https?://(?:www\.)?([^/]+)/.*$', '\1') AS k, AVG(length(Referer)) AS l, COUNT(*) AS c, MIN(Referer) FROM hits WHERE Referer <> '' GROUP BY k HAVING COUNT(*) > 100000 ORDER BY l DESC LIMIT 25;
ERROR 1105 (HY000): errCode = 2, detailMessage = (127.0.0.1)[CANCELLED]query cancelled by workload Policy,id:12345相关文章:
doris:查询熔断
查询熔断是一种保护机制,用于防止长时间运行或消耗过多资源的查询对系统产生负面影响。当查询超过预设的资源或时间限制时,熔断机制会自动终止该查询,以避免对系统性能、资源使用以及其他查询造成不利影响。这种机制确保了集群在多用户环境下…...
多级缓存和数据一致性问题
一、什么是多级缓存? 多级缓存是一种分层的数据缓存策略,通过在不同层级(如本地、分布式、数据库)存储数据副本,结合各层缓存的访问速度和容量特性,优化系统的性能和资源利用率。其核心思想是让数据尽可能…...
计算机期刊推荐 | 计算机-人工智能、信息系统、理论和算法、软件工程、网络系统、图形学和多媒体, 工程技术-制造, 数学-数学跨学科应用
Computers, Materials & Continua 学科领域: 计算机-人工智能、信息系统、理论和算法、软件工程、网络系统、图形学和多媒体, 工程技术-制造, 数学-数学跨学科应用 期刊类型: SCI/SSCI/AHCI 收录数据库: SCI(SCIE),EI,Scopus,知网(CNK…...
全书测试:《C++性能优化指南》
以下20道多选题和10道设计题, 用于本书的测试。 以下哪些是C性能优化的核心策略?(多选) A) 优先优化所有代码段 B) 使用更高效的算法 C) 减少内存分配次数 D) 将所有循环展开 关于字符串优化,正确的措施包括ÿ…...
【教学类-58-14】黑白三角拼图12——单页1页图。参考图1页6张(黑白、彩色)、板式(无圆点、黑圆点、白圆点)、宫格2-10、张数6张,适合集体操作)
背景需求: 基于以下两个代码,设计一个单页1页黑白三角、彩色三角(包含黑点、白点、无点)的代码。 【教学类-58-12】黑白三角拼图10(N张参考图1张操作卡多张彩色白块,适合个别化)-CSDN博客文章…...
C++项目:高并发内存池_下
目录 8. thread cache回收内存 9. central cache回收内存 10. page cache回收内存 11. 大于256KB的内存申请和释放 11.1 申请 11.2 释放 12. 使用定长内存池脱离使用new 13. 释放对象时优化成不传对象大小 14. 多线程环境下对比malloc测试 15. 调试和复杂问题的调试技…...
消息队列性能比拼: Kafka vs RabbitMQ
本内容是对知名性能评测博主 Anton Putra Kafka vs RabbitMQ Performance 内容的翻译与整理, 有适当删减, 相关数据和结论以原作结论为准。 简介 在本视频中,我们将首先比较 Apache Kafka 和传统的 RabbitMQ。然后,在第二轮测试中,会将 Kaf…...
AP 场景架构设计(一) :OceanBase 读写分离策略解析
说明:本文内容对应的是 OceanBase 社区版,架构部分不涉及企业版的仲裁副本功能。OceanBase社区版和企业版的能力区别详见: 官网链接。 概述 当两种类型的业务共同运行在同一个数据库集群上时,这对数据库的配置等条件提出了较高…...
Java 大视界 -- Java 大数据在智能金融区块链跨境支付与结算中的应用(154)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
手把手教你在linux服务器部署deepseek,打造专属自己的数据库知识库
第一步:安装Ollama 打开官方网址:https://ollama.com/download/linux 下载Ollama linux版本 复制命令到linux操作系统执行 [rootpostgresql ~]# curl -fsSL https://ollama.com/install.sh | sh在Service中增加下面两行 [rootlocalhost ~]# vi /etc/…...
conda极速上手记录
什么是conda: Conda是一个跨平台的包管理工具和环境管理系统,支持Python、R、Java等多种语言。它能解决不同项目间的依赖冲突问题,例如: 项目A需要Python 3.6 NumPy 1.18; 项目B需要Python 3.10 NumPy 2.0。 通过创建独立环境&…...
C++ 继承:面向对象编程的核心概念(一)
文章目录 引言1. 继承的基本知识1.1 继承的关键词的区别1.2 继承类模版 2. 基类和派生类间的转换3. 继承中的作用域4. 派生类的默认成员函数4.1 默认成员函数的规则4.2 自己实现成员函数4.3 实现一个不能被继承的基类(基本不用) 引言 在C中,…...
蓝桥杯 临时抱佛脚 之 二分答案法与相关题目
二分答案法(利用二分法查找区间的左右端点) (1)估计 最终答案可能得范围 是什么 (2)分析 问题的答案 和 给定条件 之间的单调性,大部分时候只需要用到 自然智慧 (3)建…...
【图论】网络流算法入门
(决定狠狠加训图论了,从一直想学但没启动的网络流算法开始。) 网络流问题 • 问题定义:在带权有向图 G ( V , E ) G(V, E) G(V,E) 中,每条边 e ( u , v ) e(u, v) e(u,v) 有容量 c ( u , v ) c(u, v) c(u,v)&am…...
【算法day22】两数相除——给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求 不使用 乘法、除法和取余运算。
29. 两数相除 给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求 不使用 乘法、除法和取余运算。 整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345 将被截断为 8 &#x…...
《TypeScript 7天速成系列》第4天:TypeScript模块与命名空间:大型项目组织之道
在大型TypeScript项目中,良好的代码组织架构是保证项目可维护性的关键。本文将深入探讨TypeScript的模块系统和命名空间,为企业级项目提供最佳实践方案。 一、模块化开发:现代前端工程的基石 1.1 ES模块基础语法 TypeScript全面支持ES6模块…...
AutoCAD C#二次开发中WinForm与WPF的对比
在AutoCAD .NET二次开发中,选择WinForm还是WPF作为用户界面技术,需要根据项目需求、团队技能和AutoCAD版本等因素综合考虑。以下是详细对比: ## 1. 基础特性对比 | 特性 | WinForm | WPF | |------------|…...
关于服务器只能访问localhost:8111地址,局域网不能访问的问题
一、问题来源: 服务器是使用的阿里云的服务器,服务器端的8111端口没有设置任何别的限制,但是在阿里云服务器端并没有设置相应的tcp连接8111端口。 二、解决办法: 1、使用阿里云初始化好的端口;2、配置新的阿里云端口…...
基于ADMM无穷范数检测算法的MIMO通信系统信号检测MATLAB仿真,对比ML,MMSE,ZF以及LAMA
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 ADMM算法 4.2 最大似然ML检测算法 4.3 最小均方误差(MMSE)检测算法 4.4 迫零(ZF)检测算法 4.5 OCD_MMSE 检测算法 4.6 LAMA检测算法 …...
Linux 配置时间服务器
一、同步阿里云服务器时间 服务端设置 1.检查chrony服务是否安装,设置chrony开机自启,查看chrony服务状态 [rootnode1-server ~]# rpm -q chrony # rpm -q 用于查看包是否安装 chrony-4.3-1.el9.x86_64 [rootnode1-server ~]# systemctl enable --n…...
可视化web组态开发工具
BY组态是一款功能强大的基于Web的可视化组态编辑器,采用标准HTML5技术,基于B/S架构进行开发,支持WEB端呈现,支持在浏览器端完成便捷的人机交互,简单的拖拽即可完成可视化页面的设计。可快速构建和部署可扩展的SCADA、H…...
深度学习驱动的车牌识别:技术演进与未来挑战
一、引言 1.1 研究背景 在当今社会,智能交通系统的发展日益重要,而车牌识别作为其关键组成部分,发挥着至关重要的作用。车牌识别技术广泛应用于交通管理、停车场管理、安防监控等领域。在交通管理中,它可以用于车辆识别、交通违…...
C++笔记-模板初阶,string(上)
一.模板初阶 1.泛型编程 以往我们要交换不同类型的两个数据就要写不同类型的交换函数,这是使用函数重载虽然可以实现,但是有以下几个不好的地方: 1.重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时&a…...
关于cmd中出现无法识别某某指令的问题
今天来解决以下这个比较常见的问题,安装各种软件都可能会发生,一般是安装时没勾选注册环境变量,导致cmd无法识别该指令。例如mysql,git等,一般初学者可能不太清楚。 解决这类问题最主要的是了解环境变量的概念&#x…...
绿联NAS安装内网穿透实现无公网IP也能用手机平板远程访问经验分享
文章目录 前言1. 开启ssh服务2. ssh连接3. 安装cpolar内网穿透4. 配置绿联NAS公网地址 前言 大家好,今天给大家带来一个超级炫酷的技能——如何在绿联NAS上快速安装cpolar内网穿透工具。想象一下,即使没有公网IP,你也能随时随地远程访问自己…...
d9-326
目录 一、添加逗号 二、爬楼梯 三、扑克牌顺子 添加逗号_牛客题霸_牛客网 (nowcoder.com) 一、添加逗号 没啥注意读题就是 注意逗号是从后往前加,第一位如果是3的倍数不需要加逗号,备注里面才是需要看的 count计数 是三的倍数就加逗号,…...
汇编(六)——汇编语言程序格式及MASM
汇编语言的实现也是先利用某种编辑器编写汇编语言源程序(*.ASM),然后经过汇编得到目标模块文件(*.OBJ)、连接后形成可执行文件(*.EXE)。 1、汇编语言程序的语句格式 汇编语源程序由语句序列构成…...
Win11+VS2022+CGAL5.6配置
1. CGAL库简介 CGAL(Computational Geometry Algorithms Library)是一个开源的计算几何算法库,主要用于处理几何问题和相关算法的实现。它提供了丰富的几何数据结构和高效算法,覆盖点、线、多边形、曲面等基本几何对象的表示与操…...
【Linux】MAC帧
目录 一、MAC帧 (一)IP地址和MAC地址 (二)MAC帧格式 (三)MTU对IP协议的影响、 (四)MTU对UDP协议的影响 (五)MTU对TCP协议的影响 二、以太网协议 &…...
Codeforces Round 1013 (Div. 3)(A-F)
题目链接:Dashboard - Codeforces Round 1013 (Div. 3) - Codeforces A. Olympiad Date 思路 找到第一个位置能凑齐01032025的位置 代码 void solve(){int n;cin>>n;vi a(n10);int id0;map<int,int> mp;for(int i1;i<n;i){cin>>a[i];mp[a…...
