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

MySQL的InnoDB存储引擎中的Buffer Pool机制

目录

Buffer Pool 简介

定义

为什么需要Buffer Pool

图解重点知识

Buffer Pool 的组成

数据页(Data Pages)

索引页(Index Pages)

插入缓冲页(Insert Buffer Pages)

undo页(Undo Pages)

自适应哈希索引(Adaptive Hash Index)

锁信息(Lock Information)

图解重点知识

Buffer Pool 的内存管理

控制块的作用与信息

碎片空间的产生与影响

图解重点知识

Buffer Pool 的页管理

如何管理空闲页(Free List)

如何管理脏页(Flush List)

如何提高缓存命中率

图解重点知识

LRU算法及其优化

标准LRU算法

MySQL中的LRU算法优化

图解重点知识

脏页的刷新机制

何时刷新脏页到磁盘

刷新时机的几种情况

图解重点知识

Buffer Pool大小的调整

调整参数innodb_buffer_pool_size

调整参数innodb_old_blocks_pct

图解重点知识

性能监控与优化

慢SQL监控

性能抖动问题

图解重点知识

总结

Buffer Pool的作用

管理策略

性能优化建议


Buffer Pool 简介

定义

Buffer Pool是MySQL数据库中的InnoDB存储引擎使用的一个内存区域,用来缓存数据库中的页(pages),以提高数据库的读写性能。每个页通常是16KB的大小,但这个大小可以根据配置进行调整。

为什么需要Buffer Pool
  1. 减少磁盘I/O操作:直接从磁盘读取或写入数据是相对缓慢的操作。Buffer Pool通过将频繁访问的数据页缓存到内存中,减少了对磁盘的直接访问次数,从而加快了数据的读取速度。

  2. 提高读写性能:当数据被修改时,首先在Buffer Pool中的页进行修改,然后将这些修改标记为“脏页”。之后,后台线程会定期将这些脏页刷新回磁盘,而不是每次修改都直接写入磁盘,这样可以减少磁盘写操作的频率,提高性能。

  3. 数据局部性原理:数据库操作往往遵循数据局部性原理,即最近访问过的数据很可能在不久的将来再次被访问。Buffer Pool利用这一原理,通过缓存最近访问的数据,提高了数据访问的速度。

  4. 预读和延迟写入:InnoDB可以预读认为将来可能会用到的数据页到Buffer Pool中,同时,数据的修改(脏页)会延迟写回磁盘,这样可以优化整体的I/O性能。

图解重点知识

以下是使用Mermaid绘制的Buffer Pool的简化结构图,展示了数据页的读取和写入流程:

这个图说明了当客户端请求数据时,Buffer Pool首先检查请求的数据是否已经在内存中。如果是,就直接返回数据;如果不是,就从磁盘读取并缓存到Buffer Pool中,然后再返回给客户端。当客户端修改数据时,这些修改首先在Buffer Pool中进行,然后由后台线程负责将这些脏页刷新回磁盘。这个过程减少了对磁盘的直接操作,从而提高了数据库操作的性能。

Buffer Pool 的组成

Buffer Pool由多种类型的页组成,每种页都有其特定的用途和功能:

数据页(Data Pages)
  • 存储了实际的数据库表数据。

  • 通常大小为16KB。

索引页(Index Pages)
  • 存储了B+树索引结构,用于快速定位数据页。

  • 索引页允许快速访问和检索数据。

插入缓冲页(Insert Buffer Pages)
  • 用于优化插入操作,减少对索引页的直接写操作。

  • 插入缓冲可以收集多个插入操作,然后批量写入索引页。

undo页(Undo Pages)
  • 存储事务的逆操作信息,用于事务的回滚操作。

  • 保证事务的原子性和一致性。

自适应哈希索引(Adaptive Hash Index)
  • 提供对B+树索引的快速访问。

  • 自适应哈希索引可以根据使用情况动态调整大小。

锁信息(Lock Information)
  • 存储与数据页相关的锁信息,用于处理并发访问和事务的隔离。

图解重点知识

以下是使用Mermaid绘制的Buffer Pool的组成结构图,展示了不同类型页的存储和功能:

这个图展示了Buffer Pool中不同类型页的存储和它们的主要功能。数据页存储实际的数据,索引页提供快速的数据定位,插入缓冲页优化插入操作,undo页支持事务回滚,自适应哈希索引提供快速的索引访问,而锁信息则管理数据的并发访问。这种结构使得Buffer Pool能够高效地处理数据库的各种操作。

Buffer Pool 的内存管理

控制块的作用与信息

控制块(Control Block)是Buffer Pool中每个页的元数据部分,它包含了管理页所需的信息:

  • 页号:标识页在磁盘上的位置。

  • 表空间:标识页所属的表空间。

  • 页类型:如数据页、索引页等。

  • 链表节点:用于将控制块链接到其他管理结构,如LRU链表或Flush链表。

  • 状态信息:如是否是脏页、是否被锁定等。

控制块的存在使得Buffer Pool能够有效地跟踪每个页的状态,并进行相应的管理操作。

碎片空间的产生与影响

碎片空间(Fragmentation)是在Buffer Pool中由于页的分配和释放不连续导致的小块未使用的内存空间。产生原因和影响包括:

  • 非连续分配:随着页的不断加载和替换,可能会在Buffer Pool中留下小块的未使用空间。

  • 内存利用率下降:碎片空间不能被有效利用,导致内存利用率降低。

  • 管理开销增加:碎片空间需要被跟踪和管理,增加了系统的复杂性和开销。

为了减少碎片空间,可以通过合理配置Buffer Pool的大小,避免频繁的页替换,或者使用内存分配策略来优化空间的使用。

图解重点知识

以下是使用Mermaid绘制的Buffer Pool内存管理的简化结构图,展示了控制块和页的组织方式,以及碎片空间的影响:

这个图说明了Buffer Pool由控制块和缓存页组成,控制块包含了管理每个页所需的关键信息。缓存页是实际存储数据的区域。随着时间的推移和页的动态管理,可能会在Buffer Pool中产生碎片空间,这会影响内存的有效使用和管理效率。

Buffer Pool 的页管理

如何管理空闲页(Free List)
  • 空闲页链表(Free List):这是Buffer Pool中的一个链表结构,用于管理当前未被使用的空闲页。

  • 快速分配:当需要从磁盘加载新页到Buffer Pool时,系统会从Free List中取出一个空闲页进行使用。

  • 维护:系统必须维护这个链表,确保可以快速访问和释放空闲页。

如何管理脏页(Flush List)
  • 脏页链表(Flush List):记录了所有已经被修改但还没有刷新回磁盘的页。

  • 刷新机制:后台线程会定期检查Flush List,并将脏页刷新回磁盘,以保证数据的持久性。

  • 优先级:在某些情况下,如系统重启或页需要被替换出Buffer Pool时,脏页需要被优先刷新。

如何提高缓存命中率
  • LRU算法:Least Recently Used,最近最少使用算法,用于替换最长时间未被访问的页。

  • LRU优化:InnoDB对LRU算法进行了优化,通过划分young和old区域,优先保留频繁访问的数据。

  • 预读和批量操作:合理使用预读机制和批量操作可以减少磁盘I/O,提高缓存的效率。

图解重点知识

以下是使用Mermaid绘制的Buffer Pool页管理的简化结构图,展示了Free List和Flush List的管理方式:

这个图展示了Buffer Pool中页的管理策略,包括如何通过Free List快速分配空闲页,如何通过Flush List管理脏页并保证数据的持久性,以及如何通过LRU算法和其优化来提高缓存命中率。通过这些策略,Buffer Pool可以高效地管理内存中的页,减少对磁盘的访问,提高数据库的整体性能。

LRU算法及其优化

标准LRU算法
  • 最近最少使用:LRU算法的核心思想是将最近最少使用的页置换出去,以腾出空间给新的页。

  • 数据结构:通常使用一个双向链表来实现,最近访问的页在链表头部,最老的页在尾部。

  • 置换操作:当Buffer Pool满了,新页需要加载时,就从链表尾部移除页,并加载新页到头部。

MySQL中的LRU算法优化

MySQL对LRU算法进行了优化,以适应数据库操作的特点:

  1. young区域和old区域的划分

    1. 目的:区分频繁访问的“热”数据和较少访问的“冷”数据。

    2. young区域:新访问或频繁访问的页被放在这个区域,减少置换的可能性。

    3. old区域:较少访问的页在这个区域,当需要置换时,首先考虑这个区域的页。

  2. 预读失效问题

    1. 问题:预读机制可能会加载不常访问的页,导致实际需要的页被置换出去。

    2. 解决:通过限制预读页在LRU链表中的移动,减少其对热数据的影响。

  3. Buffer Pool污染问题

    1. 问题:大量不常访问的数据占据了Buffer Pool,导致热数据被置换。

    2. 解决:通过调整young和old区域的比例,以及控制页在old区域的停留时间,减少污染。

图解重点知识

以下是使用Mermaid绘制的MySQL中LRU算法优化的简化结构图,展示了young区域和old区域的划分以及预读失效和Buffer Pool污染问题的处理:

这个图展示了MySQL如何通过划分young和old区域来优化LRU算法,以及如何处理预读失效和Buffer Pool污染问题。通过这些优化,MySQL能够有效地提高缓存命中率,保证数据库操作的性能。

脏页的刷新机制

何时刷新脏页到磁盘

脏页是指在Buffer Pool中被修改过但还未写回磁盘的页。为了保证数据的一致性和持久性,脏页需要在适当的时机刷新到磁盘。刷新脏页是InnoDB存储引擎中重要的后台操作。

刷新时机的几种情况
  1. Redo Log日志满了:为了保证事务的持久性,每当事务提交时,InnoDB会先将修改记录到Redo Log中。当Redo Log达到一定大小后,系统会触发刷新操作,将脏页写回磁盘。

  2. Buffer Pool空间不足:当Buffer Pool需要为新的数据页腾出空间时,可能会选择将一些脏页刷新到磁盘,尤其是那些长时间未被访问的脏页。

  3. 后台线程刷新:InnoDB有专门的后台线程,定期检查Flush List,将脏页刷新到磁盘。这是为了保证数据的及时持久化。

  4. MySQL正常关闭:在数据库关闭过程中,为了保证数据不丢失,InnoDB会将所有的脏页刷新到磁盘。

  5. Checkpoint操作:InnoDB会周期性地执行Checkpoint操作,这是一种将脏页刷新到磁盘的过程,以减少系统重启后的恢复时间。

图解重点知识

以下是使用Mermaid绘制的脏页刷新机制的简化流程图,展示了脏页刷新的不同触发时机:

这个图展示了脏页刷新的几种主要触发时机,每种情况都是为了确保数据的安全性和系统的稳定性。通过这些机制,InnoDB能够平衡性能和数据一致性的需求。

Buffer Pool大小的调整

调整参数innodb_buffer_pool_size
  • 作用innodb_buffer_pool_size参数用于设置InnoDB Buffer Pool的大小。这是InnoDB用来缓存数据和索引的内存区域。

  • 配置:该参数可以根据服务器的物理内存大小和数据库的需要进行调整。较大的Buffer Pool可以提高缓存命中率,但会占用更多的内存资源。

  • 动态调整:在MySQL 5.7及以后的版本中,innodb_buffer_pool_size支持在线动态调整,无需重启数据库服务。

调整参数innodb_old_blocks_pct
  • 作用innodb_old_blocks_pct参数用于设置LRU链表中old区域所占的比例。

  • 配置:这个比例影响着young区域和old区域的划分,进而影响数据页在Buffer Pool中的生命周期。较高的比例意味着old区域更大,可能会减少对young区域热数据的影响。

  • 优化:根据工作负载的特点调整此参数,可以帮助减少Buffer Pool污染,提高缓存效率。

图解重点知识

以下是使用Mermaid绘制的Buffer Pool大小调整和LRU链表优化的简化结构图:

这个图展示了如何通过调整innodb_buffer_pool_sizeinnodb_old_blocks_pct参数来优化Buffer Pool的性能。通过合理配置这些参数,可以提高数据库操作的效率和响应速度,同时减少因内存不足或Buffer Pool污染导致的问题。

性能监控与优化

慢SQL监控
  • 目的:慢SQL监控是一种数据库性能监控手段,用于识别执行时间超过预定阈值的SQL语句。

  • 工具:可以使用MySQL的慢查询日志(slow query log)来记录慢SQL,并通过各种工具(如pt-query-digest等)进行分析。

  • 优化:通过分析慢SQL,可以对查询进行优化,比如添加索引、改写查询逻辑或调整数据库结构。

性能抖动问题
  • 原因:性能抖动可能是由于多种因素引起的,如脏页刷新、大量短连接、锁争用、资源竞争等。

  • 监控:通过监控系统负载、响应时间和事务吞吐量等指标,可以发现性能抖动的迹象。

  • 优化:解决性能抖动的方法包括增加Buffer Pool大小、优化SQL语句、调整锁策略、增加硬件资源等。

图解重点知识

以下是使用Mermaid绘制的性能监控与优化的简化流程图,展示了慢SQL监控和性能抖动问题的处理:

这个图展示了性能监控与优化的关键步骤,包括慢SQL监控和解决性能抖动问题的方法。通过这些监控和优化措施,可以提高数据库的性能和稳定性。

总结

Buffer Pool的作用

Buffer Pool是InnoDB存储引擎的核心组件之一,它的作用包括:

  • 提高I/O效率:通过将数据和索引缓存到内存中,减少对物理磁盘的访问次数。

  • 支持数据局部性:利用数据访问的局部性原理,预加载可能会访问的数据,提高访问速度。

  • 事务支持:通过undo页支持事务的回滚和MVCC(多版本并发控制)。

  • 脏页管理:记录数据的变更,并通过刷新机制确保数据的持久性。

管理策略

有效的Buffer Pool管理策略包括:

  • 页类型管理:区分数据页、索引页、插入缓冲页、undo页等,并合理使用。

  • 内存分配:使用控制块来跟踪每个页的状态和元数据。

  • LRU算法优化:采用young和old区域划分,优化页的替换策略。

  • 脏页刷新:通过后台线程和Checkpoint机制,适时刷新脏页到磁盘。

性能优化建议

为了进一步提升数据库性能,可以考虑以下建议:

  • 合理配置Buffer Pool大小:根据系统内存和工作负载调整innodb_buffer_pool_size

  • 优化LRU算法参数:调整innodb_old_blocks_pct,平衡young和old区域的比例。

  • 监控慢SQL:开启慢查询日志,定期审查并优化慢SQL语句。

  • 减少性能抖动:通过监控和分析,识别并解决性能抖动的原因。

  • 硬件和架构优化:在必要时增加服务器内存或使用更高性能的存储系统。

通过上述总结,可以看出Buffer Pool在InnoDB存储引擎中扮演着至关重要的角色,并且通过合理的配置和管理,可以显著提高数据库的性能和稳定性。

相关文章:

MySQL的InnoDB存储引擎中的Buffer Pool机制

目录 Buffer Pool 简介 定义 为什么需要Buffer Pool 图解重点知识 Buffer Pool 的组成 数据页(Data Pages) 索引页(Index Pages) 插入缓冲页(Insert Buffer Pages) undo页(Undo Pages&a…...

5. MongoDB 文档插入、更新、删除、查询

1. 插入文档 文档的数据结构和JSON基本一样。所有存储在集合中的数据都是BSON格式。 BSON是一种类似JSON的二进制形式的存储格式,是Binary JSON的简称。常用的插入文档方法包括: db.collection.insertOne():插入单个文档db.collection.inse…...

⌈ 传知代码 ⌋ DETR[端到端目标检测]

💛前情提要💛 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间,对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…...

Oracle之触发器

简介 触发器在数据库里以独立的对象存储,他与存储过程不同的是,存储过程通过其他程序来启动运行或直接启动运行而触发器是由一个事件来启动运行,即触发器是当某个事件发生时自动式运行。并企,触发器不能接收参数。所以运行触发器…...

从零搭建微前端架构:解耦大型项目的终极方案

随着前端应用的复杂度不断提升,单体前端应用(Monolithic Frontend)的维护和扩展难度也日益增加。微前端(Micro-Frontend)作为一种新兴架构理念,旨在将大型前端项目拆分为多个独立、可独立部署的微应用,从而提升项目的可维护性和灵活性。这篇文章将带你从零开始搭建一个微…...

24/8/17算法笔记 MPC算法

MPC算法,在行动前推演一下 MPC(Model Predictive Control,模型预测控制)是一种先进的控制策略,它利用未来预测模型来优化当前的控制动作。MPC的核心思想是,在每一个控制步骤中,都基于当前系统状…...

GROUP_CONCAT 用法详解(Mysql)

GROUP_CONCAT GROUP_CONCAT 是 MySQL 中的一个聚合函数,用于将分组后的多行数据连接成一个单一的字符串。 通常用于将某个列的多个值合并到一个字符串中,以便更方便地显示或处理数据。 GROUP_CONCAT([DISTINCT] column_name[ORDER BY column_name [ASC…...

Golang httputil 包深度解析:HTTP请求与响应的操控艺术

标题:Golang httputil 包深度解析:HTTP请求与响应的操控艺术 引言 在Go语言的丰富标准库中,net/http/httputil包是一个强大的工具集,它提供了操作HTTP请求和响应的高级功能。从创建自定义的HTTP代理到调试HTTP流量,h…...

SQLALchemy 分页

SQLALchemy 分页 1. 使用SQLAlchemy的`slice`和`offset`/`limit`SQLAlchemy 1.4及更新版本SQLAlchemy 1.3及更早版本使用第三方库注意事项在Web开发中,分页是处理大量数据时一个非常重要的功能。SQLAlchemy是一个流行的Python SQL工具包和对象关系映射(ORM)库,它允许开发者…...

快速上手体验MyPerf4J监控springboot应用(docker版快速开始-本地版)

使用MyPerf4J监控springboot应用 快速启动influxdb时序数据库日志收集器telegrafgrafana可视化界面安装最终效果 项目地址 项目简介: 一个针对高并发、低延迟应用设计的高性能 Java 性能监控和统计工具。 价值 快速定位性能瓶颈快速定位故障原因 快速启动 监控本地应用 idea配…...

C语言 之 strlen、strcpy、strcat、strcmp字符串函数的使用和模拟实现

文章目录 strlen的使用和模拟实现函数的原型strlen模拟实现:方法1方法2方法3 strcpy的使用和模拟实现函数的原型strcpy的模拟实现: strcat的使用和模拟实现函数的原型strcat的模拟实现: strcmp的使用和模拟实现函数的原型strcmp的模拟实现 本…...

CAPL使用结构体的方式组装一条DoIP车辆识别请求报文(payload type 0x0002)

DoIP车辆识别请求(payload type 0x0002)报文的格式为: /******************************************************** +--------+--------+--------+--------+ |version | inVer | type | +--------+--------+--------+--------+ | length …...

数据接入教学

数据接入教学 1、开通外部网络策略2、检查本地防火墙策略3、测试网络连通性4、工具抓包命令5、本地测试发送与监听 1、开通外部网络策略 保证外部网络联通、保证内部防火墙开通策略(可以关闭进行测试) 2、检查本地防火墙策略 关闭进行测试 停止firewa…...

炒作将引发人工智能寒冬

我们似乎经常看到人工智能的进步被吹捧为机器真正变得智能的一大飞跃。我将在这里挑选其中的一个例子,并确切解释为什么这种态度会为人工智能的未来埋下隐患。 这很酷,这是一个非常困难且非常具体的问题,这个团队花了3 年时间才解决。他们一定…...

clamp靶机复现

靶机设置 设置靶机为NAT模式 靶机IP发现 nmap 192.168.112.0/24 靶机IP为192.168.112.143 目录扫描 dirsearch 192.168.112.143 访问浏览器 提示让我们扫描更多的目录 换个更大的字典,扫出来一个 /nt4stopc/ 目录 目录拼接 拼接 /nt4stopc/ 发现页面中有很多…...

mfc100u.dll丢失问题分析,详细讲解mfc100u.dll丢失解决方法

面对mfc100u.dll文件丢失带来的挑战时,许多用户都可能感到有些无助,尤其是当这一问题影响到他们日常使用的软件时。但实际上,存在几种有效方法可以帮助您快速恢复该关键的系统文件。为了方便不同水平的用户,本文将详细解析各种处理…...

【C++】什么是内存管理?

如果有不懂的地方,可以看我以往文章哦! 个人主页:CSDN_小八哥向前冲 所属专栏:C入门 目录 C/C内存分布 C内存管理方式 new/delete操作内置类型 new/delete操作自定义类型 operator new与operator delete函数 new和delete实现…...

产业经济大脑建设方案(五)

为了提升产业经济的智能化水平,我们提出建设一个综合产业经济大脑系统,该系统通过整合大数据分析、人工智能和云计算技术,构建全方位的数据采集、处理和决策支持平台。该平台能够实时监测产业链各环节的数据,运用智能算法进行深度…...

如何在 Odoo 16 中覆盖创建、写入和取消链接方法

Odoo 是一款强大的开源业务应用程序套件,可为各种业务运营提供广泛的功能。其主要功能之一是能够自定义和扩展其功能以满足特定的业务需求。在本博客中,我们将探讨如何覆盖Odoo 16中的创建、写入和取消链接方法,从而使您无需修改​​核心代码…...

pip离线安装accelerate

一、离线下载到当前文件夹 pip download accelerate -d ./anzhuangbao# 制定版本使用以下命令pip download accelerate0.32.0 -d ./anzhuangbao二、离线安装 cd anzhuangbaipip install --no-index --find-links. accelerate三、验证是否安装 pip show accelerateAccelerate: …...

VUE3请求意外报跨越错误或者500错误问题

1.有可能是请求传参和传参类型写错了 首先要确保该请求接口是支持跨域的(不支持叫后端改) access-control-allow-headers:Content-Type, Accept, Access-Control-Allow-Origin, api_key, Authorization access-control-allow-methods:GET, POST, OPTIO…...

vue 关于两个if条件中的promise

一、案例效果 期望if判断条件里的两个promise 都同时执行完成 二、 初始代码案例 const formatDetail async (fnArgsJsonParams: MapLogicType) > {if (fnArgsJsonParams?.targetFeatureName) {const resDetailData await formatFeatureInfo(fnArgsJsonParams.targetF…...

C/C++移位运算问题

目录 上期答案揭晓: 回忆: 问题1展现: 问题2展现: 改进方案: 下期预告:C语言类型转换的问题。 上期答案揭晓: 上期的问题大家是否都有了想法,下面说说我的思路。 上次我们提到…...

录屏工具 Icecream Screen Recorder PRO v7.41

Icecream Screen Recorder的免费屏幕录制工具,具备捕捉视频、音频、图片和游戏等多种功能。以前推荐过的icecreamPDF也是他家的非常好用! 下载链接:「录屏」来自UC网盘分享https://drive.uc.cn/s/b474616b91534...

解决连接不上Linux和服务器中的Nacos(Windows中能连接但是Linux中却不行)

报错 com.alibaba.nacos.shaded.io.grpc.StatusRuntimeException: UNKNOWN: Uncaught exception in the SynchronizationContext. Re-thrown. at com.alibaba.nacos.shaded.io.grpc.Status.asRuntimeException(Status.jav 2024-08-13T10:21:52.93708:00 ERROR 27764 --- …...

【LLM大语言模型-开篇】LLM入门实践指南

"LLM入门实践指南"是一个通过代码实践,为大模型入门读者提供全面且较为深入的大模型技术视角的教程。 为何关注LLM? 创新与变革:LLM不仅推动了自然语言处理(NLP)领域的进步,还在诸多行业中催生了…...

实时视频换脸、8 万家 AI 公司消失、论文天价售卖、新的 scaling law、爆火毒舌 AI | AI 掘金视界周刊第 5 期

AI 视界周刊由战场小包维护,每周一更新,包含热点聚焦、应用破局、学术前沿、社区热议、智见交锋、跨界 AI、企业动态和争议 AI 八大板块,后续板块划分和内容撰写在周刊迭代过程中持续优化,欢迎大家提出建议。 欢迎大家来到《AI 视…...

XSS靶场(1-11关)

目录 简述xss xss第1关 xss第2关 ​编辑 xss第3关 xss第4关 xss第5关过滤了 on script xss第6关 xss第7关 xss第8关 xss第9关 xss第10关 xss11关 我把源代码靶场放到了最顶端 简述xss XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法…...

vue2 子组件props接收父组件对象或数组必须使用函数进行返回

export default{ name:MyComponent, props:{ title:{ type:String, default:"" }, age:{ type:Number, default:1 }, names:{ type:Array, //数组或对象必须用函数进行返回 default:function(){ return [] …...

【算法/学习】双指针

✨ 少年要迎着朝阳,活得肆无忌惮 🌏 📃个人主页:island1314 🔥个人专栏:算法学习 🚀 欢迎关注:👍点赞 &a…...

Springboot集成Liquibase笔记整理

添加依赖<dependency><groupId>org.liquibase</groupId><artifactId>liquibase-core</artifactId> </dependency>添加配置spring:liquibase:contexts: dev,testenabled: true编写liquibase配置类Configuration EnableConfigurationPropert…...

Python拆分无atlas图集(瑕疵版)

老板给了张没有atlas文件的图集让我拆图&#xff0c;简单写了一版凑合用。 存在的问题&#xff1a; 可能会拆出来一些小尺寸的透明像素图片&#xff1b;可能会拆出来一些偏大的小图的整体集合&#xff1b;可能会把应该是一块的小图批成两半&#xff0c;不过不多&#xff1b;其…...

SQLALchemy 排序

SQLALchemy 排序 基本用法多列排序使用函数或表达式进行排序注意事项在SQLAlchemy中,排序(Ordering)是通过order_by()方法实现的。这个方法允许你指定一个或多个列(或表达式),用于对查询结果进行排序。你可以指定升序(默认)或降序排序。 基本用法 假设你有一个User模…...

【iOS】Block底层分析

目录 前言Block底层结构Block捕获变量原理捕获局部变量&#xff08;auto、static&#xff09;全局变量捕获实例self Block类型Block的copyBlock作为返回值将Block赋值给__strong指针Block作为Cocoa API中方法名含有usingBlock的方法参数Block作为GCD API的方法参数Block属性的写…...

复现dom破坏案例和靶场

文章目录 靶场网址第一个实验步骤和原理(代码为示例要根据自己的实验修改) 第二个实验步骤和原理(代码为示例要根据自己的实验修改) 靶场网址 注册后点击 第一个实验 此实验室包含一个 DOM 破坏漏洞。注释功能允许“安全”HTML。为了解决这个实验&#xff0c;请构造一个 HT…...

【高校科研前沿】南方科技大学冯炼教授等人在遥感顶刊RSE发文:全球人类改造的基塘系统制图

1.文章简介 论文名称&#xff1a;Global mapping of human-transformed dike-pond systems&#xff08;全球人类改造的基塘系统制图&#xff09; 第一作者及单位&#xff1a;Yang Xu&#xff08;南方科技大学环境学院&#xff09; 第一通讯作者及单位&#xff1a;冯炼&#x…...

How to run angular CICD on gitlab-runner of wsl?

前提文件 .gitlab-ci.yml, .dockerignore, ci-funcs.sh, Dockerfile, karma.conf.js, nginx.conf, nginx-custom.conf, sonar-project.properties 1.test.ts const context require.context(./app/pages, true, /\.spec\.ts$/); 2.sonar-project.properties sonar.sourcessrc/…...

搭建Java集成开发环境IntelliJ IDEA

搭建Java集成开发环境&#xff08;Integrated Development Environment&#xff0c;简称IDE&#xff09;IntelliJ IDEA是一个涉及多个步骤的过程&#xff0c;旨在帮助Java开发者高效、舒适地进行编程工作。IntelliJ IDEA由JetBrains公司开发&#xff0c;以其强大的代码自动补全…...

JS逆向浏览器脱环境专题:事件学习和编写、DOM和BOM结构、指纹验证排查、代理自吐环境通杀环境检测、脱环境框架、脱环境插件解决

&#x1f310;JS逆向浏览器脱环境专题&#xff1a;事件学习和编写、DOM和BOM结构、指纹验证排查、代理自吐环境通杀环境检测、脱环境框架、脱环境插件解决 &#x1f5a5;️ 浏览器事件学习和编写 浏览器事件是用户与网页交互的主要方式&#xff0c;了解并掌握这些事件的处理方…...

驾校预约学习系统--论文pf

TOC springboot373驾校预约学习系统--论文pf 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域位置往往是人们思想上不可跨域…...

交叉编译ARM平台的OpenCV1.0

首先,从http://www.opencv.org.cn下载1.0的源码包,然后解压出来,进入解压后的目录,再进行下面的修改: 将configure 文件下列内容注释掉(有两处)&#xff0c;只保留GTK_CFLAGS"" 、GTK_LIBS"" 、have_gtkno 三项内容&#xff08;如下黑体所示&#xff09;&…...

牛客周赛 Round 56 AK

背景 语言艺术 A题&#xff1a;面包店故事 题意 一块面包要x元&#xff0c;加培根要y元&#xff0c;有n元&#xff0c;问能否买到加培根的面包 思路 大水题&#xff0c;gpt秒了 代码 #include <bits/stdc.h> using namespace std; int main() {int x, y, n; cin …...

LeetCode 热题 HOT 100 (038/100)【宇宙最简单版】

【动态规划】No. 0337 打家劫舍III【中等】&#x1f449;力扣对应题目指路 希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&a…...

SQLALchemy ORM 的关联关系之 ORM 中的一对一

SQLALchemy ORM 的关联关系之 ORM 中的一对一 场景示例实现一对一关系使用 `relationship()` 和外键(FK)插入和查询数据总结在 SQLAlchemy ORM 中,一对一(One-to-One)关联关系是一种比较少见的模型关系,但它确实有其应用场景,特别是在你需要将一个对象与另一个对象紧密绑…...

模型部署 - docker

docker简介 Docker 是一种开源的容器化平台&#xff0c;允许开发者将应用程序及其依赖项打包到一个标准化的单元中&#xff0c;称为“容器”。这些容器可以在任何支持 Docker 的系统上运行&#xff0c;无需担心环境差异。 为什么需要 Docker&#xff1f; 在传统的开发中&…...

学懂C++(三十四):深入详解 C++ 高级多线程编程技术中的并发设计模式

引言 在现代软件开发中&#xff0c;多线程编程已成为提升性能和响应能力的重要手段。设计模式为解决并发问题提供了有效的解决方案。本文将探讨常见的并发设计模式&#xff0c;包括生产者-消费者模式、读者-写者模式、单例模式、帧-工作者模式以及Future-Task模式&#xff0c;并…...

大数据产业链图谱_产业链全景图_大数据行业市场分析

数据作为新型生产要素&#xff0c;是数字化、网络化、智能化的基础&#xff0c;已快速融入生产、分配、流通、消费和社会服务管理等各环节&#xff0c;影响着千行百业&#xff0c;推动着我国数字经济的蓬勃发展。 大数据又称巨量数据、海量数据&#xff0c;是由数量巨大、结构…...

photonserver 部署相关教程

Photon Server 是 Exit Games 开发的高性能、可扩展的多人游戏服务器框架。部署 Photon Server 需要一些基础的服务器管理知识和配置技巧。以下是一个基本的部署教程&#xff0c;帮助你将 Photon Server 部署在 Windows 服务器上。 目录 1. 下载并安装 Photon Server 2. 配置…...

GEE训练:sentinel-1数据的投影、显示和导出

函数 projection() Returns the default projection of an Image. Throws an error if the bands of the image dont all have the same projection. 返回图像的默认投影。如果图像带的投影不一致,则会抛出错误。 Arguments: this:image (Image): The image from which …...

后端学习笔记(七)--MyBatis参数传递

5.MyBatis参数传递 ​ *MyBatis接口方法中可以接收各种各样的参数&#xff0c;MyBatis底层对于这些参数进行不同的封装处理方式 ​ *单个参数&#xff1a; 1.POJO类型&#xff1a;直接使用&#xff0c;属性名和参数占位符名称一致 2.Map集合&#xff1a;直接使用&#xff0c;…...