Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
Redshift数据库中从DataFrame高效批量插入数据的策略与实践_创想鸟

Redshift数据库中从DataFrame高效批量插入数据的策略与实践

Redshift数据库中从DataFrame高效批量插入数据的策略与实践

本教程旨在解决从python dataframe向amazon redshift数据库高效批量插入数据的挑战。文章将深入探讨传统逐行或小批量插入方法的性能瓶颈,并提出两种优化策略:利用`psycopg2.extras.execute_values`实现多行sql插入,以及更推荐的、通过amazon s3服务结合redshift的`copy`命令进行大规模数据加载。通过具体代码示例和最佳实践,帮助开发者显著提升数据导入效率。

在处理大规模数据集成任务时,将Python DataFrame中的数据导入Amazon Redshift这类分析型数据库,常常面临性能瓶颈。传统的逐行插入或小批量executemany方法,对于数十万甚至数百万条记录的数据集来说,效率低下,可能导致数天的时间消耗甚至连接超时。Redshift作为一款大规模并行处理(MPP)的列式存储数据库,其设计哲学是优化大规模数据的批量加载,而非频繁的单行或小批量操作。

理解Redshift的批量加载机制

Redshift的性能优势在于其分布式架构和列式存储。每次执行SQL插入操作,即使是executemany,如果底层仍然是发送多条独立的INSERT语句,或者每次只插入少量数据,都会引入大量的网络往返开销、事务开销以及数据库内部的元数据处理开销。这与Redshift期望的“一次性加载大量数据”的工作模式相悖。官方文档明确指出,当无法使用COPY命令时,应尽可能使用多行插入(multi-row insert),因为单行或少量行的数据添加会导致数据压缩效率低下。

优化策略一:使用多行SQL插入 (psycopg2.extras.execute_values)

对于无法直接使用COPY命令的场景,或数据量相对较小(但仍远超单行)时,多行SQL插入是比逐行或executemany更优的选择。psycopg2库提供了psycopg2.extras.execute_values函数,它可以将多行数据构建成一个单一的SQL INSERT INTO … VALUES (…), (…), … 语句,从而显著减少与数据库的交互次数。

示例代码:

import psycopg2import pandas as pdfrom psycopg2 import extrasimport io# 假设 df 是您的 DataFrame# df = pd.DataFrame(...)# 示例数据 (与原问题保持一致的结构)data = [    {'case_id': 69370, 'column_name': 'subject', 'split_text': 'working', 'split_text_cnt': 1, 'load_ts': '2023-12-15'},    {'case_id': 69370, 'column_name': 'subject', 'split_text': 'scenes', 'split_text_cnt': 1, 'load_ts': '2023-12-15'},    {'case_id': 69370, 'column_name': 'subject', 'split_text': 'intended', 'split_text_cnt': 1, 'load_ts': '2023-12-15'},    {'case_id': 69371, 'column_name': 'subject', 'split_text': 'redirected', 'split_text_cnt': 1, 'load_ts': '2023-12-15'},    {'case_id': 69371, 'column_name': 'subject', 'split_text': 'ge', 'split_text_cnt': 2, 'load_ts': '2023-12-15'},    {'case_id': 69371, 'column_name': 'subject', 'split_text': 'sensor', 'split_text_cnt': 1, 'load_ts': '2023-12-15'},    {'case_id': 69371, 'column_name': 'subject', 'split_text': 'flush', 'split_text_cnt': 1, 'load_ts': '2023-12-15'},    {'case_id': 69371, 'column_name': 'subject', 'split_text': 'motion', 'split_text_cnt': 1, 'load_ts': '2023-12-15'},    {'case_id': 69371, 'column_name': 'subject', 'split_text': 'led', 'split_text_cnt': 1, 'load_ts': '2023-12-15'},    {'case_id': 69371, 'column_name': 'subject', 'split_text': 'fixture', 'split_text_cnt': 1, 'load_ts': '2023-12-15'},    {'case_id': 69371, 'column_name': 'subject', 'split_text': 'contact', 'split_text_cnt': 1, 'load_ts': '2023-12-15'}]df = pd.DataFrame(data)# Redshift 连接参数conn_params = {    'host': 'redshift-####-dev.00000.us-east-1.redshift.amazonaws.com',    'database': '*****',    'user': '****',    'password': '*****',    'port': '5439'}table_name = 'odey.sfc_ca_sit_di' # 目标表名columns = ['case_id', 'column_name', 'split_text', 'split_text_cnt', 'load_ts'] # 目标表的列名try:    conn = psycopg2.connect(**conn_params)    print("成功连接到 Redshift Dev")    cur = conn.cursor()    # 将DataFrame转换为元组列表,顺序与目标列一致    values = [tuple(row) for row in df[columns].values]    # Redshift SQL 命令的最大大小为16MB,因此需要分批插入    batch_size = 10000 # 根据实际情况调整批次大小,确保SQL语句不超过16MB    for i in range(0, len(values), batch_size):        batch = values[i:i + batch_size]        # 使用 execute_values 构建多行插入语句        extras.execute_values(            cur,            f"INSERT INTO {table_name} ({','.join(columns)}) VALUES %s",            batch        )        conn.commit() # 每批次提交一次        print(f"已插入 {min(i + batch_size, len(values))} 条记录。")    print("数据批量插入完成。")except Exception as e:    print(f"插入数据时发生错误: {e}")    if conn:        conn.rollback() # 发生错误时回滚finally:    if cur:        cur.close()    if conn:        conn.close()    print("数据库连接已关闭。")

注意事项:

批次大小 (batch_size): Redshift SQL 命令的最大大小为16MB。因此,即使使用execute_values,也需要根据每行数据的大小和总行数进行分批处理,以避免SQL语句过大。通常,数千到数万行的批次是合理的起点,具体数值需要根据数据宽度进行测试。事务管理: 建议每批次提交一次事务(conn.commit()),以平衡性能和数据一致性。过大的事务可能导致长时间锁定和内存问题,而过小的事务则会增加提交开销。

优化策略二:通过Amazon S3和COPY命令进行大规模数据加载(推荐)

对于大规模数据集(如数十万到数百万条记录,甚至TB级别),Redshift的COPY命令是最高效、最推荐的数据加载方式。COPY命令允许Redshift直接从Amazon S3存储桶中并行加载数据,利用其分布式架构的全部能力。

核心步骤:

将DataFrame保存到S3: 将DataFrame数据转换为文件格式(如CSV、Parquet等),并上传到Amazon S3存储桶。执行Redshift COPY命令: 在Redshift中执行COPY命令,指示其从S3存储桶加载数据。

示例代码:

首先,确保您已安装boto3(AWS SDK for Python)和pandas。

import psycopg2import pandas as pdimport boto3import io# 假设 df 是您的 DataFrame# df = pd.DataFrame(...)# 示例数据 (与原问题保持一致的结构)data = [    {'case_id': 69370, 'column_name': 'subject', 'split_text': 'working', 'split_text_cnt': 1, 'load_ts': '2023-12-15'},    {'case_id': 69370, 'column_name': 'subject', 'split_text': 'scenes', 'split_text_cnt': 1, 'load_ts': '2023-12-15'},    {'case_id': 69370, 'column_name': 'subject', 'split_text': 'intended', 'split_text_cnt': 1, 'load_ts': '2023-12-15'},    {'case_id': 69371, 'column_name': 'subject', 'split_text': 'redirected', 'split_text_cnt': 1, 'load_ts': '2023-12-15'},    {'case_id': 69371, 'column_name': 'subject', 'split_text': 'ge', 'split_text_cnt': 2, 'load_ts': '2023-12-15'},    {'case_id': 69371, 'column_name': 'subject', 'split_text': 'sensor', 'split_text_cnt': 1, 'load_ts': '2023-12-15'},    {'case_id': 69371, 'column_name': 'subject', 'split_text': 'flush', 'split_text_cnt': 1, 'load_ts': '2023-12-15'},    {'case_id': 69371, 'column_name': 'subject', 'split_text': 'motion', 'split_text_cnt': 1, 'load_ts': '2023-12-15'},    {'case_id': 69371, 'column_name': 'subject', 'split_text': 'led', 'split_text_cnt': 1, 'load_ts': '2023-12-15'},    {'case_id': 69371, 'column_name': 'subject', 'split_text': 'fixture', 'split_text_cnt': 1, 'load_ts': '2023-12-15'},    {'case_id': 69371, 'column_name': 'subject', 'split_text': 'contact', 'split_text_cnt': 1, 'load_ts': '2023-12-15'}]df = pd.DataFrame(data)# Redshift 连接参数conn_params = {    'host': 'redshift-####-dev.00000.us-east-1.redshift.amazonaws.com',    'database': '*****',    'user': '****',    'password': '*****',    'port': '5439'}# S3 配置s3_bucket = 'your-s3-bucket-name' # 替换为您的S3存储桶名称s3_key = 'data/temp_redshift_load.csv' # S3文件路径iam_role_arn = 'arn:aws:iam::123456789012:role/YourRedshiftIAMRole' # 替换为您的Redshift IAM角色ARNtable_name = 'odey.sfc_ca_sit_di' # 目标表名try:    # 1. 将DataFrame保存到S3    csv_buffer = io.StringIO()    df.to_csv(csv_buffer, index=False, header=False) # Redshift COPY通常不需要header    s3_client = boto3.client('s3', region_name='us-east-1') # 替换为您的AWS区域    s3_client.put_object(Bucket=s3_bucket, Key=s3_key, Body=csv_buffer.getvalue())    print(f"数据已成功上传到 S3: s3://{s3_bucket}/{s3_key}")    # 2. 连接Redshift并执行COPY命令    conn = psycopg2.connect(**conn_params)    print("成功连接到 Redshift Dev")    cur = conn.cursor()    # 构建COPY命令    # 注意:这里的列顺序必须与CSV文件中的数据顺序一致    copy_sql = f"""    COPY {table_name} ({','.join(df.columns)})    FROM 's3://{s3_bucket}/{s3_key}'    IAM_ROLE '{iam_role_arn}'    CSV    DELIMITER ','    IGNOREHEADER 0; -- 如果CSV没有头部,设置为0    """    # 如果CSV有头部,设置为 IGNOREHEADER 1    cur.execute(copy_sql)    conn.commit()    print("数据已通过 Redshift COPY 命令成功加载。")except Exception as e:    print(f"数据加载过程中发生错误: {e}")    if conn:        conn.rollback()finally:    if cur:        cur.close()    if conn:        conn.close()    print("数据库连接已关闭。")    # 可选:清理S3上的临时文件    # try:    #     s3_client.delete_object(Bucket=s3_bucket, Key=s3_key)    #     print(f"S3临时文件 s3://{s3_bucket}/{s3_key} 已删除。")    # except Exception as e:    #     print(f"删除S3文件时发生错误: {e}")

关键配置与最佳实践:

IAM角色: Redshift集群需要一个具有访问S3存储桶权限的IAM角色。该角色应具有s3:GetObject和s3:ListBucket权限。将IAM角色的ARN提供给COPY命令。文件格式:CSV: 简单易用,但对于复杂数据类型可能需要额外处理。Parquet/ORC: 推荐用于大规模数据集。它们是列式存储格式,具有更好的压缩和编码效率,Redshift可以直接利用这些格式的优势进行更高效的加载。使用pyarrow库可以将DataFrame保存为Parquet格式。压缩: 强烈建议对S3上的数据文件进行压缩(如GZIP、SNAPPY)。Redshift的COPY命令支持多种压缩格式,可以显著减少数据传输量和加载时间。文件分片: 对于非常大的数据集,将数据分成多个小文件(例如,每个文件大小在1MB到1GB之间,取决于集群大小)并上传到S3,可以使Redshift的多个切片(slice)并行加载数据,进一步提高效率。错误处理: COPY命令提供了强大的错误处理机制,例如MAXERRORS、NOLOAD、DATEFORMAT、TIMEFORMAT等选项,可以帮助您在加载过程中处理数据不匹配或格式错误。

总结

从Python DataFrame向Amazon Redshift高效批量插入数据,应避免传统的逐行或小批量executemany方法。对于中等规模的数据,可以采用psycopg2.extras.execute_values构建多行SQL插入语句,并注意分批处理以遵守SQL命令大小限制。然而,对于大规模数据集,最推荐且最高效的方法是利用Amazon S3作为中间存储,结合Redshift的COPY命令进行数据加载。通过选择合适的S3文件格式、压缩以及正确的IAM配置,可以充分发挥Redshift的并行处理能力,实现极速的数据导入。

以上就是Redshift数据库中从DataFrame高效批量插入数据的策略与实践的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1382789.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
在Pyodide中利用Basthon Turtle渲染动画SVG教程
上一篇 2025年12月15日 00:32:31
Python自定义可重用迭代器:实现类似内置range类的行为
下一篇 2025年12月15日 00:32:51

相关推荐

  • MySQL执行时间分析与诊断_MySQL性能瓶颈精准定位

    MySQL执行时间分析与诊断_MySQL性能瓶颈精准定位MySQL执行时间分析与诊断_MySQL性能瓶颈精准定位MySQL执行时间分析与诊断_MySQL性能瓶颈精准定位MySQL执行时间分析与诊断_MySQL性能瓶颈精准定位

    mysql性能瓶颈定位与分析需从慢查询日志、执行计划、实时监控等多维度入手。1. 开启慢查询日志,设置slow_query_log=1、指定日志路径及阈值long_query_time,通过mysqldumpslow分析日志找出最慢sql;2. 使用explain命令查看sql执行计划,重点关注ty…

    2026年9月22日 用户投稿
    300
  • if sql语句_SQL IF语句介绍和概述

    if sql语句_SQL IF语句介绍和概述if sql语句_SQL IF语句介绍和概述if sql语句_SQL IF语句介绍和概述if sql语句_SQL IF语句介绍和概述

    大家好,又见面了,我是你们的朋友全栈君。 本文将深入探讨SQL Server中实用的SQL IF语句功能。 介绍 (Introduction) 在现实生活中,我们根据条件做出决定。例如,以下情况: 如果我今年获得绩效奖金,我将选择国际度假,否则我将选择国内度假。如果天气变好,我会计划骑自行车旅行,否…

    2026年9月22日 用户投稿
    000
  • VSCode连接Modelsim仿真工具(调试技巧分享,波形分析指南)

    首先确保Modelsim路径加入系统PATH,安装VSCode的HDL扩展,配置tasks.json定义编译、仿真任务,并编写Tcl脚本自动化add wave、run等操作,通过问题匹配器解析错误,利用Tcl实现参数化仿真与自动化测试,结合Makefile或脚本提升大型项目管理效率。 将VSCode…

    2026年9月22日
    400
  • MySQL中如何使用存储过程提高业务逻辑复用_示例讲解?

    MySQL中如何使用存储过程提高业务逻辑复用_示例讲解?MySQL中如何使用存储过程提高业务逻辑复用_示例讲解?MySQL中如何使用存储过程提高业务逻辑复用_示例讲解?MySQL中如何使用存储过程提高业务逻辑复用_示例讲解?

    存储过程在 mysql 中用于封装业务逻辑,提升复用性并减少网络传输。它是一组预定义的 sql 语句集合,通过参数调用实现功能,如查询订单及计算消费总额。其优点包括提高执行效率、统一数据操作逻辑、增强安全性和便于维护。例如,输入客户 id 即可返回订单信息与总消费金额。优化方式有:1. 使用 out…

    2026年9月22日 用户投稿
    200
  • VSCode配置C++项目环境 新手必看VSCode搭建C++教程

    答案:在VSCode中配置C++环境需安装MinGW-w64编译器并将其路径加入系统环境变量,安装VSCode的C/C++扩展以支持代码补全和调试,通过tasks.json配置编译任务,指定g++路径及编译参数,再通过launch.json配置调试任务,设置gdb调试器路径和程序输出路径,确保头文件…

    2026年9月22日
    200
  • 如何使用DeepSpeed训练AI大模型?大规模模型训练的优化技巧

    DeepSpeed通过ZeRO等技术突破显存限制,实现大模型高效训练。它采用ZeRO-1/2/3分级优化,分别对优化器状态、梯度和参数进行分区,显著降低单卡显存占用;结合混合精度、梯度累积和CPU/NVMe卸载进一步节省资源。同时集成流水线并行与张量并行,支持多维并行策略协同,使万亿参数模型训练在普…

    2026年9月22日
    100
  • Sublime使用MySQL实现数据权限控制模块_根据用户角色限制访问范围

    Sublime使用MySQL实现数据权限控制模块_根据用户角色限制访问范围Sublime使用MySQL实现数据权限控制模块_根据用户角色限制访问范围Sublime使用MySQL实现数据权限控制模块_根据用户角色限制访问范围Sublime使用MySQL实现数据权限控制模块_根据用户角色限制访问范围

    在sublime中实现数据权限控制模块的核心在于根据用户角色动态拼接sql语句,具体步骤如下:1. 建立角色表、用户表和权限规则表,明确角色与数据的对应关系;2. 用户登录后获取其角色id,并查询该角色可访问的数据范围;3. 根据权限动态构建sql查询条件,限制访问范围;4. 使用python等语言…

    2026年9月22日 用户投稿
    200
  • PHP 表单验证:确保 HTML select 下拉菜单已正确选择非默认选项

    本文将详细介绍如何在 PHP 后端对 HTML select 下拉菜单进行有效验证,确保用户选择了非默认选项。我们将探讨常见的验证误区,并提供一个简洁高效的解决方案,通过检查 $_POST 数据来判断用户是否已做出有效选择,从而避免表单提交无效数据,提升用户体验和数据准确性。 在构建 web 表单时…

    2026年9月22日
    200
  • win10无法弹出U盘怎么办_win10U盘无法弹出解决方法

    若U盘无法安全移除,首先关闭相关程序,检查任务管理器结束占用进程,清空剪贴板,重启Windows资源管理器,使用handle.exe命令行工具查找并终止占用进程,最后可修改U盘策略为快速删除模式以避免后续问题。 如果您尝试从Windows 10系统中安全移除U盘,但系统提示“设备正在使用”或无法完成…

    2026年9月22日
    100
  • python 基准测试(cProfile kcachegrind line_profiler memory_profiler)

    learn from 《python高性能(第2版)》 类似工具:pycharm profile对函数调用效率进行测试 1. 例子 一个圆周运动的动画 代码语言:javascript代码运行次数:0运行复制 from matplotlib import pyplot as pltfrom matpl…

    2026年9月22日
    200
  • windows怎么关闭操作中心通知_禁用系统和应用通知消息教程

    关闭Windows通知可提升专注度,首先通过“设置-系统-通知”关闭所有通知或按需保留;其次启用“专注助手”在特定场景屏蔽干扰;再通过任务栏设置隐藏操作中心图标;专业版用户可通过组策略禁用操作中心;家庭版可修改注册表HKEY_CURRENT_USERSoftwarePoliciesMicrosoft…

    2026年9月22日
    200
  • 手机淘宝主页怎么找?手机淘宝主页怎么找客服

    打开淘宝App后点击右下角“我的淘宝”进入个人主页;2. 点击头像可进入逛逛主页;3. 首页搜索“联系客服”可直达客服中心;4. 订单详情页可联系卖家或申请平台帮助。 如果您在使用手机淘宝时找不到个人主页或需要联系客服,可能是由于界面布局不熟悉或入口隐藏较深。以下是查找主页和联系客服的具体步骤: 本…

    2026年9月22日
    300
  • MySQL查询缓存配置及性能_MySQL重复查询响应速度提升

    MySQL查询缓存配置及性能_MySQL重复查询响应速度提升MySQL查询缓存配置及性能_MySQL重复查询响应速度提升MySQL查询缓存配置及性能_MySQL重复查询响应速度提升MySQL查询缓存配置及性能_MySQL重复查询响应速度提升

    mysql查询缓存已不适用于现代应用场景,尤其在8.0版本中被彻底移除。它仅适合读多写少、数据几乎不变的静态查询,通过内存直接返回结果提升性能;但在数据频繁更新时,因基于表级的缓存失效机制,每次写操作都会清空相关缓存,导致频繁重建缓存并消耗大量cpu资源,形成性能瓶颈。此外,sql语句匹配严格、内存…

    2026年9月22日 用户投稿
    500
  • 神马搜索App用户反馈处理教程_神马搜索App问题解决技巧

    首先通过App内“帮助与反馈”提交问题,其次针对负面信息访问官网进行侵权投诉,最后定期清理缓存以解决卡顿或显示异常问题。 如果您在使用神马搜索App时遇到问题或希望反馈体验,可以通过官方渠道提交信息以获得处理。以下是针对不同问题的解决步骤: 本文运行环境:iPhone 15 Pro,iOS 18 一…

    2026年9月22日
    000
  • 如何判断网络延迟(Ping值)过高是由运营商问题还是自身设备引起的?

    先重启设备并检查本地连接,若有线网络延迟降低则问题在无线信号;通过ping网关和外部DNS判断故障范围,结合tracert追踪路径,前几跳异常指向运营商问题,最后用官方测速工具验证并联系客服解决。 判断网络延迟高是运营商还是自身设备的问题,关键在于逐步隔离排查。从最接近你的设备开始测试,向外层层推进…

    2026年9月22日
    200
  • 悟空浏览器下载速度慢怎么解决_悟空浏览器下载速度慢提升技巧

    下载慢可优化缓存、网络、后台、多线程及版本。1、清理缓存与数据;2、检查Wi-Fi并优化信号;3、关闭后台应用释放资源;4、开启多线程加速下载;5、更新浏览器至最新版本。 如果您在使用悟空浏览器下载文件时遇到速度缓慢的情况,这可能是由于网络连接不稳定、浏览器缓存堆积或后台资源被大量占用所致。优化相关…

    2026年9月22日
    600
  • 使用MockWebServer对FeignClient进行单元测试

    本文详细阐述了如何利用Spring Cloud LoadBalancer和MockWebServer对FeignClient进行高效单元测试。通过在测试配置中动态注册MockWebServer实例,并将其作为FeignClient的服务发现目标,开发者可以精确模拟后端API的行为,包括各种HTTP响…

    2026年9月22日
    100
  • Sublime快速定位MySQL死锁与阻塞问题_提高系统稳定性与并发处理能力

    Sublime快速定位MySQL死锁与阻塞问题_提高系统稳定性与并发处理能力Sublime快速定位MySQL死锁与阻塞问题_提高系统稳定性与并发处理能力Sublime快速定位MySQL死锁与阻塞问题_提高系统稳定性与并发处理能力Sublime快速定位MySQL死锁与阻塞问题_提高系统稳定性与并发处理能力

    mysql死锁和阻塞问题可通过sublime分析日志排查。1.使用关键词搜索及正则匹配快速定位死锁信息块;2.通过查找waiting状态事务并折叠无关内容聚焦阻塞链;3.结合general log与事务id查找sql执行顺序;4.利用语法高亮、列选择等功能提升日志可读性。这些方法能有效提高排查效率。…

    2026年9月22日 用户投稿
    100
  • 豫事办的密码怎么改

    首先通过个人中心修改密码或使用忘记密码功能重置。记得密码时,进入豫事办APP我的→设置→修改密码,输入原密码和新密码即可;忘记密码则在登录页点击“忘记密码”,输入手机号获取验证码后设置新密码完成重置。 如果您需要更新您的豫事办账户密码以确保账户安全,可以通过应用内设置直接修改,或在忘记密码时通过身份…

    2026年9月22日
    400
  • VSCode安全更新机制解析

    VSCode通过自动检查、数字签名验证和用户可控策略确保更新安全。启动时后台定期HTTPS请求检查新版本,每日一次;安装包经平台特定签名(Windows Authenticode、macOS代码签名、Linux GPG)验证完整性;用户可选自动更新、提示或关闭,企业可集中管控;微软通过安全入口响应漏…

    2026年9月22日
    200

发表回复

登录后才能评论
关注微信