Redis - 字典(Hash)结构和 rehash 机制
字典结构
Redis中的字典由dict.h/dict结构表示:
typedef struct dict (
//类型特定函数dictType *type;//私有数据
void "privdata;//哈希表
dictht ht[2];//rehash索引
//当rehash不在进行时,值为-1
in trehashidx;
} dict;
Redis字典所使用的哈希表由dict.h/dictht 结构定义:
typedef struct dictht {//哈希表数组
dictEntry **table;// 哈希表大小
unsigned long size;//哈希表大小掩码,用于计算索引值,hashmap也是用 (n-1) & hash 计算索引值
//总是等于size-1
unsigned long sizemask;//该哈希表已有节点的数量
unsigned long used;} dictht;
哈希表节点使用 dictEntry 结构表示,每个 dictEntry 结构都保存着一个键值对:
typedef struct dictEntry {//键
void *key;//值
union{void *val;uint64 tu64;int64 ts64;
}v;//指向下个哈希表节点,形成链表
struct dictEntry *next;} dictEntry;
Hash算法
当要将一个新的键值对添加到字典里面时,程序需要先根据键值对的键计算出哈希值和索引值,然后再根据索引值,将包含新键值对的哈希表节点放到哈希表数组的指定索引上面。
Redis计算哈希值和索引值的方法如下:
#使用字典设置的哈希函数,计算键key的哈希值
hash:dict->type->hashFunction(key);#使用哈希表的sizemask属性和哈希值,计算出索引值
#根据情况不同,ht[x]可以是ht[0]或者ht[1]
index = hash & dict->ht[x].sizemask;
当字典被用作数据库的底层实现,或者哈希键的底层实现时,Redis使用MurmurHash2算法来计算键的哈希值。
MurmurHash算法最初由AustinAppleby于2008年发明,这种算法的优点在于,即使输人的键是有规律的,算法仍能给出一个很好的随机分布性,并且算法的计算速度也非常快。MurmurHash 算法目前的最新版本为 MurmurHash3,而Redis 使用的是 MurmurHash2,关于 MurmurHash 算法的更多信息可以参考该算法的主页:http://code.google.com/p/smhasher/。
解决冲突
当有两个或以上数量的键被分配到了哈希表数组的同一个索引上面时,我们称这些键发生了冲突(collision)。
Redis的哈希表使用链地址法(separate chaining)来解决键冲突,每个哈希表节点都有一个next指针,多个哈希表节点可以用next指针构成一个单向链表,被分配到同一个索引上的多个节点可以用这个单向链表连接起来,这就解决了键冲突的问题。
rehash
随着操作的不断执行,哈希表保存的键值对会逐渐地增多或者减少,为了让哈希表的负载因子(load factor)维持在一个合理的范围之内,当哈希表保存的键值对数量太多或者太少时,程序需要对哈希表的大小进行相应的扩展或者收缩。
拓展和收缩的时机(负载因子):
当以下条件中的任意一个被满足时,程序会自动开始对哈希表执行扩展操作:
-
服务器目前没有在执行BGSAVE命令或者BGREWRITEAOF命令,并且哈希表的负载因子大于等于1。
-
服务器目前正在执行BGSAVE命令或者BGREWRITEAOF命令,并且哈希表的负载因子大于等于5。
其中哈希表的负载因子可以通过公式计算得出:
#负载因子=哈希表已保存节点数量/哈希表大小
load factor=ht[0].used /ht[0].size
例如,对于一个大小为4,包含4个键值对的哈希表来说,这个哈希表的负载因子为:
load factor=4/4=1
又例如,对于一个大小为512,包含256个键值对的哈希表来说,这个哈希表的负载因子为:
load factor=256/512=0.5
根据BGSAVE命令或BGREWRITEAOF命令是否正在执行,服务器执行扩展操作所需的负载因子并不相同,这是因为在执行BGSAVE命令或BGREWRITEAOF命令的过程中,Redis需要创建当前服务器进程的子进程,而大多数操作系统都采用写时复制(copy-on-write)技术来优化子进程的使用效率,所以在子进程存在期间,服务器会提高执行扩展操作所需的负载因子,从而尽可能地避免在子进程存在期间进行哈希表扩展操作,这可以避免不必要的内存写人操作,最大限度地节约内存。
另一方面,当哈希表的负载因子小于0.1时,程序自动开始对哈希表执行收缩操作。
拓展和收缩基本步骤
扩展和收缩哈希表的工作可以通过执行rehash(重新散列)操作来完成,Redis对字典的哈希表执行 rehash 的步骤如下:
-
为字典的 ht[1]哈希表分配空间,这个哈希表的空间大小取决于要执行的操作,以及ht[0]当前包含的键值对数量(也即是ht[0].used属性的值):
-
如果执行的是扩展操作,那么ht[1]的大小为 第一个大于等于 ht[0].used*2的2n(2的n次方幂)。
-
如果执行的是收缩操作,那么 ht[1]的大小为 第一个大于等于 ht[0].used 的 2n(2的n次方幂)。
-
将保存在 ht[0]中的所有键值对 rehash 到ht[1]上面: rehash指的是重新计算键的哈希值和索引值,然后将键值对放置到ht[1]哈希表的指定位置上。
-
当ht[0]包含的所有键值对都迁移到了ht[1]之后(ht[0]变为空表),释放ht[0],将ht[1]设置为ht[0],并在ht[1]新创建一个空白哈希表,为下一次 rehash 做准备。
渐进式 rehash
上一节说过,扩展或收缩哈希表需要将ht[0]里面的所有键值对rehash到ht[1]里面,但是,这个rehash动作并不是一次性、集中式地完成的,而是分多次、渐进式地完成的。
这样做的原因在于,如果ht[0]里只保存着四个键值对,那么服务器可以在瞬间就将这些键值对全部rehash 到ht[1]; 但是,如果哈希表里保存的键值对数量不是四个,而是四百万、四千万甚至四亿个键值对,那么要一次性将这些键值对全部rehash到ht[11的话庞大的计算量可能会导致服务器在一段时间内停止服务。
因此,为了避免rehash对服务器性能造成影响,服务器不是一次性将ht[0]里面的所有键值对全部rehash 到 ht[1],而是分多次、渐进式地将ht[0]里面的键值对慢慢地rehash到 ht[1]。
以下是哈希表渐进式rehash的详细步骤:
-
为ht[1]分配空间,让字典同时持有ht[0]和ht[1]两个哈希表。
-
在字典中维持一个索引计数器变量 rehashidx,并将它的值设置为0,表示rehash工作正式开始。
-
在rehash进行期间,每次对字典执行添加、删除、查找或者更新操作时,程序除了执行指定的操作以外,还会顺带将ht[0]哈希表在rehashidx 索引上的所有键值对 rehash 到 ht[1],当rehash工作完成之后,程序将 rehashidx 属性的值加1。
-
随着字典操作的不断执行,最终在某个时间点上,ht[0]的所有键值对都会被rehash 至 ht[1],这时程序将rehashidx属性的值设为 -1,表示rehash 操作已完成。
渐进式rehash的好处在于它采取分而治之的方式,将rehash键值对所需的计算工作均摊到对字典的每个添加、删除、查找和更新操作上,从而避免了集中式rehash 而带来的庞大计算量。
渐进式 rehash 期间的哈希表操作
-
读操作:Rehash状态时,先在
ht[0]
查找,如果未找到,则在ht[1]
查找。 -
写操作:直接写入
ht[1]
(无论是否在 Rehash)。 -
删除操作:同时在
ht[0]
和ht[1]
中删除。 -
更新操作:Rehash状态时,首先尝试在旧表中查找目标键。如果找到,直接在旧表中更新该键的值。如果旧表中未找到键,则在新表中查找并更新。
这一措施保证了ht[0]包含的键值对数量会只减不增,并随着rehash操作的执行而最终变成空表。
感谢
《Redis设计与实现》 黄健宏 著
相关文章:
Redis - 字典(Hash)结构和 rehash 机制
字典结构 Redis中的字典由dict.h/dict结构表示: typedef struct dict ( //类型特定函数dictType *type;//私有数据 void "privdata;//哈希表 dictht ht[2];//rehash索引 //当rehash不在进行时,值为-1 in trehashidx; } dict; Redis字典所使用的哈希表由dict.h/dictht 结…...
Redis 与 MongoDB 对比分析
Redis 与 MongoDB 对比分析 1. 核心定位 Redis:内存键值数据库,侧重高性能读写和低延迟,常用于缓存、实时分析、消息队列等场景。MongoDB:分布式文档型数据库,侧重灵活的数据模型和大规模数据存储,支持复…...
【愚公系列】《高效使用DeepSeek》058-选题策划
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! 👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"…...
解决 Lettuce 在 Redis 集群模式下的故障转移问题
引言 在高可用系统中,故障转移是确保服务不中断的重要机制。当我们使用 Lettuce 作为 Redis 的 Java 客户端时,如何高效地处理故障转移成为一项关键任务。本篇文章将探讨如何在 Redis 集群模式下配置 Lettuce 以优化故障转移。 背景 在初期设置 Lettu…...
Vim搜索和替换
模式 命令模式 操作过程 键入/开始搜索,找到想要搜索的内容后直接回车,此时光标会从搜索框回到编辑器中。 之后可以 使用小写n跳到下一个符合条件的内容,使用大写N跳到上一个搜索的内容。也可以直接使用上下左右按钮调整光标位置。...
【探商宝】 Llama 4--技术突破与争议并存的开源多模态
核心亮点 混合专家架构(MoE)的全面应用 Llama 4 是 Meta 首个全系列采用 MoE 架构 的模型,通过稀疏激活机制显著提升效率。例如: Llama 4 Scout(中杯):16 位专家,17B 活跃参数&#…...
可发1区的超级创新思路(python 实现):一种轻量化的动态稀疏门控网络
首先声明,该模型为原创!原创!原创!且该思路还未有成果发表,感兴趣的小伙伴可以借鉴! 一、应用领域 视频异常检测、生成视频检测。 二、模型解析 该模型由1.关键帧动态选择机制、2.关键帧动态选择机制以及3.关键帧动态选择机制三大核心组件构成,形成端到端的视频异常…...
flink cdc的source数据流如何配置事件时间,如何设置时间语义,分配时间戳并生成水位线
在 Flink CDC 中为 Source 数据流配置事件时间需要结合时间语义设置、时间戳分配和水位线生成三个核心步骤。以下是具体配置方法及注意事项: 1. 设置时间语义 Flink 默认使用处理时间(Processing Time),需显式指定事件时间语义&a…...
Vue3:初识Vue,Vite服务器别名及其代理配置
一、创建一个Vue3项目 创建Vue3项目默认使用Vite作为现代的构建工具,以下指令本质也是通过下载create-vue来构建项目。 基于NodeJs版本大于等于18.3,使用命令行进行操作。 1、命令执行 npm create vuelatest输入项目名称 2、选择附加功能 选择要包含的功…...
医疗场景与事件驱动的高匹配颗粒度医疗智能体研发方向探析(代码版)
结合技术实现、应用场景与挑战展开分析: 一、医疗场景驱动的智能体核心方向 全场景覆盖的诊疗辅助医疗智能体系统编程方案 1.1、技术架构设计 #mermaid-svg-OKB0oAt38jXWNClG {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#m…...
HTML5 浏览器兼容性:让旧浏览器也能拥抱 HTML5
在前端开发领域,HTML5 带来了一系列令人兴奋的新特性和功能,极大地提升了用户体验和开发效率。然而,由于互联网用户使用的浏览器版本千差万别,部分旧版本浏览器并不支持 HTML5,这给开发者带来了兼容性方面的挑战。不过…...
Kubernetes 集群搭建(三):使用dashboard用户界面(需要访问外网获取yaml)
(一)简介 K8s Dashboard是Kubernetes提供的一种基于Web的用户界面工具,用于可视化地管理和监控Kubernetes集群 主要功能: 资源查看与管理: 查看Kubernetes集群中的各种资源,如节点、Pod、服务、部署等。 对…...
【图像处理基石】什么是ISP色彩管理?
在ISP(Image Signal Processor,图像信号处理器)管线中,色彩管理是图像处理流程的核心环节,主要负责从传感器原始数据(RAW)到最终输出图像(如YUV、RGB或JPEG)的色彩转换、…...
金融维度下的公链价值重构:重塑财富新秩序
公链的引言: 众人对 Crypto、Token 的探讨热度居高不下。在此大背景下,我打算另辟蹊径,从金融维度重新剖析区块链分布式账本。那么,我们究竟该如何正确认知它?又该如何搭建起一套从金融视角出发的分析框架呢࿱…...
LeetCode算法题(Go语言实现)_34
题目 考虑一棵二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列 。 如果有两棵二叉树的叶值序列是相同,那么我们就认为它们是 叶相似 的。 如果给定的两个根结点分别为 root1 和 root2 的树是叶相似的,则返回 true&…...
# 项目部署指南:Flask、Gradio与Docker实现流程
Python项目部署指南:Flask、Gradio与Docker实践 1. 引言 在机器学习和Web开发中,将模型或应用部署为在线服务是关键一步。本文将介绍如何使用 Flask 和 Gradio 快速构建前端界面,并通过 Docker 容器化实现高效部署,涵盖完整流程图…...
2022第十三届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(题解解析)
记录刷题的过程、感悟、题解。 希望能帮到,那些与我一同前行的,来自远方的朋友😉 大纲: 1、九进制转十进制-(解析)-简单的进制转化问题😄 2、顺子日期-(解析)-考察日期 3…...
UML之序列图的参与者与生命线
序列图是建模过程中必选的一种描述行为的手段,它展示在某些有用的行为中元素之间的消息交换和相互作用。交互是构成行为的一个单元;这些元素必须是可连接元素,通常将这些可连接元素称为交互中的参与者(Participants)。…...
基于Python Flask快速构建网络安全工具资源库的Web应用实践
引言 在网络安全领域,信息收集(OSINT)是渗透测试、漏洞挖掘和威胁分析的关键环节。然而,面对海量工具和分散的技术文档,安全研究人员常需耗费大量时间查找和比对工具信息。本文将介绍如何利用 Python Flask HTML 技…...
xv6-labs-2024 lab1
lab-1 注:实验环境在我的汇编随手记的末尾部分有搭建教程。 0.前置 第零章 xv6为我们提供了多种系统调用,其中,exec将从某个文件里读取内存镜像(这确实是一个好的说法),并且将其替换到调用它的内存空间,也就是这个…...
HTTP Form v.s. Flask-WTF Form v.s. Bootstrap Form
在Flask-WTF和Bootstrap 的Form创建中,添加了页面显示Flash Messages。 相比Flask_WTF, Bootstrap用 render_form(form)渲染样式,自动带错误提示,不需要像Flask_WTF那样手写 for error in ... 。 项目结构: register_app/ ├── HTTP_Form_App.py ├── FlaskWTF_Form…...
Linux网络编程——https的协议及其加密解密方式
目录 一、前言 https协议 常见的加密方式 1、对称加密 2、非对称加密 3、数字签名 1. 只用对称加密 2、只用单一的非对称加密 3、双方都使用非对称加密 4、非对称加密对称加密 证书 证书颁发流程 服务器与客户端的证书验证流程 5、证书非对称加密对称加密 前言 上一…...
Node.js 下载与安装(图文)
下载 官网:【直达:https://nodejs.org/en/】。 点击【Download】,选择【版本,系统】。点击【Windows Installer(.msi)】。 安装 双击【.msi文件】,选择【安装路径】,也可以一直【下一步】。 查看版本 …...
3.31-4.06 Web3 游戏周报:Pebble 玩家留存率登顶,Treasure DAO 面临重组危机
回顾上周的区块链游戏概况,查看 Footprint Analytics 与 ABGA 最新发布的数据报告。 【3.31–4.06】Web3 游戏行业动态 链游生态系统 Treasure DAO 因财务危机面临重组,将终止游戏运营和 Treasure Chain3A 链游 Shrapnel 开发商 Neon Machine 深陷财务…...
echarts生成3D立体地图react组件
地图散点图效果: react项目中安装echarts、echarts-gl依赖: npm install echarts echarts-gl 文件目录结构: 地图组件map目录下文件代码,点击散点图圆点触发事件handleCityClick: index.jsx: import { …...
Node.js 中处理 Excel 文件的最佳实践
在现代应用开发中,Excel 文件仍然是数据交换和存储的重要格式之一。在 Node.js 环境中,处理 Excel 文件的需求日益增加。本文将介绍如何在 Node.js 中高效地处理 Excel 文件,涵盖工具选择、基本操作和最佳实践。 1. 选择合适的库 在 Node.js…...
解决Ubuntu系统鼠标不流畅的问题
电脑是联想的台式组装机,安装ubuntu系统(不管是16、18、20、22)后,鼠标都不流畅。最近几天想解决这个问题,于是怀疑到了显卡驱动上。怀疑之前一直用的是集成显卡,而不是独立显卡,毕竟2060的显卡…...
【Linux】虚拟机设置静态IP
主播我今天下午学了几节微服务课,上课的时候,直接把手机拿走了去上课(电脑连的我手机的热点),虚拟机没关,晚上主播我回来继续学,电脑连上热点之后,发现虚拟机连接不上了,…...
Web API:AbortController
Web API:AbortController 主要用途基本工作原理基本用法示例高级用例1. 实现请求超时2. 取消多个请求3. 与其他异步 API 一起使用 浏览器支持总结 主要用途 AbortController 是一个 Web API,主要用于取消一个或多个 Web 请求(如 fetch 请求&…...
服务器配置虚拟IP
服务器配置虚拟IP的核心步骤取决于具体场景,主要包括本地单机多IP配置和高可用集群下的虚拟IP管理两种模式。 一、本地虚拟IP配置(单服务器多IP) 基于Linux系统: 确认网络接口:使用 ip addr 或 ifconfig 查…...
《AI大模型应知应会100篇》第5篇:大模型发展简史:从BERT到ChatGPT的演进
第5篇:大模型发展简史:从BERT到ChatGPT的演进 摘要 近年来,人工智能领域最引人注目的进步之一是大模型(Large Language Models, LLMs)的发展。这些模型不仅推动了自然语言处理(NLP)技术的飞跃&…...
小球反弹(蓝桥杯C语言)
有一长方形,长为 343720343720 单位长度,宽为 233333233333 单位长度。在其内部左上角顶点有一小球 (无视其体积),其初速度如图所示且保持运动速率不变,分解到长宽两个方向上的速率之比为 dx:dy15:17dx:dy15:17。小球碰到长方形的…...
Java面试39-Zookeeper中的Watch机制的原理
Zookeeper是一个分布式协调组件,为分布式架构下的多个应用组件提供了顺序访问控制能力。它的数据存储采用了类似于文件系统的树形结构,以节点的方式来管理存储在Zookeeper上的数据。 Zookeeper提供了一个Watch机制,可以让客户端感知到Zooke…...
3️⃣ Coze工作流基础教学(2025年全新版本)
目录 一、什么是工作流 二、为什么用工作流 三、工作流使用场景 四、怎么学习工作流 五、工作流功能概述 六、制作工作流基础流程 6.1 创建工作流 6.2 配置工作流 6.3 调试工作流 6.4 发布工作流 6.5 使用工作流 6.6 复制工作流 6.7 删除工作流 6.8 设置工作流异…...
备战蓝桥杯——走迷宫问题(BFS解决)
这是一个经典的BFS算法 1. BFS算法保证最短路径 核心机制:广度优先搜索按层遍历所有可能的路径,首次到达终点的路径长度即为最短步数。这是BFS的核心优势。队列的作用:通过队列按先进先出的顺序处理节点,确保每一步探索的都是当…...
usbip学习记录
USB/IP: USB device sharing over IP make menuconfig配置: Device Drivers -> Staging drivers -> USB/IP support Device Drivers -> Staging drivers -> USB/IP support -> Host driver 如果还有作为客户端的需要,继续做以下配置&a…...
mlir-tblgen 的应用渐进式示例
示例01 -gen-dialect-decls toy_dia.1.toy include "mlir/IR/OpBase.td" //include "mlir/IR/FunctionInterfaces.td" //include "mlir/IR/SymbolInterfaces.td" //include "mlir/Interfaces/SideEffectInterfaces.td"def Toy_Diale…...
AI大模型与未来社会结构的重构:从工具到共生体
一、引言:从蒸汽机到ChatGPT,文明的每一次跃迁都始于“工具的自我进化” 历史长河中,每一次技术革命,都伴随着人类社会组织、认知方式乃至价值体系的巨变。从18世纪的蒸汽机到20世纪的信息技术,再到21世纪的人工智能&…...
2015年-全国大学生数学建模竞赛(CUMCM)试题速浏、分类及浅析
2015年-全国大学生数学建模竞赛(CUMCM)试题速浏、分类及浅析 全国大学生数学建模竞赛(China Undergraduate Mathematical Contest in Modeling)是国家教委高教司和中国工业与应用数学学会共同主办的面向全国大学生的群众性科技活动,目的在于激励学生学习数学的积极性,提高学…...
免费Deepseek-v3接口实现Browser-Use Web UI:浏览器自动化本地模拟抓取数据实录
源码 https://github.com/browser-use/web-ui 我们按照官方教程,修订几个环节,更快地部署 步骤 1:克隆存储库 git clone https://github.com/browser-use/web-ui.git cd web-ui Step 2: Set Up Python Environment 第 2 步:设置…...
Bash判断命令是否存在
在 Bash 脚本里,你可以通过多种方法判断某个命令是否存在。下面为你详细介绍几种常见的判断方式。 1. 使用command -v command -v命令能够返回指定命令的可执行文件路径,如果该命令不存在则不会有输出。借助这一特性,我们可以结合条件判断语…...
双指针(滑动窗口)
用于在数组或字符串的进行快速排序 匹配 排序或移动操作。 双指针不是真的指针,只是用两个变量来表示下标(在后面都用指针来表示) 双指针往往和单调性 排序 联系在一起,暴力往往是O(n方)双指针利用单调性可以优化到o(n) 有对撞指针 快慢指针 美丽区间…...
在PPT中同时自动播放多个视频的方法
在PPT中同时自动播放多个视频的方法 文章目录 在PPT中同时自动播放多个视频的方法1 准备视频2 设置动画为“出现”3 设置所有视频为“自动播放”4 最终效果与其他设置 在PPT制作的过程中,我们经常遇到需要同时自动播放多个视频的情况。本文将详细介绍实现这种效果的…...
使用 Vue 快速集成 FullCalendar 日历组件教程
FullCalendar 是一款功能强大的 JavaScript 日历组件,支持 React/Vue 等主流框架,提供丰富的日历视图和交互功能。本文将手把手教你在 Vue 项目中快速集成,并演示核心功能实现。 📦 主要特性亮点 ✅ 月/周/日多视图切换 ✅…...
xv6-labs-2024 lab2
lab-2 0. 前置 课程记录 操作系统的隔离性,举例说明就是,当我们的shell,或者qq挂掉了,我们不希望因为他,去影响其他的进程,所以在不同的应用程序之间,需要有隔离性,并且࿰…...
redis导入成功,缺不显示数据
SpringBootTest class SecurityApplicationTests {AutowiredStringRedisTemplate template; //添加这句代码,自动装载,即可解决文章三处代码报错Testvoid contextLoads() {String compact Jwts.builder().signWith(Jwts.SIG.HS512.key().build()).subj…...
Flink对比Spark streaming、Storm
对比Spark streaming、Storm 产品 模型 语义 容错机制 状态管理 延时 吞吐量 Storm native at-least-once ack 无 low low Spark streaming micro-batch exactly-once RDD checkpoint 有 medium high Flink native exactly-once checkpoint 有 low …...
力扣316去除重复字母-单调栈
题目来源: 给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。 示例 1: 输入:s "bcabc" 输出ÿ…...
第421场周赛:数组的最大因子得分、
Q1、数组的最大因子得分 1、题目描述 给你一个整数数组 nums。 因子得分 定义为数组所有元素的最小公倍数(LCM)与最大公约数(GCD)的 乘积。 在 最多 移除一个元素的情况下,返回 nums 的 最大因子得分。 注意&…...
COMSOL 与人工智能融合的多物理场应用:28个案例的思路、方法与工具概述
应用案例概述 基于 COMSOL 与人工智能(AI)结合的应用案例涵盖了 28 个多领域场景,包括工程(如热传导优化、结构力学预测)、能源(如电池热管理、燃料电池性能)、生物医学(如药物传递…...