TiDB 7.4 发版:正式兼容 MySQL 8.0

MySQL 是全球最受欢迎的开源数据库,长期位于 DB-Engines Ranking 排行榜第二名,在世界范围内拥有数量庞大的企业用户和开发者。然而,随着时间的推移,MySQL 用户正面临新挑战。Oracle 官宣将在 2023 年 10 月终止 MySQL 5.7 版本的官方技术支持。据第三方统计显示,目前仍有超过一半的 MySQL 服务器运行在 5.7 版本。在未来几个月,大量的 MySQL 实例必须升级至 8.0 及更高版本,否则将无法享受 Oracle 提供的技术支持和重要补丁更新,企业级用户将面临重大考验。

TiDB 作为新一代分布式关系型数据库,从诞生第一天起拥抱 MySQL 生态,不断地兼容 MySQL 5.7 和 MySQL 8.0,为用户带来更加顺畅的迁移和使用体验。本文将介绍 TiDB 7.4 DMR 在 MySQL 8.0 兼容方面的新进展,探讨 TiDB 如何从根本上解决 MySQL 用户面临的各种挑战。

一、MySQL 用户的五大挑战

 升级影响业务连续性 。单实例或 "主从模式" 运行的 MySQL 升级时会造成数据库服务的停机,可能会对业务运营造成冲击。运行着大量 MySQL 实例的企业级用户,为了应对升级存在的潜在风险,需要投入大量的人力、物力进行测试和演练。

 业务规模扩展困难 。随着业务规模的扩大和数据使用场景的增多,用户通常需要在单机容量限制和分片管理复杂度之间进行权衡,数据库扩展的难度制约了业务规模和发展速度。

 缺乏极致高可用方案 。对于支撑核心业务场景的 MySQL 数据库来说,如果遇到不可预测的宕机事件,恢复业务变得复杂,达成极低的恢复时间目标(RTO)成为数据库管理员的挑战。

 实时分析能力不足 。MySQL 在处理大规模数据实时分析时性能不如在 OLTP(联机事务处理)场景下出色。这对于需要进行复杂查询和数据分析的业务是一个挑战。

 原厂托管服务受限 。虽然云服务商都会提供 MySQL 托管服务,但大多缺乏 Oracle 原厂的官方支持。这意味着在处理深层次的产品问题和发现通用功能需求时,用户无法获得来自数据库原厂的快速反馈和支持。

因此,迁移到一个成熟的产品并一举解决上述难题,无疑是明智之举。TiDB 就是 MySQL 全面升级的理想之选。选择 TiDB,不仅可以摆脱 MySQL 升级和扩展性的困境,还能够享受 HTAP、数据库整合等多方面的额外收益。

二、高度兼容 MySQL 的分布式关系型数据库 TiDB

TiDB 是由 PingCAP 自主研发的企业级分布式关系型数据库,具备水平扩缩容、金融级高可用、实时 HTAP、云原生、兼容 MySQL 5.7 协议和生态等重要特性。TiDB 采用原生分布式架构设计,具备灵活的弹性伸缩能力,整个过程对业务透明,无需人工干预。TiDB 的多副本存储和 Multi-Raft 协议确保数据的强一致性和高可用性,在部分副本发生故障时不影响数据的可用性。TiDB 通过滚动升级的方式使得版本更新的影响降至最低,此外可采用增加临时节点的方式,确保 TiDB 在升级过程中的性能波动和连接闪断控制在 5% 以内,大幅降低升级对业务的影响。

另外,作为 TiDB 的缔造者,PingCAP 基于全球领先云服务商推出数据库托管服务 TiDB Cloud,服务支持涵盖复杂问题诊断、升级支持、紧急救援等,充分体现了原厂服务的优势。

三、自 TiDB 7.4 DMR 开始,TiDB 正式兼容 MySQL 8.0

从项目初期开始,TiDB 坚持拥抱 MySQL 生态的产品战略一直延续至今。TiDB 兼容 MySQL 的 wire protocol 和语法命令,这意味着 MySQL 客户端、MySQL 驱动程序以及部分 MySQL 工具可以直接在 TiDB 上运行。对于绝大多数在 MySQL 上运行的应用程序来说,几乎不需要修改任何代码。

随着 MySQL 8.0 的发布,TiDB 在兼容 MySQL 5.7 的基础之上,积极扩展了对 MySQL 8.0 的兼容。TiDB v7.4.0 版本发布了对 MySQL 8.0 常用功能的支持,这使得平滑迁移 MySQL 8.0 的应用变得轻而易举。本文列举了部分功能:

3.1 公共表表达式(CTE)

作为 MySQL 8.0 引入的重要能力, TiDB 从 5.1 版本开始支持 ANSI SQL 99 标准的 CTE 及其递归的写法。在编写复杂查询的时候,利用公共表表达式 (CTE) 可以构建一个临时的中间结果集,在 SQL 语句中引用多次,提高 SQL 语句编写效率,可读性,执行效率。目前版本中,TiFlash 也同样支持 CTE。

比如表 authers 保存了作家的信息, book_authors 记录了作家 id 与其所编写书籍 id 的对应关系。

mysql> desc authors;
+------------+--------------+------+------+---------+-------+
| Field      | Type         | Null | Key  | Default | Extra |
+------------+--------------+------+------+---------+-------+
| id         | bigint(20)   | NO   | PRI  | NULL    |       |
| name       | varchar(100) | NO   |      | NULL    |       |
| gender     | tinyint(1)   | YES  |      | NULL    |       |
| birth_year | smallint(6)  | YES  |      | NULL    |       |
| death_year | smallint(6)  | YES  |      | NULL    |       |
+------------+--------------+------+------+---------+-------+
​
mysql> desc book_authors;
+-----------+------------+------+------+---------+-------+
| Field     | Type       | Null | Key  | Default | Extra |
+-----------+------------+------+------+---------+-------+
| book_id   | bigint(20) | NO   | PRI  | NULL    |       |
| author_id | bigint(20) | NO   | PRI  | NULL    |       |
+-----------+------------+------+------+---------+-------+

利用 CTE, 能够很容易编写出 SQL,列出最年长的 50 位作家分别编写过多少书籍。

mysql> WITH top_50_eldest_authors_cte AS (
    ->     SELECT a.id, a.name, (IFNULL(a.death_year, YEAR(NOW())) - a.birth_year) AS age
    ->     FROM authors a
    ->     ORDER BY age DESC
    ->     LIMIT 50
    -> )
    -> SELECT
    ->     ANY_VALUE(ta.id) AS author_id,
    ->     ANY_VALUE(ta.age) AS author_age,
    ->     ANY_VALUE(ta.name) AS author_name,
    ->     COUNT(*) AS books
    -> FROM top_50_eldest_authors_cte ta
    -> LEFT JOIN book_authors ba ON ta.id = ba.author_id
    -> GROUP BY ta.id;
+-----------+------------+----------------------+-------+
| author_id | author_age | author_name          | books |
+-----------+------------+----------------------+-------+
| 524470241 |         80 | Alexie Kirlin        |     7 |
|  67511645 |         80 | Bridgette Tromp      |     9 |
...
|  48355494 |         80 | Audrey Mayert        |     7 |
+-----------+------------+----------------------+-------+
50 rows in set (0.23 sec)
  • 相关文档: https://docs.pingcap.com/zh/tidb/stable/dev-guide-use-common-table-expression

3.2 窗口函数 (window function)

窗口函数(Window Function),又被叫做分析函数, 在对数据进行分析、汇总、排序时会被用到。窗口函数能够以 SQL 形式的写法,来完成一些复杂的数据整理工作,协助用户发掘数据价值。例如,数据分组排序, 变化趋势分析等。

TiDB 目前已经完整支持了 MySQL 8.0 提供的窗口函数,大部分可以下推到 TiFlash 运行。

  • 相关文档: https://docs.pingcap.com/zh/tidb/stable/window-functions

3.3 资源管控

TiDB 在 7.1 版本引入了资源管控,目的是能够对集群资源做合理分配,提升数据库的稳定性,并降低数据库的使用成本。在多个应用共享一个 TiDB 集群的场景下, 资源隔离可以有效降低应用负载变化对其他应用产生的影响, 资源管理还能解决批量作业及后台任务对核心业务的影响,以及突发的 SQL 性能问题拖慢整个集群,是提升大集群稳定性的重要能力。

尽管和 MySQL 的实现方式有差别,TiDB 兼容了 MySQL 指定资源组的语法以及 hint,降低用户学习成本和迁移成本。另外,TiDB 的资源隔离能够更有效地对最重要的 I/O 资源进行管控,达到和 MySQL 同等甚至更好的效果。

下面展示了利用资源管控,将 usr1 使用的所有资源控制在每秒 500 RU 以内。

● 预估集群容量

mysql> CALIBRATE RESOURCE

● 创建 app1 资源组,限额是每秒 500 RU

mysql> CREATE RESOURCE GROUP IF NOT EXISTS app1 RU_PER_SEC = 500;

● 将用户与资源组关联, usr1 的会话自动关联到资源组 app1

mysql> ALTER USER usr1 RESOURCE GROUP app1;

也可以修改会话所属的资源组

mysql> SET RESOURCE GROUP `app1`;

或者利用 hint RESOURCE_GROUP() 指定语句所属的资源组

mysql> SELECT /*+ RESOURCE_GROUP(rg1) */ * FROM t limit 10;
  • 相关文档: https://docs.pingcap.com/zh/tidb/stable/tidb-resource-control

3.4 基于角色的权限管理

TiDB 支持 MySQL 兼容的角色管理。基于角色的授权,可以简化权限管理的工作,并降低了出错的风险。通过将权限与角色相关联,可以更好地控制数据库的访问。客户可以将不同场景的工作进行分类,创建对应角色,并把角色授予有权限的数据库用户, 数据库用户在实际操作时,根据场景不同,切换角色,降低误操作的可能。

这里举一个利用角色拆分权限场景的例子。用户 dev_adm_usr 作为应用管理员,要操作数据库 app_db 的数据,多数情况下只是查询,偶尔在需要做数据修正的时候才会做修改。为了防止 dev_adm_usr 的误操作,我们将两部分权限利用角色拆开,只有必要的时候,才给自己赋予读写的角色。

● 创建角色 app_read_role 和 app_write_role

mysql> CREATE ROLE 'app_read_role', 'app_write_role';

● 为角色授予对应的权限,这里为两个角色分别授予 app_db 的读和写的权限

mysql> GRANT SELECT ON app_db.* TO 'app_read_role'@'%';
mysql> GRANT INSERT, UPDATE, DELETE ON app_db.* TO 'app_write_role'@'%';

● 将两个角色授予用户 dev_adm_usr

mysql> GRANT 'app_read_role','app_write_role' TO 'dev_adm_usr'@'localhost';

● 把 app_read_role 设为 dev_adm_usr 的默认角色,这样用户 dev_adm_usr 登录时默认是只读权限

mysql> SET DEFAULT ROLE 'app_read_role' TO 'dev_adm_usr'@'localhost';

● 当 dev_adm_usr 需要修改数据时,启用角色 app_write_role

mysql> SET ROLE app_read_role,app_write_role;

或者启用所有角色

mysql> SET ROLE ALL;
  • 相关文档: https://docs.pingcap.com/zh/tidb/stable/role-based-access-control

3.5 增强 uft8mb4 字符集

MySQL 8.0 的一个重要变化是默认字符集变成了更通用的 uft8mb4 ,默认排序方式变为 utf8mb4_0900_ai_ci 。TiDB 在新版本里也加入了 utf8mb4_0900_ai_ci 的排序方式,以便更轻松地进行系统迁移。

为了同时兼容 MySQL 5.7 和 MySQL 8.0,TiDB 支持了 MySQL 兼容的变量 default_collation_for_utf8mb4 。允许用户调整 utf8mb4 字符集的默认排序方式。这个方式确保了 TiDB 在不同 MySQL 版本之间的平滑过渡,并能够适应不同应用程序的需求。

如果从 MySQL 8.0 迁移,设为 8.0 默认排序 utf8mb4_0900_ai_ci

set global default_collation_for_utf8mb4='utf8mb4_0900_ai_ci';

如果从 MySQL 5.7 迁移,设为 5.7 为 utf8mb4 的默认排序 utf8mb4_general_ci

set global default_collation_for_utf8mb4='utf8mb4_general_ci';

3.6 JSON 多值索引 (Multi-valued Index)

在支持了 MySQL 5.7 的完整函数之后,TiDB 在不断添加对 MySQL 8.0 新发布功能的支持。最近的版本支持了"多值索引",允许对 JSON 类型中的某个"数组"进行索引,从而提高了对 JSON 数据的检索效率。与 MySQL 用法完全相同,这意味着在迁移过程中,无需修改数据建模或应用程序,用户可以继续按照熟悉的方式操作 JSON 数据。

多值索引是对普通索引结构的延伸。不同于普通索引与表 1:1 的对应关系, 多值索引与表的对应是 N:1。与 MySQL 相同, 条件中利用 MEMBER OF() , JSON_CONTAINS() , JSON_OVERLAPS() 这几个函数检索时,都可能会选择到多值索引。

比如,我们假定有一张客户信息表,所有详细信息以 JSON 格式编入一个 JSON 类型的列中, 其中有一个数组结构保存客户所在的几个城市。

当我们需要检索哪些客户在北京时,如果没有多值索引,这个查询需要扫描整张表。

SELECT name FROM customer
WHERE 'beijing' MEMBER OF $.city;

这时我们可以针对 city 这个数组创建多值索引,上述查询就可以利用索引检索符合的记录,大幅提升查询性能。

ALTER TABLE customers add index idx_city (name, (CAST(custinfo->'$.city' AS char(20) ARRAY)));

和普通索引一样, 当优化器没有选择到多值索引时,可以利用优化器提示 USE_INDEX() 或 USE_INDEX_MERGE() 强制优化器做选择。

  • 相关文档: https://docs.pingcap.com/zh/tidb/stable/choose-index#%E4%BD%BF%E7%94%A8%E5%A4%9A%E5%80%BC%E7%B4%A2%E5%BC%95

3.7 修改会话变量的 hint ( SET_VAR())

MySQL 8.0 引入了一个特殊的 hint SET_VAR() 。利用这个 hint,可以在语句运行期间修改某个会话级系统变量。TiDB 在 v7.4.0 也支持了这个 hint,提升了系统变量设置的灵活度, 能够针对 SQL 语句做“定制”。包括优化器相关的,执行时相关的多个变量都支持用 hint 修改。

比如,针对大表的分析处理,适当增加 SQL 的执行并行度。

SELECT /*+ set_var(tidb_executor_concurrency=20) */
    l_orderkey,
    SUM(
        l_extendedprice * (1 - l_discount)
    ) AS revenue,
    o_orderdate,
    o_shippriority
FROM
    customer,
    orders,
    lineitem
WHERE
    c_mktsegment = 'BUILDING'
AND c_custkey = o_custkey
AND l_orderkey = o_orderkey
AND o_orderdate < DATE '1996-01-01'
AND l_shipdate > DATE '1996-02-01'
GROUP BY
    l_orderkey,
    o_orderdate,
    o_shippriority
ORDER BY
    revenue DESC,
    o_orderdate
limit 10;

你也可以利用这个 hint 强制刚才的查询选择 TiFlash,而其他查询保持不变。

SELECT /*+ set_var(tidb_isolation_read_engines='tidb,tiflash') */
    l_orderkey,
    SUM(
        l_extendedprice * (1 - l_discount)
    ) AS revenue,
    o_orderdate,
    o_shippriority
FROM
    customer,
    orders,
    lineitem
WHERE
    c_mktsegment = 'BUILDING'
AND c_custkey = o_custkey
AND l_orderkey = o_orderkey
AND o_orderdate < DATE '1996-01-01'
AND l_shipdate > DATE '1996-02-01'
GROUP BY
    l_orderkey,
    o_orderdate,
    o_shippriority
ORDER BY
    revenue DESC,
    o_orderdate
limit 10;
  • 相关文档: https://docs.pingcap.com/zh/tidb/v7.4/optimizer-hints#set_varvar_namevar_value

3.8 CHECK 约束

CHECK 约束 是一致性约束检查的一种,用来维护数据的准确性。 CHECK 约束 可以用于限制表中某个字段的值必须满足指定条件。当为表添加 CHECK 约束 后,在插入或者更新数据时,TiDB 会检查约束条件是否满足,如果不满足,则会报错。

MySQL 在 8.0 之前只支持 CHECK 约束的语法,在实际运行中并不会真正去检查, 在 8.0 之后才全面支持。TiDB 在新版本中也添加了这个功能, 为了防止客户的 DDL 中有残存的 CHECK 条件,可能会因为这个特性产生问题,TiDB 默认并不会开启 CHECK 约束的检查,而是通过变量 tidb_enable_check_constraint 手工开启, 这充分体现了 TiDB 同时兼容 MySQL 5.7 和 8.0 的产品策略。

mysql> set global tidb_enable_check_constraint=on;
​
mysql> CREATE TABLE t
    -> ( a INT CHECK(a > 10) NOT ENFORCED, -- 不生效 check
    ->   b INT,
    ->   c INT,
    ->   CONSTRAINT c1 CHECK (b > c)
    -> );
​
mysql> insert into t values (20,20,20);
ERROR 3819 (HY000): Check constraint 'c1' is violated.
  • 相关文档: https://docs.pingcap.com/zh/tidb/dev/constraints#check-%E7%BA%A6%E6%9D%9F

四、TiDB 工具生态提供平滑迁移体验

为了降低用户数据迁移的复杂度,TiDB 推出了一款工具 TiDB Data Migration (DM) 。它能够协助用户从与 MySQL 协议兼容的数据库(MySQL、MariaDB、Aurora MySQL)到 TiDB 的全量数据迁移和增量数据同步。DM 支持 DDL 同步,分库分表合并,并内置多种过滤器以灵活适应不同场景,切实地提升了数据迁移的效率。

五、写在最后

TiDB 7.4 将是 TiDB 7 系列最后一个 DMR 版本,针对 MySQL 8.0 做出了诸多优化。作为 MySQL 的全面升级,TiDB 的技术领先性帮助用户应对不断变化的业务数据挑战,实现业务的持续增长和创新。TiDB 在高度兼容 MySQL 5.7 和 MySQL 8.0 特性的同时,也将持续提供技术支持,确保用户能够平滑地迁移各类业务应用程序,从而减少迁移过程中的工作量和风险。

点击下方链接,浏览 TiDB 7.4 Release Notes ,了解更多新增和优化特性。

TiDB 7.4.0 Release Notes | PingCAP 文档中心

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【小白福音】手把手教学搭建Vue+SpringBoot开发环境完整教程

前言:在很多新手小白在准备开发一个属于自己的前后端分离项目的时候需要准备一些例如Java环境配置、Node.Js配置、Maven配置以及软件安装等等,于本次博主亲自录制了一套完整的安装配置教程,提供到最后给大家进行下载。 注:本教程仅适用于小白,每一节课都是博主原创录制的,…

学 Java 怎么进外企?

作者&#xff1a;**苍何&#xff0c;CSDN 2023 年 实力新星&#xff0c;前大厂高级 Java 工程师&#xff0c;阿里云专家博主&#xff0c;土木转码&#xff0c;现任部门技术 leader&#xff0c;专注于互联网技术分享&#xff0c;职场经验分享。 &#x1f525;热门文章推荐&#…

《黑客帝国:破解编程密码》——探索编程世界的奥秘

文章目录 前言黑客帝国代码雨UbuntuLinux世界的奥秘如何在Ubuntu中查看系统信息科普推荐书籍后记 前言 在电影《黑客帝国》问世后&#xff0c;它不仅带来了震撼视觉体验&#xff0c;更在技术和编程领域产生了深远的影响。这部电影&#xff0c;让人们对计算机和编程的认识进一步…

0-1矩阵列互斥问题——回溯法 Python实现

三、 0-1 矩阵的列集互斥问题。给定一个 m n m \times n mn 的 0-1 矩阵 A \mathrm{A} A 。定义列互斥为: 对于矩阵 A A A 中的任意两列 i i i 和 j j j, 如果在对应的每一行上, i i i 和 j j j 不存在同时为 1 的情况, 则称列 i \mathrm{i} i 和 j \mathrm{j} j 互斥…

[动态规划] (四) LeetCode 91.解码方法

[动态规划] (四) LeetCode 91.解码方法 91. 解码方法 题目解析 (1) 对字母A - Z进行编码1-26 (2)11106可以解码为1-1-10-6或者11-10-6, 但是11-1-06不能解码 (3) 0n不能解码 (4) 字符串非空&#xff0c;返回解码方法的总数 解题思路 状态表示 dp[i]&#xff1a;以i为结…

Echats-自定义图表1

效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"zh-cmn-Hans"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>…

手机知识:手机“飞行模式”你真的会用吗,看完你就懂了

目录 “飞行模式”的实用技能 关于手机的谣言 回想一下&#xff0c;当你第一次知道手机上的“飞行模式”时&#xff0c;你认为这是一个怎样的功能&#xff1f; 普通青年&#xff1a;在飞机上要使用的模式。 文艺青年&#xff1a;手机终日忙忙碌碌&#xff0c;偶尔也需要放飞…

Java入门篇 之 逻辑控制(练习题篇)

博主碎碎念: 练习题是需要大家自己打的请在自己尝试后再看答案哦&#xff1b; 个人认为&#xff0c;只要自己努力在将来的某一天一定会看到回报&#xff0c;在看这篇博客的你&#xff0c;不就是在努力吗&#xff0c;所以啊&#xff0c;不要放弃&#xff0c;路上必定坎坷&#x…

宏观角度认识递归之汉诺塔问题

宏观角度认识递归 听到递归&#xff0c;不少人都会对此充满些迷惑&#xff0c;今天我们就从不同的角度来认识递归&#xff0c;消除恐惧。 递归&#xff0c;简单来说&#xff0c;就是函数自己调用自己的情况&#xff0c;也就是在一个主问题中&#xff0c;我们会引申出一个相同的…

STM32-电源管理(实现低功耗)

电源管理 STM32 HAL库对电源管理提供了完善的函数和命令。 工作模式&#xff08;高功耗->低功耗&#xff09;&#xff1a;运行、睡眠、停止、待机。 若备份域电源正常供电&#xff0c;备份域内的RTC都可以正常运行&#xff0c;备份域内的寄存器的数据会被保存&#xff0c;不…

家用洗地机哪个牌子质量最好?家用洗地机推荐

洗地机也就是集吸尘器&#xff0c;拖地&#xff0c;洗地&#xff0c;功能于一体的家电&#xff0c;无论干湿垃圾都能清理的干干净净&#xff0c;而且还不用弯腰&#xff0c;有的只用换个头&#xff0c;就从拖地变成了吸尘器和除螨仪简直就是清洁家里卫生的打扫神器啦!那么面对市…

Spring-Spring 之底层架构核心概念解析

BeanDefinition BeanDefinition表示Bean定义&#xff0c;BeanDefinition中存在很多属性用来描述一个Bean的特点。比如&#xff1a; class&#xff0c;表示Bean类型scope&#xff0c;表示Bean作用域&#xff0c;单例或原型等lazyInit&#xff1a;表示Bean是否是懒加载initMeth…

chatgpt接口调用

在线接口文档&#xff1a; https://app.apifox.com/invite?tokensymrLP7sojF6N31kZqnpZ 接口地址 https://chat.xutongbao.top/api/light/chat/createChatCompletion 请求方式 POST 请求参数 token String, 必须 prompt Array, 必须 例子一&#xff1a; 包含上下文 [ { "…

行政处罚类型有哪些?哪里能够查到一家企业的行政处罚信息?

在查询企业信息的时候&#xff0c;处理企业基础的工商信息之外&#xff0c;我们还会注意到到的就是企业的处罚信息。毕竟处罚可以直观反应出一个企业的违法违规行为&#xff0c;帮助我们直接了解企业。 那么&#xff0c;企业的行政处罚包括哪些内容呢&#xff1f; 根据《中华…

【MATLAB源码-第66期】基于麻雀搜索算法(SSA)的栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 麻雀搜索算法&#xff08;Sparrow Search Algorithm, SSA&#xff09;是一种新颖的元启发式优化算法&#xff0c;它受到麻雀社会行为的启发。这种算法通过模拟麻雀的食物搜索行为和逃避天敌的策略来解决优化问题。SSA通过模拟…

Macroscope安全漏洞检测工具简介

学习目标&#xff1a; 本介绍旨在帮助感兴趣者尽快了解 Macroscope&#xff0c;这是一款用于安全测试自动化和漏洞管理的企业工具。 全覆盖应用程序安全测试&#xff1a; 如下图所示&#xff0c;如果使用多种互补工具&#xff08;SAST/DAST/SCA 等&#xff09;来检测应用程序…

网络取证-Tomcat-简单

题干&#xff1a; 我们的 SOC 团队在公司内部网的一台 Web 服务器上检测到可疑活动。为了更深入地了解情况&#xff0c;团队捕获了网络流量进行分析。此 pcap 文件可能包含一系列恶意活动&#xff0c;这些活动已导致 Apache Tomcat Web 服务器遭到破坏。我们需要进一步调查这一…

解决uniapp的video标签和transition属性使用时出现错位的问题

template&#xff1a;三个视频都每个占满屏幕&#xff0c;点击按钮滚动最外层bgBox元素&#xff0c; style: 想要加上动画过渡效果&#xff1a; 这是显示第一个视频&#xff1a; 点按钮向上滑动滚动到第二个视频时&#xff1a; 视频错位了 &#xff0c;因为视频消失又出现的时候…

这两天公司面了一个字节来的要求月薪23K,明显感觉他背了很多面试题...

最近有朋友去字节面试&#xff0c;面试前后进行了20天左右&#xff0c;包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说&#xff0c;80%的人都会栽在第一轮面试&#xff0c;要不是他面试前做足准备&#xff0c;估计都坚持不完后面几轮面试。 其实&…

泡泡玛特首度跨界超跑品牌兰博基尼汽车,以潮流基因探索时空边界

近期&#xff0c;泡泡玛特携手兰博基尼汽车&#xff0c;于上海国际赛车场进行了一场玩味十足的赛道体验。25位兰博基尼车主&#xff0c;及多位汽车领域知名媒体人、kol到场参与。兰博基尼跑车巡游、专业车手驾驶的兰博基尼涂装赛车试乘、MEGA SPACE MOLLY 1000%/400%兰博基尼汽…
最新文章