深入解析MySQL Buffer Pool:从数据页到冷热分离的LRU优化

news2026/3/14 4:32:51
1. 从磁盘到内存为什么我们需要Buffer Pool想象一下你正在玩一个大型的开放世界游戏。每次你走到一个新的区域游戏都需要从你的硬盘里读取地图、建筑和NPC的数据。如果每次你转动视角、向前走一步游戏都要去读一次硬盘那你的体验会是什么样没错卡顿、延迟几乎没法玩。所以聪明的游戏引擎会把你“附近”和“可能要去”的区域数据提前加载到你的电脑内存里。这样当你在游戏世界里奔跑时感觉就无比流畅了。MySQL数据库处理数据的过程和这个例子惊人地相似。我们的数据最终都躺在硬盘磁盘上而磁盘的随机读写速度相比内存来说慢了好几个数量级。一次磁盘的随机I/O操作耗时可能在几毫秒到几十毫秒。对于现代互联网应用动辄每秒数万甚至数十万的请求来说如果每个请求都要直接读写磁盘数据库瞬间就会被压垮成为整个系统的性能瓶颈。Buffer Pool缓冲池就是MySQL InnoDB存储引擎为解决这个问题而设计的“游戏内存”。它是一块由数据库向操作系统申请出来的、专门用来缓存数据页Data Page的内存区域。它的核心使命只有一个尽可能让数据的读写操作发生在内存里而不是磁盘上从而将数据库的吞吐量提升几个量级。我刚开始接触数据库调优时曾在一个用户增长很快的项目里踩过坑。当时数据库的QPS每秒查询率突然开始飙升响应时间变长监控显示磁盘IO利用率长期处于高位。第一反应是加机器、升级硬盘但成本很高。后来经过排查发现问题根源就在于Buffer Pool的配置不合理默认的128MB大小对于当时的数据量来说简直是杯水车薪导致大量的查询无法在内存中找到数据不得不频繁地进行磁盘IO。当我根据服务器内存情况将其调整到几个GB后磁盘IO压力骤降性能立刻得到了肉眼可见的提升。这个经历让我深刻体会到理解并合理配置Buffer Pool是数据库性能优化的第一课也是最有效的手段之一。所以简单来说Buffer Pool就是数据库的“工作台”。我们所有的增、删、改、查操作实际上主要都是在这个内存工作台上对数据进行处理。只有需要持久化时或者需要从磁盘加载新数据时才会和磁盘打交道。接下来我们就拆开这个“工作台”看看它内部到底是如何精巧地组织起来的。2. Buffer Pool的基石数据页与缓存页要理解Buffer Pool如何工作我们得先搞清楚它在内存里管理数据的基本单位。这就引出了两个核心概念数据页Data Page和缓存页Buffer Pool Page / Cached Page。你可以把磁盘想象成一个巨大的仓库里面堆满了统一规格的“集装箱”每个集装箱的大小是固定的16KB。这个“集装箱”就是数据页。MySQL并不是以“一行数据”为单位在磁盘上存储的而是把很多行数据打包在一起塞进一个16KB的“集装箱”里。这些集装箱数据页里有的装的是用户表的记录数据页有的装的是帮助我们快速查找记录的目录索引页。当我们要读取或修改某一行数据时数据库引擎必须找到它所在的那个“集装箱”数据页然后把整个集装箱从仓库磁盘搬运到工作区内存里来操作。那么Buffer Pool这个“工作区”是怎么布置的呢它被划分成了一个个大小同样是16KB的“工位”每个工位正好可以容纳一个从磁盘搬过来的“集装箱”。这个内存中的“工位”我们就称之为缓存页。也就是说一个缓存页对应磁盘上的一个数据页它们是“一页对一页”的关系。这里有个非常关键的细节每个“工位”缓存页旁边还配有一张小卡片我们称之为描述数据块Description Block或者叫控制块Control Block。这张小卡片不大大约800字节左右但它非常重要。上面记录了关于这个工位上“集装箱”的元信息比如这个数据页来自哪个表空间表空间号、它的页编号是多少、这个页目前是被锁定了还是空闲的、它有没有被修改过是不是脏页、它被访问的频率如何等等。当MySQL启动时它会根据我们配置的innodb_buffer_pool_size参数比如20G向操作系统申请一块连续的内存。然后它就在这块大内存里像切豆腐一样整齐地划出一个个“16KB工位 800字节小卡片”的单元。所有的“工位”最初都是空的所有的小卡片则被串起来形成一个名单这个名单我们后面会讲到叫做Free List空闲链表用来管理哪些工位是可用的。我打个比方Buffer Pool就像一家高级餐厅的后厨。磁盘是远处的中央大仓库冷库数据页是打包好的食材箱每箱16KG。后厨Buffer Pool里有一排排标准规格的料理台缓存页每个台面大小正好放一箱食材。每个料理台旁贴着一张食材卡描述块记录这箱食材是什么表空间、页号、是否新鲜是否脏页、什么时候开始处理的访问时间。厨师SQL线程要处理一道菜执行查询/更新不会每次都跑去遥远的冷库而是先看后厨对应的料理台上有没有需要的食材箱。如果有直接取用如果没有就派人IO线程根据食材卡信息去冷库把整箱食材搬过来放到一个空闲的料理台上并更新旁边的食材卡。这样大部分烹饪数据操作都在高效的后厨完成极大提升了出菜查询响应速度。3. 内存管理的双链表Free List 与 Flush List了解了缓存页和描述块之后我们来看看Buffer Pool这位“大管家”是如何高效管理这几万甚至几十万个“工位”的。它主要依靠两个核心的双向链表Free List空闲链表和Flush List刷新链表。这两个链表管理的不是缓存页本身而是缓存页旁边的那个“描述数据块”。3.1 Free List哪里有空位当数据库刚启动时Buffer Pool里所有的缓存页都是空的、可用的。随着业务运行我们需要不断地把磁盘上的数据页加载到空闲的缓存页里。那么问题来了当需要加载一个新数据页时Buffer Pool怎么知道现在哪些“工位”是空的呢这就是Free List的职责。它是一个双向链表链表中每个节点就是一个空闲缓存页的描述数据块的地址。初始化时所有描述块都被加入到这个链表中。这个链表还有一个“基础节点”它不指向任何实际的缓存页只负责记录链表的头尾以及当前链表中有多少个空闲节点即有多少个空闲缓存页。工作流程是这样的当需要加载一个数据页时系统首先检查哈希表后面会讲看该页是否已在缓存中。如果不在就需要从磁盘加载。这时系统会访问Free List的基础节点从链表头部取出一个节点一个空闲描述块。根据这个描述块找到它对应的那个空闲的缓存页。然后发动IO操作将磁盘上指定的16KB数据页读取到这个缓存页中。同时更新这个描述块的信息填入数据页所属的表空间号、页号等元数据。最后也是关键的一步将这个描述块从Free List中移除。因为它对应的缓存页已经被占用了不再是“空闲”状态。这个过程就像餐厅经理分配料理台。后厨有一个“空闲台位表”Free List记录所有空着的料理台编号。来了一个新订单需要新数据页经理就从表头取一个台位号派小弟去冷库搬对应的食材箱放到这个台位上然后在“空闲台位表”里划掉这个号。随着订单增多空闲台位表越来越短。3.2 Flush List谁需要打扫现在我们有了Free List来管理空位数据可以源源不断地加载到内存中进行操作。当我们执行UPDATE语句修改了某个缓存页里的数据时内存中的数据就和磁盘上的原始数据不一致了。这个被修改过、但还没写回磁盘的缓存页我们称之为脏页Dirty Page。显然我们不能让脏页一直待在内存里最终需要把它们“打扫”干净——也就是刷新Flush回磁盘以保障数据的持久性。但Buffer Pool里可能有成千上万个缓存页我们不可能每次都把所有缓存页刷盘那样效率太低。我们只需要刷那些被修改过的脏页。于是Flush List登场了。它的结构和Free List类似也是一个通过描述块中的指针构成的双向链表。但Flush List链接的是所有被修改过的脏页的描述块。一旦某个缓存页的数据被修改InnoDB引擎除了标记该页为脏页外还会将其描述块加入到Flush List中。你可以把Flush List理解为后厨的“待清洗台位表”。厨师在一个料理台上处理完食材修改了数据这个台面就脏了。服务员会把这个台位的号码记到“待清洗表”Flush List里。打烊后或定时清洁工就按照这个表逐个清理这些脏台面将脏页异步刷回磁盘。清理完毕后这个台位并不会自动回到“空闲台位表”Free List因为上面还有食材数据。只有当食材被丢弃页面被淘汰后它才会重新变为空闲。这里有一个重要的机制Checkpoint检查点。InnoDB有后台线程会定期或不定期地扫描Flush List将一部分脏页刷新到磁盘。这样做的好处是可以将随机写磁盘操作合并提升IO效率同时也避免了在数据库关闭或崩溃恢复时需要刷新大量脏页导致的长时间等待。我们可以通过参数如innodb_max_dirty_pages_pct来控制Buffer Pool中脏页的比例防止脏页过多。4. 缓存淘汰的艺术LRU链表及其挑战随着系统持续运行Free List中的空闲缓存页会越来越少最终被用完。这时如果还需要从磁盘加载新的数据页到Buffer Pool该怎么办内存是有限的不可能无限制地加载数据。这就引出了计算机科学中一个经典问题缓存淘汰Cache Eviction。我们需要决定把哪个“旧”的缓存页清空腾出位置给“新”的数据页。InnoDB采用的策略是著名的LRULeast Recently Used最近最少使用算法。其核心思想是淘汰那些最长时间没有被访问过的缓存页。因为从概率上讲最近被访问过的数据在短期内再次被访问的可能性更大。为了实现LRUBuffer Pool引入了第三个核心链表LRU ListLRU链表。一个朴素的LRU链表实现是这样的所有已经被使用的缓存页非空闲页的描述块都会被加入到这个LRU链表中。链表头部Head代表“最近/最常被访问”MRUMost Recently Used链表尾部Tail代表“最近最少被访问”LRU。当需要访问某个缓存页时无论是读还是写就将该页的描述块移动到LRU链表的头部。当Free List为空需要加载新页时就淘汰LRU链表尾部的那个缓存页将其刷盘如果它是脏页然后清空腾出的空间用来加载新数据页同时新页的描述块被放到LRU链表头部。这个算法听起来很完美但在数据库的实际场景中却遇到了两个著名的“拦路虎”预读Read-Ahead和全表扫描Full Table Scan。预读机制带来的问题为了提升性能InnoDB有一个预读机制。当它判断你可能需要读取某个数据页相邻的数据时比如顺序扫描它会“自作主张”地将这些可能用到的数据页也提前加载到Buffer Pool中。这些被预读进来的页会立刻被放到朴素LRU链表的头部。问题是如果这个预判失误了这些预读页后续并没有被真正访问它们就占据了链表头部的位置反而把那些真正活跃的、经常被访问的热点数据页挤到了链表尾部导致热点数据被提前淘汰。这就像图书馆管理员根据你的借书单提前把你可能想看的邻居的书也拿来放在新书推荐区链表头结果这些书你根本没看却把真正畅销的书挤到了角落链表尾准备下架。全表扫描带来的问题当执行一个没有索引或需要扫描大量数据的查询时例如SELECT * FROM large_table数据库会顺序读取表中大量的、甚至是全部的数据页。这些数据页会被一次性加载到Buffer Pool并塞到LRU链表头部。然而这种查询可能只是偶尔发生一次。这些一次性使用的“冷数据”瞬间污染了整个LRU链表把真正的热点数据全部淘汰出去之后系统性能就会急剧下降因为热点数据需要重新从磁盘加载。我在实际运维中就遇到过因全表扫描导致的生产事故。一个开发同学在后台跑了一个分析脚本对大表进行了全表扫描。随后核心交易接口的响应时间从几十毫秒飙升到几秒。排查发现Buffer Pool的LRU链表被这次扫描的冷数据完全占据交易所需的索引页和数据页全部被挤出去了。解决这个问题除了优化查询更重要的是对LRU算法本身进行优化。MySQL的开发者们早就意识到了这个问题并设计了一套非常巧妙的解决方案。5. 化繁为简冷热分离的LRU链表优化为了解决朴素LRU算法在预读和全表扫描场景下的致命缺陷InnoDB的设计者提出了一个既简单又高效的思路冷热数据分离。他们不再使用一个单一的LRU链表而是将它劈成两半。优化后的LRU链表被分为两个区域热数据区域Young SubList / New Sublist链表的前5/8部分默认比例。这里存放的是真正被频繁访问的热点数据页。冷数据区域Old SubList / Old Sublist链表的后3/8部分。这里存放的是刚刚被加载进Buffer Pool的数据页或者疑似不活跃的冷数据。这个冷热区域的比例由参数innodb_old_blocks_pct控制默认值是37即37%的长度是冷数据区63%是热数据区。你可以根据自己业务的访问模式进行调整。新的数据加载与访问规则如下初次加载一律进“冷宫”无论是正常的查询加载还是预读机制加载的数据页第一次被加载到Buffer Pool时它的描述块都只能插入到冷数据区域的头部即整个LRU链表的尾部附近。这样预读进来但用不到的页、全表扫描进来的一次性页都只能待在冷数据区无法直接冲击到热数据区的热点数据。“冷宫”观察期光隔离还不够万一这个新加载的页其实是个即将成为热点的数据呢InnoDB设置了一个“观察期”由参数innodb_old_blocks_time控制默认1000毫秒。这个规则是一个数据页被加载到冷数据区后必须在间隔至少innodb_old_blocks_time毫秒之后再次被访问它才有资格被提升到热数据区域。晋升热数据区如果一个在冷数据区的缓存页在首次加载的1秒后再次被访问InnoDB就认为它可能不是“一次性用品”于是将它移动到热数据区域的头部正式晋升为热点数据。热数据区的老化与淘汰热数据区内部也遵循LRU原则。当热数据区的页被访问时它会被移动到热数据区的头部。长时间不被访问的热点页会逐渐向热数据区的尾部“老化”。当需要淘汰页面时InnoDB会优先淘汰冷数据区域尾部的页面。如果冷数据区都空了才会去淘汰热数据区域尾部的页面。这个设计的精妙之处在于抵御了“污染”全表扫描和错误预读带来的大量一次性数据页被限制在冷数据区这个“隔离区”内。它们就像过客很快就会被后续的新数据覆盖淘汰而不会影响热数据区的“常住居民”。保护了热点真正的热点数据在热数据区内得到保护享受更长的生命周期。给予了“潜力股”机会通过“观察期”机制那些真正会被频繁访问的新数据有机会从冷数据区晋升到热数据区保证了缓存的有效性。我们可以通过几个命令来监控和调整这些行为-- 查看Buffer Pool的LRU冷热比例设置 SHOW VARIABLES LIKE innodb_old_blocks_pct; -- 查看冷数据区观察期时间设置 SHOW VARIABLES LIKE innodb_old_blocks_time; -- 查看InnoDB状态其中包含LRU链表的运行信息关注Pages made young和not young这反映了数据页在冷热区之间的移动情况 SHOW ENGINE INNODB STATUS\G在实际调优中对于存在大量全表扫描或复杂JOIN的报表类数据库可以适当调大innodb_old_blocks_time比如设置为2000或3000让冷数据区的“观察期”更长更严格地防止一次性的扫描数据污染缓存。而对于OLTP在线事务处理为主、访问模式非常随机的业务使用默认值通常是个不错的选择。6. 如何查看与调优你的Buffer Pool理解了原理我们最终要落实到实践。如何查看Buffer Pool的使用情况并根据实际情况进行调优呢6.1 关键监控指标MySQL提供了丰富的状态变量和信息来监控Buffer Pool-- 查看Buffer Pool的配置大小和实际使用情况 SHOW VARIABLES LIKE innodb_buffer_pool_size; SHOW STATUS LIKE Innodb_buffer_pool_pages_total; -- Buffer Pool中总页数 SHOW STATUS LIKE Innodb_buffer_pool_pages_free; -- 空闲页数对应Free List长度 SHOW STATUS LIKE Innodb_buffer_pool_pages_data; -- 包含数据的页数已使用页 SHOW STATUS LIKE Innodb_buffer_pool_pages_dirty; -- 脏页数对应Flush List长度 -- 计算一些关键比率 -- Buffer Pool使用率 (总页数 - 空闲页数) / 总页数 -- 脏页比率 脏页数 / 已使用页数 -- 查看LRU和I/O相关的关键指标 SHOW STATUS LIKE Innodb_buffer_pool_read_requests; -- 逻辑读取请求数从缓存读 SHOW STATUS LIKE Innodb_buffer_pool_reads; -- 物理读取磁盘次数缓存未命中 -- 缓存命中率 1 - (Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests) -- 这个命中率是衡量Buffer Pool效率的最重要指标理想情况下应高于99%最好在99.9%以上。通过SHOW ENGINE INNODB STATUS\G命令的输出在BUFFER POOL AND MEMORY部分你可以看到更详细的信息包括每个Buffer Pool实例的详细数据、LRU链表长度、年轻化/非年轻化的页面数量等。6.2 核心调优参数与实践建议innodb_buffer_pool_size这是最重要的参数。设多大对于专用数据库服务器通常建议设置为系统物理内存的50% - 75%。要留给操作系统、其他线程以及MySQL自身其他内存结构如连接线程、排序缓存等足够的内存。例如一台64G内存的机器可以设置为40G-48G。怎么设可以在MySQL配置文件如my.cnf中修改并重启生效。从MySQL 5.7开始支持在线动态调整此参数使用SET GLOBAL innodb_buffer_pool_size 大小;命令即可但调整过程是异步的可能会对性能有短暂影响建议在低峰期操作。innodb_buffer_pool_instancesBuffer Pool实例数。为什么需要多个实例单个巨大的Buffer Pool在并发访问时对内部链表LRU、Free、Flush的管理需要全局锁保护可能成为瓶颈。将其划分为多个较小的实例每个实例有自己的链表和锁可以减少争用提升并发性能。设多少通常建议每个实例的大小不小于1GB。例如如果你设置innodb_buffer_pool_size32G那么可以设置innodb_buffer_pool_instances8或16。MySQL 5.7.5之后当innodb_buffer_pool_size大于等于1G时此参数默认值就是8。innodb_old_blocks_pct与innodb_old_blocks_time如前所述这两个参数控制冷热分离的行为。对于写多读少或有大量全表扫描/批处理的业务可以尝试提高innodb_old_blocks_time的值更好地保护热数据区。对于读多写少、访问模式稳定的业务使用默认值即可。预热Warm-up问题数据库重启后Buffer Pool是空的需要经过一段时间的热数据加载才能达到最佳性能这称为“预热”过程。对于生产环境这可能导致重启后的一段时间内性能不佳。解决方案MySQL 5.6以后提供了Buffer Pool Dump/Load功能。在关闭前将Buffer Pool中页面的信息表空间和页号保存到磁盘dump重启后在后台将这些页面预加载load回Buffer Pool。可以通过参数innodb_buffer_pool_dump_at_shutdown和innodb_buffer_pool_load_at_startup来控制。6.3 一个配置示例假设我们有一台内存为32G的数据库专用服务器主要承载OLTP业务偶尔有后台统计任务。[mysqld] # 设置Buffer Pool大小为24G (约75%内存) innodb_buffer_pool_size 24G # 设置为8个实例每个实例3G innodb_buffer_pool_instances 8 # 保持默认的冷热分区比例37% innodb_old_blocks_pct 37 # 由于有后台扫描将观察期略微调高至1.5秒减少污染 innodb_old_blocks_time 1500 # 开启关闭时dump和启动时load加速预热 innodb_buffer_pool_dump_at_shutdown ON innodb_buffer_pool_load_at_startup ON # 控制脏页比例当达到75%时强制刷盘避免过高 innodb_max_dirty_pages_pct 75调优不是一劳永逸的需要结合监控持续观察。重点关注缓存命中率和磁盘读次数。如果命中率持续低于95%或者Innodb_buffer_pool_reads数值增长很快可能就需要考虑扩大Buffer Pool的大小了。记住给Buffer Pool分配更多内存往往是提升数据库读性能最直接、最有效的手段没有之一。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…