在DynamoDB中实现高效自增ID的两种策略

在dynamodb中实现高效自增id的两种策略

本文深入探讨了在Amazon DynamoDB中实现类似关系型数据库自增ID的两种高效策略。首先,我们将介绍如何利用原子计数器来生成全局唯一的序列号,并通过两步操作确保数据一致性与无竞争条件。其次,文章将详细阐述如何通过巧妙设计排序键(Sort Key)在项目集合内实现局部序列自增,并结合条件写入机制有效处理并发冲突。这些方法旨在克服DynamoDB原生不支持序列自增的局限,为开发者提供可伸缩且可靠的解决方案,避免低效的查询最新ID再递增的模式。

Amazon DynamoDB作为一款高性能的NoSQL数据库,以其高可用性和可伸缩性著称。然而,与传统关系型数据库不同,DynamoDB并不原生支持像MySQL那样的自动递增(Auto-increment)字段,例如用于生成用户ID、订单ID等顺序编号。直接查询最新ID然后递增的做法不仅效率低下,而且在并发环境下极易导致冲突和重复ID。为了解决这一挑战,本文将介绍两种在DynamoDB中实现高效、可靠自增ID的策略。

策略一:使用原子计数器实现全局唯一序列

第一种方法是利用DynamoDB的原子更新操作来实现一个全局唯一的序列号生成器。这种方法的核心思想是维护一个专门的计数器项(counter item),每次需要新的序列号时,原子性地递增该计数器的值。

工作原理

原子递增计数器: 向存储计数器值的特定DynamoDB项发送一个UpdateItem请求,使用ADD操作符原子性地增加计数器的值。同时,通过设置ReturnValues=”UPDATED_NEW”,可以在响应中获取递增后的新值。使用新值: 获取到递增后的新值后,即可将其作为新的自增ID用于创建新的数据项。

这种方法能够保证所有对单一计数器项的写入操作都是串行执行的,从而确保每个生成的序列号都是唯一且不重复的,有效避免了竞争条件。

示例代码

以下Python(使用boto3库)示例演示了如何实现原子计数器:

import boto3from botocore.exceptions import ClientErrorimport logging# 配置日志logger = logging.getLogger(__name__)logging.basicConfig(level=logging.INFO)def get_next_sequence_id(table_name, counter_pk_value="orderCounter", attribute_name="count"):    """    通过原子计数器获取下一个序列ID。    Args:        table_name (str): DynamoDB表名。        counter_pk_value (str): 计数器项的Partition Key值。        attribute_name (str): 存储计数器值的属性名。    Returns:        int: 下一个可用的序列ID。    Raises:        ClientError: DynamoDB操作失败。        Exception: 其他意外错误。    """    dynamodb = boto3.resource('dynamodb')    table = dynamodb.Table(table_name)    try:        # 原子递增计数器,并返回新值        response = table.update_item(            Key={'pk': counter_pk_value},            UpdateExpression=f"ADD #{attribute_name} :val",            ExpressionAttributeNames={f'#{attribute_name}': attribute_name},            ExpressionAttributeValues={':val': 1},            ReturnValues="UPDATED_NEW"        )        # 提取递增后的新值        next_id = response['Attributes'][attribute_name]        logger.info(f"Generated new sequence ID: {next_id}")        return int(next_id)    except ClientError as e:        logger.error(f"Error updating atomic counter: {e}")        raise    except Exception as e:        logger.error(f"Unexpected error in get_next_sequence_id: {e}")        raise# 示例用法if __name__ == "__main__":    table_name = 'orders' # 假设你的表名为 'orders'    try:        next_order_id = get_next_sequence_id(table_name)        # 使用新生成的ID创建新的订单项        dynamodb = boto3.resource('dynamodb')        orders_table = dynamodb.Table(table_name)        orders_table.put_item(            Item={                'pk': str(next_order_id), # 将自增ID作为主键                'deliveryMethod': 'expedited',                'orderStatus': 'pending'            }        )        logger.info(f"Order {next_order_id} created successfully.")    except Exception as e:        logger.error(f"Failed to process order: {e}")

注意事项与局限性

成本与吞吐量: 每次获取新的序列号都需要一次写入操作来更新计数器项。这种方法的吞吐量受限于单个DynamoDB分区的最大写入能力。如果你的应用程序需要极高的全局序列号生成速率(例如每秒数千次),这个单一的计数器项可能会成为性能瓶颈。单一热点: 计数器项是一个“热点”,所有对序列号的请求都集中于此。适用场景: 适用于对全局唯一序列号有严格要求,且生成速率在单个分区吞吐量限制内的场景。

策略二:利用排序键(Sort Key)实现项目集合内序列

第二种方法是利用DynamoDB的排序键(Sort Key)特性,在特定的项目集合(Item Collection)内实现局部自增序列。这种方法适用于需要为不同实体(例如不同项目、不同用户)生成各自独立序列号的场景。

工作原理

设计主键: 将需要生成序列的实体ID作为分区键(Partition Key, pk),将序列号本身作为排序键(Sort Key, sk)。这样,所有属于同一实体的序列项都会存储在同一个项目集合中。查询最大排序键: 通过对特定分区键执行Query操作,并设置ScanIndexForward=False(降序排列)和Limit=1,可以高效地获取该项目集合中最大的排序键值,即当前序列的最大值。条件写入新项: 获取到最大值后,将其加1作为新的序列号。在写入新项时,使用ConditionExpression=’attribute_not_exists(pk)’或’attribute_not_exists(sk)’来确保只有当该序列号尚未被占用时才能成功写入。如果条件检查失败(意味着其他并发请求已经写入了相同的序列号),则表明发生了竞争条件,需要重新尝试获取下一个序列号并再次写入。

这种方法将序列号的生成逻辑分布到不同的项目集合中,避免了单一计数器项的瓶颈,提供了更好的可扩展性。

示例代码

以下Python(使用boto3库)示例演示了如何利用排序键实现项目集合内序列:

import boto3from boto3.dynamodb.conditions import Keyfrom botocore.exceptions import ClientErrorimport logging# 配置日志logger = logging.getLogger(__name__)logging.basicConfig(level=logging.INFO)def get_next_issue_id(table_name, project_id):    """    通过排序键获取项目集合内的下一个序列ID。    Args:        table_name (str): DynamoDB表名。        project_id (str): 项目的Partition Key值。    Returns:        int: 下一个可用的问题ID。    Raises:        ClientError: DynamoDB操作失败。        Exception: 其他意外错误。    """    dynamodb = boto3.resource('dynamodb')    client = dynamodb.Table(table_name)    highest_issue_id = 0    saved = False    while not saved:        try:            # 查询特定项目(Partition Key)下最大的排序键(Sort Key)            response = client.query(                KeyConditionExpression=Key('pk').eq(project_id),                ScanIndexForward=False, # 降序排列                Limit=1 # 只取一个,即最大值            )            # 提取当前最大的序列号            if response['Count'] > 0:                highest_issue_id = int(response['Items'][0]['sk'])            next_issue_id = highest_issue_id + 1            logger.info(f"Attempting to write issue with ID: {next_issue_id} for project: {project_id}")            # 使用条件写入,确保该序列号尚未存在            # 这里使用 attribute_not_exists(sk) 更准确,因为 pk 必然存在            client.put_item(                Item={                    'pk': project_id,                     'sk': next_issue_id,                     'priority': 'low',                    'description': f'Issue {next_issue_id} for {project_id}'                },                ConditionExpression='attribute_not_exists(sk)' # 确保该排序键不存在            )            saved = True            logger.info(f"Successfully created issue {next_issue_id} for project {project_id}.")            return next_issue_id        except client.meta.client.exceptions.ConditionalCheckFailedException:            # 发生竞争条件,其他进程已写入相同ID,需要重试            logger.warning(f"ConditionalCheckFailed for project {project_id}, retrying with next ID.")            highest_issue_id = next_issue_id # 更新 highest_issue_id 为刚刚尝试的失败值,下次循环会在此基础上+1            # 实际上,这里更安全的做法是重新查询 highest_issue_id,因为可能有多个并发写入            # 但为了简化示例,我们直接在失败的ID上递增            # 生产环境中,重新查询确保拿到最新的最高ID会更健壮            # 如下所示:            # highest_issue_id = 0 # 重置,重新查询            # continue # 重新进入循环,再次查询最新最高ID        except ClientError as e:            logger.error(f"Error during DynamoDB operation: {e}")            raise        except Exception as e:            logger.error(f"Unexpected error in get_next_issue_id: {e}")            raise# 示例用法if __name__ == "__main__":    table_name = 'projects' # 假设你的表名为 'projects'    project_id_a = 'projectA'    project_id_b = 'projectB'    try:        # 为 projectA 生成一个问题ID        new_issue_id_a = get_next_issue_id(table_name, project_id_a)        print(f"New issue ID for {project_id_a}: {new_issue_id_a}")        # 为 projectB 生成一个问题ID        new_issue_id_b = get_next_issue_id(table_name, project_id_b)        print(f"New issue ID for {project_id_b}: {new_issue_id_b}")        # 再次为 projectA 生成一个问题ID        new_issue_id_a_2 = get_next_issue_id(table_name, project_id_a)        print(f"Second new issue ID for {project_id_a}: {new_issue_id_a_2}")    except Exception as e:        logger.error(f"Failed to generate issue ID: {e}")

注意事项与局限性

并发处理: 这种方法需要显式处理并发写入可能导致的ConditionalCheckFailedException异常。当异常发生时,应用程序需要重新查询最新的最大序列号,然后再次尝试写入,直到成功。查询成本: 每次获取序列号都需要一次Query操作来查找最大排序键,加上一次PutItem操作。适用场景: 适用于需要为多个独立实体生成各自序列号的场景,例如为每个用户生成独立的帖子ID,或为每个项目生成独立的任务ID。这种方法在扩展性上优于单一原子计数器,因为不同的分区键可以并行处理。排序键类型: 排序键必须是数字类型,以便进行有效的数值比较和递增。

两种策略的选择与考量

特性 原子计数器(策略一) 排序键序列(策略二)

适用场景需要全局唯一的连续序列号需要为不同实体(项目集合)生成独立的连续序列号竞争条件内部原子操作保证无竞争需要通过条件写入和重试机制处理并发冲突吞吐量受限于单个计数器项的写入吞吐量,可能成为热点分布到不同的项目集合,可扩展性更好操作成本1次UpdateItem (写入)1次Query (读取) + 1次PutItem (写入)实现复杂度相对简单需要处理并发重试逻辑,稍复杂

总结

DynamoDB虽然不提供原生自增ID功能,但通过巧妙利用其原子更新和主键设计特性,我们依然可以实现高效且可靠的自增序列。

对于需要全局唯一且严格连续的序列号,原子计数器是简单有效的选择,但需注意其在极高并发下的吞吐量瓶颈。对于需要为不同实体生成各自独立序列的场景,利用排序键的方法提供了更好的可扩展性,通过条件写入和重试机制可以有效处理并发。

在实际应用中,开发者应根据业务需求、并发量和对序列严格程度的要求,选择最合适的实现策略。避免直接查询所有数据来获取最大值并递增,因为这种方法不仅效率低下,且在高并发场景下极易导致数据不一致。

以上就是在DynamoDB中实现高效自增ID的两种策略的详细内容,更多请关注创想鸟其它相关文章!

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

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Pandas MultiIndex DataFrame 多级自定义分组聚合教程
上一篇 2025年12月14日 22:28:32
高效处理大量CSV文件:Pandas循环优化与多线程应用
下一篇 2025年12月14日 22:28:51

相关推荐

  • MySQL怎样使用索引合并优化 复合索引与索引合并策略

    MySQL怎样使用索引合并优化 复合索引与索引合并策略MySQL怎样使用索引合并优化 复合索引与索引合并策略MySQL怎样使用索引合并优化 复合索引与索引合并策略MySQL怎样使用索引合并优化 复合索引与索引合并策略

    索引合并是mysql中一种优化策略,允许在单个查询中使用多个索引来定位数据。其主要类型包括:1. union合并,用于or连接的条件;2. intersection合并,用于and连接的条件;3. sort-union合并,用于需排序后再合并的情况。复合索引与索引合并不同,前者是多列组合索引,后者则…

    2026年9月28日 • 用户投稿
    000
  • 深入理解Java泛型:类型参数与方法重载的实践指南

    深入理解Java泛型:类型参数与方法重载的实践指南深入理解Java泛型:类型参数与方法重载的实践指南深入理解Java泛型:类型参数与方法重载的实践指南深入理解Java泛型:类型参数与方法重载的实践指南

    本文深入探讨了Java泛型中关于类型参数与泛型类实例在方法签名中的区别,以及由此引发的类型不匹配问题。通过一个具体的代码示例,详细解析了为何在泛型方法中,直接传入泛型类实例或其内部类型参数会引发编译错误,并提供了利用方法重载这一核心机制来优雅地解决此类问题的专业指导和示例代码,帮助开发者清晰理解“h…

    2026年9月28日 • 用户投稿
    100
  • 如何用豆包AI写协程代码 协程代码的AI编写技巧大公开

    如何用豆包AI写协程代码 协程代码的AI编写技巧大公开如何用豆包AI写协程代码 协程代码的AI编写技巧大公开如何用豆包AI写协程代码 协程代码的AI编写技巧大公开如何用豆包AI写协程代码 协程代码的AI编写技巧大公开

    用豆包ai写协程代码的关键在于提问方式与后续优化。一、明确所需协程类型,如并发下载或任务管理,提问越具体生成代码越实用;二、注意避免阻塞调用,如将time.sleep改为await asyncio.sleep;三、善用提示词提升代码质量,如指定库、并发数及异常处理;四、结合项目结构调整代码,适配模块…

    2026年9月28日 • 用户投稿
    200
  • sublime怎么显示空格和制表符_Sublime Text显示所有空白字符设置

    sublime怎么显示空格和制表符_Sublime Text显示所有空白字符设置sublime怎么显示空格和制表符_Sublime Text显示所有空白字符设置sublime怎么显示空格和制表符_Sublime Text显示所有空白字符设置sublime怎么显示空格和制表符_Sublime Text显示所有空白字符设置

    开启Sublime Text的“draw_white_space”: “all”设置可显示空格为·、制表符为→,便于检查缩进和空白字符,提升代码规范性。 在Sublime Text中显示空格和制表符,可以帮助你更清楚地查看代码中的空白字符,提升代码整洁度和可读性。要开启显示所…

    2026年9月28日 • 用户投稿
    000
  • 洗碗机普及迎来攻坚战,行业探寻市场爆发“黄金拐点”

    洗碗机普及迎来攻坚战,行业探寻市场爆发“黄金拐点”洗碗机普及迎来攻坚战,行业探寻市场爆发“黄金拐点”洗碗机普及迎来攻坚战,行业探寻市场爆发“黄金拐点”洗碗机普及迎来攻坚战,行业探寻市场爆发“黄金拐点”

    家电行业中,谁是最被看好的“潜力股”之一?洗碗机当之不让。但是现实困境却是,洗碗机渗透率徘徊在4%左右迟迟难以突破,原因何在,又该如何破局? 2025年9月17日,由中国家电网主办的“碗美无菌国补焕新2025中国洗碗机行业高峰论坛”在千年瓷都景德镇拉开帷幕,来自A.O.史密斯、卡萨帝、finish亮…

    2026年9月28日 • 用户投稿
    100
  • 如何用豆包AI生成Python环境配置代码

    如何用豆包AI生成Python环境配置代码如何用豆包AI生成Python环境配置代码如何用豆包AI生成Python环境配置代码如何用豆包AI生成Python环境配置代码

    豆包ai可辅助生成python环境配置代码。1. 首先明确项目需求,如python版本、依赖库和虚拟环境类型;2. 向豆包ai输入具体提示词,获取创建venv和requirements.txt的命令;3. 如需复杂配置,可要求生成开发与生产环境分离的依赖文件;4. 注意版本控制、输出验证及通过多轮交…

    2026年9月28日 • 用户投稿
    100
  • JPype集成Aspose.Cells:解决Java堆内存溢出错误指南

    JPype集成Aspose.Cells:解决Java堆内存溢出错误指南JPype集成Aspose.Cells:解决Java堆内存溢出错误指南JPype集成Aspose.Cells:解决Java堆内存溢出错误指南JPype集成Aspose.Cells:解决Java堆内存溢出错误指南

    当Python程序通过JPype调用Java库(如Aspose.Cells)处理大型文件时,可能遭遇java.lang.OutOfMemoryError: Java heap space。本文将详细指导如何通过在jpype.startJVM()中配置JVM的最大堆内存参数来有效解决此类问题,确保Py…

    2026年9月28日 • 用户投稿
    200
  • sublime怎么快速注释和取消注释代码_Sublime代码块注释与取消注释的快捷操作

    sublime怎么快速注释和取消注释代码_Sublime代码块注释与取消注释的快捷操作sublime怎么快速注释和取消注释代码_Sublime代码块注释与取消注释的快捷操作sublime怎么快速注释和取消注释代码_Sublime代码块注释与取消注释的快捷操作sublime怎么快速注释和取消注释代码_Sublime代码块注释与取消注释的快捷操作

    Sublime Text中行注释快捷键为Ctrl + /(Windows/Linux)或Cmd + /(macOS),用于单行或多行代码的快速注释与取消;块注释快捷键为Ctrl + Shift + / 或Cmd + Shift + /,可将选中代码块用语言特定符号包裹。 在Sublime Text中…

    2026年9月28日 • 用户投稿
    100
  • 豆包AI生成项目预算表的技巧 快速规划资源投入的指南

    豆包AI生成项目预算表的技巧 快速规划资源投入的指南豆包AI生成项目预算表的技巧 快速规划资源投入的指南豆包AI生成项目预算表的技巧 快速规划资源投入的指南豆包AI生成项目预算表的技巧 快速规划资源投入的指南

    做项目预算的关键是明确目标与合理分类。首先需明确项目目标和范围,向豆包ai输入一句话生成初步预算框架;其次将预算分为人力、技术、外包等清晰类别,并用工具生成参考表格;三要为每项预算预留弹性空间,尤其ai项目的不确定性环节;四要定期更新对比预算,利用豆包ai的协作功能跟踪变化并分析调整。 ☞☞☞AI …

    2026年9月28日 • 用户投稿
    100
  • 十一小长假肆意畅玩!华硕RTX5060甜品卡全力助能

    十一小长假肆意畅玩!华硕RTX5060甜品卡全力助能十一小长假肆意畅玩!华硕RTX5060甜品卡全力助能十一小长假肆意畅玩!华硕RTX5060甜品卡全力助能十一小长假肆意畅玩!华硕RTX5060甜品卡全力助能

    十一假期的脚步渐近,想想即将到来的悠闲小长假,小伙伴们准备怎样度过呢?宅家开启电竞狂欢才是明智之选!在这个假期,有诸多佳作等你来战,准备好投身一场热血沸腾的电竞之旅了吗~ 想要顺利畅享游戏大作带来的极致体验,DLSS技术的支持至关重要。DLSS是一套创新性的神经网络渲染技术,借助AI提升帧率、降低延…

    2026年9月28日 • 用户投稿
    400
  • 使用 Java 泛型实现 CSV 到对象的转换器

    使用 Java 泛型实现 CSV 到对象的转换器使用 Java 泛型实现 CSV 到对象的转换器使用 Java 泛型实现 CSV 到对象的转换器使用 Java 泛型实现 CSV 到对象的转换器

    本文将介绍如何使用 Java 泛型创建一个通用的 CSV 到对象的转换器。通过泛型,我们可以避免为每种需要转换的 Java 类编写重复的代码,从而提高代码的可重用性和可维护性。文章将提供代码示例,并讨论一些关于代码设计和现有 CSV 解析库的建议。 泛型 CSV 工具类 使用 Java 泛型可以创建…

    2026年9月28日 • 用户投稿
    100
  • sublime怎么显示函数列表_Sublime Text快速跳转到函数或符号定义

    sublime怎么显示函数列表_Sublime Text快速跳转到函数或符号定义sublime怎么显示函数列表_Sublime Text快速跳转到函数或符号定义sublime怎么显示函数列表_Sublime Text快速跳转到函数或符号定义sublime怎么显示函数列表_Sublime Text快速跳转到函数或符号定义

    使用Ctrl+R或Cmd+R调用内置符号跳转功能,可快速定位当前文件的函数、类等定义;通过安装CTags、Symbol Browser或SublimeCodeIntel等插件,能实现跨文件跳转与更精准识别;配合LSP插件启用Goto Definition(F12),可获得类似IDE的智能跳转体验,显…

    2026年9月28日 • 用户投稿
    400
  • 怎么用豆包AI帮我解析XML数据 XML数据解析的AI实现方法详解

    怎么用豆包AI帮我解析XML数据 XML数据解析的AI实现方法详解怎么用豆包AI帮我解析XML数据 XML数据解析的AI实现方法详解怎么用豆包AI帮我解析XML数据 XML数据解析的AI实现方法详解怎么用豆包AI帮我解析XML数据 XML数据解析的AI实现方法详解

    xml数据解析借助豆包ai可简化为四个步骤:1. 发送xml内容让ai分析结构,明确标签层级与关键节点;2. 要求ai生成对应语言的解析代码,如python使用elementtree提取数据;3. 利用ai检查并修复格式错误,如未闭合标签或缺失引号;4. 指定需提取字段及输出格式,如json或csv…

    2026年9月28日 • 用户投稿
    100
  • 图片生成3d效果图的ai工具2025前十榜单

    2025年图片生成3D效果图的AI工具将由多模态理解、高效三维重建与用户友好性领先的平台主导,核心在于简化建模流程、提升真实感与可编辑性,融合NeRF、高斯泼溅与扩散模型等技术,实现从2D图像到高质量3D资产的智能转换,赋能设计、游戏、电商等领域。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索…

    2026年9月28日
    400
  • Python实现多维数组元素条件求和匹配:组合查找算法详解

    本文详细阐述了如何使用Python的itertools.combinations模块,高效地查找一组候选数组的组合,使得其元素按位累加和满足或超过目标数组的对应值。文章通过具体代码示例,展示了暴力破解法的实现细节,并探讨了在处理大规模数据时可能面临的性能问题及潜在的优化方向。 引言:多维数组的条件求…

    2026年9月28日
    100
  • sublime怎么配置ctags实现函数跳转_Sublime配置CTags实现代码定义与函数跳转

    sublime怎么配置ctags实现函数跳转_Sublime配置CTags实现代码定义与函数跳转sublime怎么配置ctags实现函数跳转_Sublime配置CTags实现代码定义与函数跳转sublime怎么配置ctags实现函数跳转_Sublime配置CTags实现代码定义与函数跳转sublime怎么配置ctags实现函数跳转_Sublime配置CTags实现代码定义与函数跳转

    答案:配置Sublime Text函数跳转需安装CTags工具并设置SublimeCTags插件。先通过包管理器或手动安装Universal/Exuberant Ctags,确保命令行可执行;再在Sublime中用Package Control安装SublimeCTags插件;接着在用户设置中指定c…

    2026年9月28日 • 用户投稿
    100
  • 抖音流量来源其他是什么?抖音流量神器软件

    抖音流量来源其他是什么?抖音流量神器软件抖音流量来源其他是什么?抖音流量神器软件抖音流量来源其他是什么?抖音流量神器软件抖音流量来源其他是什么?抖音流量神器软件

    抖音,作为当下最火热的短视频平台之一,自上线以来便迅速席卷全国,成为用户娱乐、创作者变现和品牌营销的重要阵地。那么,抖音的流量究竟从何而来?除了我们熟知的内容创作,还有哪些关键因素在推动流量增长?今天就来深入解析抖音背后的流量密码。 一、优质内容:流量的核心驱动力 内容始终是抖音生态中最根本的流量来…

    2026年9月28日 • 用户投稿
    100
  • 如何利用Elser AI Comics批量生成漫画并提高创作效率?

    如何利用Elser AI Comics批量生成漫画并提高创作效率?如何利用Elser AI Comics批量生成漫画并提高创作效率?如何利用Elser AI Comics批量生成漫画并提高创作效率?如何利用Elser AI Comics批量生成漫画并提高创作效率?

    用elser ai comics批量生成漫画的关键在于掌握模板机制、角色统一设定和自动分镜功能。一、提前规划内容结构,明确每话大纲、角色、剧情节点和关键台词,写剧本草稿并标注重点画面,统一角色设定以节省调整时间;二、使用自定义模板保存常用构图、配色和字体,实现风格统一与快速复用,例如封面、回顾格与对…

    2026年9月28日 • 用户投稿
    300
  • 马斯克的 Grok 聊天机器人以超低价赢得美国政府合约

    马斯克的 Grok 聊天机器人以超低价赢得美国政府合约马斯克的 Grok 聊天机器人以超低价赢得美国政府合约马斯克的 Grok 聊天机器人以超低价赢得美国政府合约马斯克的 Grok 聊天机器人以超低价赢得美国政府合约

    埃隆・马斯克旗下的 xAI 公司近日宣布,已与美国联邦政府达成一项重要协议:其开发的人工智能聊天机器人 Grok 将以极低的价格向联邦机构提供服务。 根据与美国总务管理局签订的合同,各联邦部门在未来一年半内使用 Grok,每单位服务费用仅为42美分,远低于1美元的市场主流定价。这一价格显著低于目前在…

    2026年9月28日 • 用户投稿
    100
  • 告别加班:豆包AI集成DeepSeek后自动化处理Excel/Word技巧

    告别加班:豆包AI集成DeepSeek后自动化处理Excel/Word技巧告别加班:豆包AI集成DeepSeek后自动化处理Excel/Word技巧告别加班:豆包AI集成DeepSeek后自动化处理Excel/Word技巧告别加班:豆包AI集成DeepSeek后自动化处理Excel/Word技巧

    告别加班的核心在于利用豆包ai集成deepseek的能力实现办公自动化。1. excel数据清洗与分析可由自然语言描述规则,自动完成数据清洗、分析及图表生成;2. word文档批量处理支持文本替换、格式调整等操作,提升文档编辑效率;3. 复杂文档生成通过模板和数据自动填充,实现合同、简历等个性化文档…

    2026年9月28日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信