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

RisingWave 1.10 发布!新增用户自定义聚合函数

我们非常高兴地宣布:RisingWave 1.10 版本正式发布!新版本为大家带来了许多重要更新,例如:新增用户自定义聚合函数 (UDAF)、支持从游标获取多个更新、支持可溢出哈希 Join、增强 CDC 连接器、新增 Sink 连接器等。一起来了解本次更新的主要亮点吧!

1. 新增 UDAF

现在,您可以用 Python 和 JavaScript 创建嵌入式用户自定义聚合函数(User-defined Aggregate Function)。这些函数在 RisingWave 中定义,并使用嵌入式解释器执行。定义后,您可以像使用任何内置 SQL 聚合函数一样使用它们。创建 UDAF 需要使用 CREATE AGGREGATE 命令,其一般语法如下:

CREATE AGGREGATE function_name ( argument_type [, ...] )RETURNS return_typeLANGUAGE language_nameAS $$ function_body $$;

其中,函数体 (function_body) 内是一系列返回聚合值的函数,可以用 Python 或 JavaScript 定义。对于 UDAF,您必须定义 create_state 函数,它会创建一个新状态 (State),用于维护聚合函数的持续计算,促成高效的计算结果。您还必须定义 accumulate 函数,它更新并返回当前状态值。此函数将状态和来自聚合函数定义的输入参数作为参数。

此外,您可以选择定义 finish 函数,该函数返回聚合函数的结果,定义时必须将状态作为输入参数。如果您未定义此函数,则函数将返回当前状态。您还可以选择 retract 函数,它会撤回当前状态的值,然后返回该值。

UDAF 赋予了 RisingWave 更复杂的计算能力,让您在处理数据时更灵活更自主。

更多细节,请查看:

  • CREATE AGGREGATE
  • Embedded Python UDFs
  • Use UDFs in JavaScript

2. 从游标获取多个更新

在 v1.9 中,我们为订阅引入了子脚本和游标,允许您检索对表或物化视图所做的更新。以前,您只能使用 FETCH 命令逐行从游标中检索更新。现在,您可以指定从游标中检索多少行。以下 SQL 查询从游标 cur1 中检索四个最新的更新。

FETCH 4 FROM cur1;

此功能更方便您查看表和物化视图的最近更改。此外,结果表的列名已更新为与源表或物化视图的列名匹配,此前的格式为 table_name.col_name

更多细节,请查看:

  • Fetch from cursor

3. 支持可溢出哈希 Join

为提高 RisingWave 在 Join 两个大表时的性能,我们现在支持可溢出哈希 Join。目前,RisingWave 正在使用的是哈希 Join,哈希表在内存中构建,它们能够很好地并行化和扩展,但需要大量内存去构建,当表很大时,可能会导致内存不足问题。可溢出哈希 Join 解决了这个问题,在 Join 查询期间内存使用量高时,RisingWave 可以利用磁盘空间。

4. 对 CDC Source 连接器的增强

本次版本中,我们继续改进了现有 CDC Source 连接器,为您提供更流畅的流处理体验。此版本包含两个新功能:自动映射 Schema 和元数据列。但请注意,这些新功能并不适用于所有 CDC 连接器,因此请继续阅读以了解更多详情。

4.1 自动映射 Schema

在创建 MySQL 或 PostgreSQL CDC 表时,RisingWave 现在会自动将上游表的 Schema 映射到 RisingWave 表。创建表时可以使用 * 以从源表中导入所有列,而无需单独定义列。但是,如果在表创建过程中指定了其他列,则不能使用 *

让我们用一个简单例子说明这个过程。首先,我们用以下 SQL 查询连接到 MySQL 数据库。在从 MySQL 或 PostgreSQL 导入 CDC 数据时,您必须先创建一个 Source,用于连接到数据库,然后再从各个表中导入数据。

CREATE SOURCE mysql_source WITH (connector = 'mysql-cdc',hostname = '127.0.0.1',port = '3306',username = 'root',password = 'password',database.name = 'mydb',server.id = 5888
);

接下来,我们创建一个表,从 MySQL 数据库中上游表 tbl1 中导入所有列。mysql_tbl 的列将对应 tbl1 的列。

CREATE TABLE mysql_tbl (*)
FROM mysql_source TABLE 'mydb.tbl1';

此功能使在 RisingWave 中创建 CDC 表更加高效。

4.2 包含元数据列

在创建 MongoDB、MySQL 或 PostgreSQL CDC 表时,可以使用 INCLUDE 子句附加元数据列。如果需要将元数据列添加到已有的 CDC 表中,则需要在 RisingWave 中重新创建该表。

对于 MongoDB、MySQL 和 PostgreSQL CDC 表,您可以使用 INCLUDE 子句导入上游提交时间戳。对于历史数据,默认填充数据为 1970-01-01 00:00:00+00:00

  • 对于 MongoDB,您可以使用 INCLUDE 子句导入 collection_name
  • 对于 MySQL 和 PostgreSQL,您可以导入 database_nameschema_nametable_name

INCLUDE 子句的语法如下:

INCLUDE metadata_col [AS col_name];

metadata_col 可以是上述提到的任何元数据列。在表 Schema 定义之后,此子句可以在创建表时使用。

以下是一个示例,从 MySQL 表中导入元数据列 timestampdatabase_name

CREATE TABLE tbl_meta (id int,name varchar,age intPRIMARY KEY (id)
) INCLUDE TIMESTAMP AS commit_ts
INCLUDE DATABASE_NAME AS db_name
FROM mysql_source TABLE 'mydb.tbl2';

更多细节,请查看:

  • Ingest data from MySQL CDC
  • Ingest data from PostgreSQL CDC
  • Ingest data from MongoDB CDC

5. 增强现有 Sink 连接器

5.1 默认 Sink 解耦

对于 ClickHouse、Google Pub/Sub、Kafka、Kinesis、MQTT、NATS 和 Pulsar Sink 连接器,Sink 解耦将默认启用。之前,此功能只在 Sink 是 append-only 时才会启用,现在则不再有此限制。Sink 解耦会在 RisingWave 和下游系统之间插入一个缓冲队列,以确保 RisingWave 不受下游系统性能问题的影响。

如果您想禁用 Sink 解耦,请使用会话变量 sink_decouple

SET sink_decouple = false;

5.2 检查点解耦选项

对于 Delta Lake 和 StarRocks Sink 连接器,您可以使用 commit_checkpoint_interval 参数,将下游系统的 commit 与 RisingWave 的 commit 解耦。这意味着,RisingWave 将在达到指定的检查点间隔时提交数据,而不是在每个屏障处提交数据。

例如,如果 commit_checkpoint_interval 设置为 5,RisingWave 将间隔 5 个检查点提交一次数据。这可以减少生成的目标表版本,提升查询性能。

在创建 Delta Lake 或 StarRocks Sink 连接器时,commit_checkpoint_interval 参数应在 WITH 选项中指定。

CREATE SINK s1_sink FROM s1_source
WITH (connector = 'deltalake',type = 'append-only',location = 's3a://my-delta-lake-bucket/path/to/table',s3.endpoint = '<https://s3.ap-southeast-1.amazonaws.com>',s3.access.key = '${ACCESS_KEY}',s3.secret.key = '${SECRET_KEY}',commit_checkpoint_interval = 5
)

更多细节,请查看:

  • Sink decoupling
  • Sink data from RisingWave to Delta Lake
  • Sink data from RisingWave to StarRocks

6. 新增 Sink 连接器

RisingWave 一直在持续添加下游系统连接器,扩展其生态系统。我们现在支持将数据 Sink 到 DynamoDB 和 Microsoft SQL Server。如果您对特定连接器感兴趣,请参阅我们的集成页面。您可以投票以表示对特定连接器感兴趣,或在其可用时收到通知。

6.1 Amazon DynamoDB

Amazon DynamoDB 是一个 NoSQL 数据库,旨在处理高容量的结构化和半结构化数据。它提供一致的高性能和易扩展性。要将数据从 RisingWave Sink 到 DynamoDB 表,需使用 CREATE SINK 命令。Sink 到 DynamoDB 表时,您的 RisingWave 源表必须有一个由两列组成的复合主键。它们需要对应 DynamoDB 目标表中定义的分区键和排序键。

例如,如果您想 Sink 到名为 books_dynamo 的 DynamoDB 表,该表具有分区键 isbn 和排序键 edition,则 RisingWave 表 Schema 应定义如下:

CREATE TABLE IF NOT EXISTS books_rw (isbn varchar,edition int,title varchar,author varchar,primary key (isbn, edition)
);

然后再创建 Sink 连接器,将数据从 books_rw Sink 到 books_dynamo

CREATE SINK dynamo_sink
FROM movies
WITH (connector = 'dynamodb',table = 'books_dynamo',primary_key = 'isbn, edition',endpoint = '<http://localhost:8000>',region = 'region,access_key = 'access_key',secret_key = 'secret_key'
);

6.2 Microsoft SQL Server

Microsoft SQL Server 是一个强大的关系数据库管理系统,支持广泛的数据事务处理、商业智能等功能。它使用 T-SQL,并包括 SQL Server 集成服务、报告服务和分析服务等工具。RisingWave 支持将数据 Sink 到自托管的 SQL Server 和 Azure SQL。

以下是一个示例,我们创建了 Sink 连接器 sqlserver_sink,将数据从物化视图 mv1 Sink 到 SQL Server 表 sqlserver_tbl。因为这是一个 Upsert Sink ,我们定义了主键 pk1pk2

 CREATE SINK sqlserver_sinkFROM mv1WITH (connector = 'sqlserver',type = 'upsert',sqlserver.host = 'sqlserver-server',sqlserver.port = 1433,sqlserver.user = 'user',sqlserver.password = 'password',sqlserver.database = 'mydb',sqlserver.table = 'sqlserver_tbl',primary_key = 'pk1, pk2',
);

6.3 OpenSearch

OpenSearch 是一个开源的搜索和分析引擎,旨在实时搜索、分析和可视化大量数据。它源自 ElasticSearch,适用于日志和事件数据分析、企业搜索、监控观测等各种应用。

要将数据从 RisingWave Sink 到 OpenSearch,您可以使用 CREATE SINK 命令。

CREATE SINK opensearch_sink
FROM table1
WITH (connector = 'opensearch',index = 'id1',primary_key = 'types_id',url = '<http://opensearch:8080>',username = 'user',password = 'password'
);

更多细节,请查看:

  • Sink data from RisingWave to OpenSearch

7. 保留内存算法变更

现在,用于计算默认保留内存 (Reserved Memory) 的算法已更改。保留内存用于为 RisingWave 提供调整内存使用量的缓冲时间,以应对输入数据的额外涌入。之前,我们将计算节点总内存的 20% 用作保留内存。现在,保留内存的计算方式为:前 16GB 内存的 30% + 剩余内存的 20%。通过这种计算方法,保留内存可以根据您的设置进行扩展,更好地平衡系统性能和内存利用率。

如果此方法不适合您,您可以使用启动选项 --reserve-memory-bytes 或环境变量 RW_RESERVED_MEMORY_BYTES 指定保留内存,但需要注意,保留内存必须至少为 512MB。

更多细节,请查看:

  • Sink data from RisingWave to Amazon DynamoDB
  • Sink data from RisingWave to SQL Server
  • Sink data from RisingWave to OpenSearch

8. 总结

以上只是 RisingWave 1.10 版本新增的部分功能,如果您想了解本次更新的完整列表,请查看更详细的发布说明。

9. 关于 RisingWave

RisingWave 是一款开源的分布式流处理数据库,旨在帮助用户降低实时应用的开发成本。RisingWave 采用存算分离架构,提供 Postgres-style 使用体验,具备比 Flink 高出 10 倍的性能以及更低的成本。

👨‍🔬加入 RW 社区,欢迎关注公众号:RisingWave 中文开源社区

🧑‍💻想要了解和探索 RisingWave,欢迎浏览我们的官网:risingwave.com/

🔧快速上手 RisingWave,欢迎体验入门教程:github.com/risingwave

💻深入理解使用 RisingWave,欢迎阅读用户文档:zh-cn.risingwave.com/docs

相关文章:

RisingWave 1.10 发布!新增用户自定义聚合函数

我们非常高兴地宣布&#xff1a;RisingWave 1.10 版本正式发布&#xff01;新版本为大家带来了许多重要更新&#xff0c;例如&#xff1a;新增用户自定义聚合函数 (UDAF)、支持从游标获取多个更新、支持可溢出哈希 Join、增强 CDC 连接器、新增 Sink 连接器等。一起来了解本次更…...

Modbus通讯协议

Modbus通讯协议 Modbus协议是一种用于电子控制器之间的通信协议&#xff0c;‌它允许不同类型的设备之间进行通信&#xff0c;‌以便进行数据交换和控制。‌Modbus协议最初为可编程逻辑控制器&#xff08;‌PLC&#xff09;‌通信开发&#xff0c;‌现已广泛应用于工业自动化领…...

fal.ai发布超分辨率模型——AuraSR V2

今天&#xff0c;我们发布了单步 GAN 升频器的第二个版本&#xff1a; AuraSR。 我们在上个月发布了 AuraSR v1&#xff0c;社区的反响让我们深受鼓舞&#xff0c;因此我们立即开始了新版本的训练。 AuraSR 基于 Adobe Gigagan 论文&#xff0c;以 lucidrain 的实现为起点。Gi…...

SYD88xx代码复位不成功和解决办法

原来的复位代码如下: void ota_manage(void){#ifdef _OTA_if(ota_state){switch(ota_state){case 1 : #if defined(_DEBUG_) || defined(_SYD_RTT_DEBUG_)dbg_printf("start FwErase\r\n");#endifCmdFwErase();#if defined(_DEBUG_) || defined(_SYD_RTT_DEBUG_)db…...

加油,为Vue3提供一个可媲美Angular的ioc容器

为什么要为Vue3提供ioc容器 Vue3因其出色的响应式系统&#xff0c;以及便利的功能特性&#xff0c;完全胜任大型业务系统的开发。但是&#xff0c;我们不仅要能做到&#xff0c;而且要做得更好。大型业务系统的关键就是解耦合&#xff0c;从而减缓shi山代码的生长。而ioc容器是…...

RS485 CAN SPI IIC UART RS232这些通信协议传输距离、传输速度对比给出比较顺序-笔记(面试必备)

各类通信协议&#xff08;RS485、CAN、SPI、I2C、UART、RS232&#xff09;的传输距离和传输速度各有不同&#xff0c;适用于不同的应用场景。以下是这些通信协议的传输距离和传输速度的对比及排序&#xff1a; 传输距离比较&#xff08;从长到短&#xff09; RS485 最大传输距…...

高频JMeter软件测试面试题

近期&#xff0c;有很多粉丝在催更关于Jmeter的面试题&#xff0c;索性抽空整理了一波&#xff0c;以下是一些高频JMeter面试题&#xff0c;拿走不谢~ 一、JMeter的工作原理 JMeter就像一群将请求发送到目标服务器的用户一样&#xff0c;它收集来自目标服务器的响应以及其他统计…...

iptables netfilter

iptables -L --line...

如何使用Python自动发送邮件?

Python 提供了强大的内置库 smtplib 和 email&#xff0c;让我们能够轻松地发送各种类型的电子邮件。本指南将带你逐步了解如何使用 Python 发送邮件&#xff0c;从简单文本邮件到包含 HTML 内容、附件和内嵌图片的复杂邮件。 1. 准备工作&#xff1a; 1.1 安装必要的库 确保…...

C#中读写INI配置文件

在作应用系统开发时&#xff0c;管理配置是必不可少的。例如数据库服务器的配置、安装和更新配置等等。由于Xml的兴起&#xff0c;现在的配置文件大都是以xml文档来存储。比如Visual Studio.Net自身的配置文件Mashine.config&#xff0c;Asp.Net的配置文件Web.Config&#xff0…...

深入解析Spring中的@RequestMapping注解

RequestMapping是Spring框架中的一个核心注解&#xff0c;用于映射Web请求到处理器类的方法上。本文将详细介绍RequestMapping注解的用途、支持的属性以及如何在Spring MVC和Spring WebFlux中应用它。 1. 引言 在Spring框架中&#xff0c;RequestMapping是一个用于简化请求映…...

Python:lambda函数

lambda函数解释 Lambda函数&#xff0c;也被称为匿名函数&#xff0c;是Python等编程语言中用于创建简单、一次性使用的函数对象的一种快捷方式。在Python中&#xff0c;lambda函数使用lambda关键字定义&#xff0c;其后紧跟一个或多个参数&#xff08;用逗号分隔&#xff09;…...

MySQL查询语句

1. 一般查询 select * from table&#xff1b; 创建表&#xff1a;并插入数据&#xff0c;为下面的查询做例 create table info ( id int primary key, name varchar(10), score decimal(5,2), address varchar(20), hobbid int(5));insert into info values(1,liuyi,80,bei…...

远程连接服务

1.SSH协议握手流程 TCP三次握手后当前主机与远程服务器之间协商用哪种协议版本&#xff0c;ssh有两个&#xff08;ssh1/ssh2&#xff09;一般用ssh2&#xff0c;协商完后进入到密钥交换的阶段&#xff0c;客户端会生成一个公钥和一个私钥&#xff0c;公钥用来上锁&#xff0c;私…...

系统架构设计师——软件开发方法分类

分类 软件开发方法是指软件开发过程所遵循的办法和步骤&#xff0c;从不同的角度可以对软件开发方法进行不同的分类。 按照开发风范 软件开发过程中&#xff0c;开发方法的选择对项目的成功至关重要。这些方法可按照特定的开发风范分为自顶向下和自底向上两种主要策略&#…...

《看漫画学Python》全彩PDF教程,495页深度解析,零基础也能轻松上手!

前言 说起编程语言&#xff0c;Python 也许不是使用最广的&#xff0c;但一定是现在被谈论最多的。随着近年大数据、人工智能的兴起&#xff0c;Python 越来越多的出现在人们的视野中。 在各家公司里&#xff0c;Python 还常被用来做快速原型开发&#xff0c;以便更快验证产品…...

用户画像系列——Spark任务调优实践

在画像标签的加工和写入hbase中&#xff0c;我们采用了spark来快速进行处理和写入。但是在实际线上运行的过程中&#xff0c;仍然遇到了不少问题&#xff0c;下面来总结下遇到的一些问题 1.数据倾斜问题 其实spark 数据倾斜思路和hive、mapreduce 数据倾斜思路处理类似&…...

前端面试宝典【HTML篇】【4】

欢迎来到《前端面试宝典》,这里是你通往互联网大厂的专属通道,专为渴望在前端领域大放异彩的你量身定制。通过本专栏的学习,无论是一线大厂还是初创企业的面试,都能自信满满地展现你的实力。 核心特色: 独家实战案例:每一期专栏都将深入剖析真实的前端面试案例,从基础知…...

【UbuntuDebian安装MySQL】在线安装MySQL8

云计算&#xff1a;腾讯云轻量服务器 系统&#xff1a;Ubuntu-v22 1.更新系统软件包列表 打开终端并运行以下命令来确保你的系统软件包列表是最新的&#xff1a; sudo apt update2.安装 MySQL 存储库 MySQL 提供了官方的 APT 存储库&#xff0c;可以确保你安装的是最新版本…...

PDF翻译神器:这四款可以实现一键搞定,留学党必备!

外文的阅读还是需要一定的语言功底&#xff0c;现在大家也对外文越来越重视起来了&#xff0c;但是借助一些翻译工具进行翻译可以很大程度地提升工作的效率&#xff0c;就算是遇到批量的文件处理也可以一键翻译出来&#xff0c;所以今天借此文章整理了四款好用的pdf翻译工具&am…...

精心准备的高水平的博客【点评语】,来抄啊!

大家好&#xff0c;我是一名_全栈_测试开发工程师&#xff0c;已经开源一套【自动化测试框架】和【测试管理平台】&#xff0c;欢迎大家关注我&#xff0c;和我一起【分享测试知识&#xff0c;交流测试技术&#xff0c;趣聊行业热点】。 第 1 条 这篇博客文章如同灯塔般照亮了技…...

gitlab汉化

承接上文安装好gitlab 首先查看好gitlab的版本&#xff08;ps&#xff1a;要启动gitlab&#xff09; cat /opt/gitlab/embedded/service/gitlab-rails/VERSION我的版本是10.0.0 然后安装git yum install -y git然后克隆一下汉化的仓库 git clone https://gitlab.com/xhang/g…...

SSH访问控制:精确管理你的服务器门户

“ 在数字世界中&#xff0c;服务器的安全性是任何网络管理员的首要任务。特别是对于远程登录协议如SSH&#xff0c;确保只有授权用户可以访问是至关重要的。 今天&#xff0c;记录两种有效的方法来控制用户对特定服务器的访问&#xff1a;通过sshd_config实现黑/白名单机制和利…...

Java中的SSL/TLS安全通信实现

Java中的SSL/TLS安全通信实现 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;我们将探讨如何在Java中实现SSL/TLS安全通信。 一、什么是SSL/TLS SSL&#xff08;Secure Sockets La…...

2959. 关闭分部的可行集合数目

2959. 关闭分部的可行集合数目 题目链接&#xff1a;2959. 关闭分部的可行集合数目 代码如下&#xff1a; //参考链接:https://leetcode.cn/problems/number-of-possible-sets-of-closing-branches/solutions/2844227/guan-bi-fen-bu-de-ke-xing-ji-he-shu-mu-b-85ov class S…...

第十九天培训笔记

上午 1 、构建 vue 发行版本 [rootserver eleme_web]# nohup npm run serve& // 运行 vue 项目 [rootserver eleme_web]# mkdir /eleme [rootserver eleme_web]# cp -r /root/eleme_web/dist/* /eleme/ // 将项目整体 移动到 /eleme 目录下 [rootserver eleme_web]# …...

初学者编程指南:方法与资源推荐

一、引言 编程已成为当代大学生的必备技能&#xff0c;但面对众多编程语言和学习资源&#xff0c;新生们常常感到迷茫。如何选择适合自己的编程语言&#xff1f;如何制定有效的学习计划&#xff1f;如何避免常见的学习陷阱&#xff1f;编程不仅是技术领域的一项基本技能&#…...

【SpringBoot】数据验证之URL参数校验

URL参数校验 Validated public class UserController{ RequestMapping("/query"); public String query(Length(min2,max10,message"姓名长度错误&#xff0c;姓名长度2-10&#xff01;") RequestParam(name"name",requiredtrue)String name…...

目标检测 | yolov2/yolo9000 原理和介绍

前言&#xff1a;目标检测 | yolov1 原理和介绍 简介 论文链接&#xff1a;https://arxiv.org/abs/1612.08242 时间&#xff1a;2016年 作者&#xff1a;Joseph Redmon  作者首先在YOLOv1的基础上提出了改进的YOLOv2&#xff0c;然后提出了一种检测与分类联合训练方法&#…...

基于Raft算法的分布式KV数据库:一、开篇

项目描述&#xff1a;本项目是基于Raft算法的分布式KV数据库&#xff0c;保证了分布式系统的数据一致性和分区容错性&#xff0c;在少于半数节点发生故障时仍可对外提供服务。使用个人实现的分布式通信框架mpRPC和跳表数据库skipList提供RPC服务和KV存储服务。 github地址&…...

网站关键词代码怎么做/百度浏览器app

来源 &#xff1a;http://www.cnblogs.com/excelib/p/5150647.html 原文地址&#xff1a;http://www.excelib.com/article/287/show firewalld简介 Centos7中默认将原来的防火墙iptables升级为了firewalld&#xff0c;firewalld跟iptables比起来至少有两大好处&#xff1a; 1、…...

程序员做网站美工能过关吗/百度云搜索引擎官网

【Struts2国际化资源文件定义的3种范围方法】1&#xff09;全局的国际化资源文件&#xff0c;对所有的Action和View都有效定义方式&#xff1a;在struts.xml中增加全局资源文件定路径定义&#xff1a; <constant name"struts.custom.i18n.resources" value…...

怎么做用户调研网站/网络营销系统

CENTOS的备份和恢复其实非常简单&#xff0c;我们只要把全部文件用TAR打包就行&#xff0c;下次需要恢复的适合再解压开覆盖就可以了下面详解CENTOS备份和还原的过程tar打包命令的特点&#xff1a;1、保留权限2、适合备份整个目录3、可以选择不同的压缩方式4、如果选择不压缩还…...

网站建设需要资料/营销方案案例范文

MD5的全称是Message-Digest Algorithm 5&#xff0c;在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明&#xff0c;经MD2、MD3和MD4发展而来。 MD5将任意长度的“字节串”变换成一个128bit的大整数&#xff0c;并且它是一个不可逆的字符串变换算法&#xff0…...

恒基建设集团网站/58同城如何发广告

这个问题实际上就是iframe sandbox 沙盒绕过&#xff0c;iframe通过sandbox属性实现沙箱模式&#xff0c;允许js脚本执行&#xff0c;可直接引用第三方js文件来绕过。禁止iframe 里的javascript 执行 top.location self.location。 也就是禁止了跳转&#xff0c;绕过了反点击劫…...

网站 图标 素材/百度pc网页版登录入口

通过代码来实现判断每一个左括号是否都有与他能正确对应的右括号。 例子&#xff1a;( ( ) ( ( ) ) ( ) ) 我们可以通过观察发现&#xff0c;当出现第一个右括号的时候和他正确对应的左括号就是在他只出现之前的最后一个左括号&#xff0c;那么我们可以根据栈的&#xff08;后进…...