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

千万级用户购物车系统的架构设计

我们当时搞的购物车服务其实还是有点庞大的看似是一个简单的CRUD但是当你真正去实现一个购物车的时候发现压根不是那回事。当商品类型从单一SKU扩展到普通商品、套餐组合、活动商品拼单等混合的时候一次加购操作从校验库存、加载促销规则、计算包装费、调用结算中心到最后持久化涉及十几个步骤有的能并行有的必须串行有的允许失败有的必须成功。把这些逻辑全堆在一个Service方法里维护性不好。这篇文章聊的就是怎么从架构层面解决这些问题用什么样的引擎来编排这些业务流程、购物车数据怎么存才能扛住千万级并发、以及不同类型的购物车如何共享一套基础设施。后续我会单独出专栏把每个模块的实现细节拆开来讲。这篇文章只聊架构设计思路不会涉及太多代码细节。全局概览先给一个整体视角。购物车服务在整个电商链路中的位置大致是这样的用户端小程序/App的所有购物车操作经过网关后打到购物车服务。购物车服务内部的核心逻辑由流程链引擎驱动数据主存储在Redis Cluster通过MQ异步持久化到MySQL。购物车不做价格计算价格相关的逻辑全部下沉到结算中心购物车通过RPC调用结算中心拿到最终价格。商品信息、库存状态、促销规则这些数据则通过RPC调用商品服务和营销服务获取。几个关键的架构决策Redis Cluster作为数据主存储不是缓存。购物车的所有读写操作直接打Redis不经过MySQLMQ异步落库到MySQL作为数据持久化层和BI分析数据源流程链引擎编排所有业务逻辑每种购物车操作加购、勾选、查详情、结算对应一条独立的流程链结算中心解耦购物车只管理商品组合不涉及价格计算下面逐个展开讲。流程链引擎为什么不能把逻辑写在Service方法里一个加购操作的完整流程大概是这样初始化上下文 → 加载购物车数据 → 校验商品是否可售 → 构建商品单元 → 加载关联商品异步→ 清洗无效商品 → 添加商品到购物车 → 校验门店状态等待异步完成→ 清理下架商品 → 处理包装费 → 加载促销规则 → 调用结算中心 → 异步持久化。十几个步骤。如果写在一个方法里至少三个问题第一不同操作之间的步骤有大量重叠。加购和勾选共享80%的步骤只有中间几步不一样。写在方法里就得if-else区分改一个步骤怕影响另一个操作。第二有些步骤之间有并行机会。比如加载关联商品和清洗当前购物车商品这两件事互不依赖可以并行执行。写在方法里很难优雅地处理这种并行依赖关系。第三保存购物车这个步骤不需要阻塞请求返回。用户点了加购购物车数据写Redis成功就可以返回了持久化可以异步做。这种同步异步混合的执行策略在普通的Service方法里很难表达。所以需要一个流程编排引擎来解决这三个问题步骤复用、并行执行、同步异步混合。流程链的核心抽象整个引擎只有两个核心概念处理节点和处理链。处理节点定义了一个步骤该做什么publicinterfaceProcessNodeTextendsContextRule{defaultbooleanisEnable(Tcontext){returntrue;}booleanexecute(Tcontext);defaultStringgetName(){returnthis.getClass().getSimpleName();}}处理链负责编排这些节点的执行顺序和方式newProcessChainEditContext(加购).context(newEditContext(user,form,cartKey)).sync(initNode).sync(loadCartNode).sync(validateItemNode).async(1,loadRelatedItemsNode).sync(addItemNode).sync(checkShopNode,1).async(persistCartNode).done();sync()是同步执行按顺序一个个走。async(1, node)是异步执行丢到线程池里跑数字1是这个异步任务的编号。sync(node, 1)表示这个同步节点执行之前先等编号1的异步任务完成。这样就解决了前面说的三个问题步骤复用每个处理节点是独立的Spring Bean哪条链需要就组装进去不需要就不放。并行执行有依赖关系的用编号等待无依赖的直接并行。比如查购物车详情时加载关联商品async 1、清洗关联数据async 2, 等待1、清洗普通商品async 3三个异步任务可以并行后面的校验门店状态sync, 等待1,2,3会等这三个都完成再执行。同步异步混合保存购物车用async()不带编号或负编号意味着链结束时不等它完成。用户请求返回了后台默默把数据持久化。不同操作的流程链编排对比这是四种核心购物车操作各自的流程链步骤可以看到共享基础设施的程度流程步骤加购勾选查详情结算初始化上下文同步同步同步同步加载下架数据同步同步同步同步加载购物车同步同步同步同步校验商品可售同步---构建商品单元同步---处理勾选状态-同步--加载关联商品异步同步异步异步清洗无效商品同步同步异步同步添加到购物车同步---校验门店状态同步(等待异步)同步同步(等待全部异步)同步清理下架商品同步同步同步同步处理包装费同步同步同步同步加载促销规则同步同步同步同步调用结算中心同步同步同步同步持久化异步(不等待)异步(不等待)异步(不等待)异步(不等待)加购链最长有15个步骤。查详情链用了更多的异步并行因为它不修改数据多个读操作可以安全地并发执行。所有操作链都把持久化放在最后一步异步执行不阻塞用户请求。这张表也是我判断这套架构是否合理的依据如果大部分步骤只在一种操作中出现说明拆分粒度太细了不如直接写在方法里如果大部分步骤在所有操作中都出现说明复用率高流程链引擎的收益明显。从表中看大约60%的步骤被多种操作共享这个比例说明引擎化是值得的。Redis主存储与异步落库为什么选Redis做主存储购物车数据放Redis还是MySQL这不是一个见仁见智的问题在千万级用户体量下答案很明确Redis。原因有三个第一购物车是写多读多的场景。用户每加一个商品、改一次数量、选一次规格都是一次写操作。高峰期比如大促或者新品上线写入QPS可能到数万级MySQL单实例的写入能力大约在几千到万级TPS分库分表能提升但架构复杂度剧增。第二购物车数据结构天然适合Redis Hash。一个用户的购物车可以用一个Hash表示field是商品类型普通商品、套餐、包装value是对应的JSON数组。加购就是读出来、追加、写回去Redis Hash的hget/hset操作是O(1)的。第三购物车数据有过期属性。90天没操作的购物车可以直接过期清理Redis天然支持TTL。MySQL要做这种清理需要额外的定时任务扫描删除。实际的存储结构大致是这样Key:cart:user:{userId}Fields:product_item →[商品列表JSON]combo/package→{对应类型JSON}version → 版本号,timestamp → 最近操作时间每个用户一个Hash Key不同类型的商品放在不同的field里。个人购物车TTL设为90天拼单购物车TTL设为1天。Redis Cluster的选型决策Redis有三种部署模式主从复制、哨兵、集群。千万级用户场景选哪个需要算两笔账。先算存储量这是选Cluster最直接的理由。千万用户不是所有人都有购物车数据按30%活跃率算300万个购物车Hash。每个Hash平均大小约5KB包含几件到十几件商品的JSON总共约15GB。考虑到Redis内存碎片和数据结构开销实际内存占用大约是原始数据的1.52倍按30GB估算。如果按全量千万用户算原始数据50GB实际占用75100GB。问题出在RDB持久化。Redis做RDB快照时会fork子进程fork瞬间需要复制页表写时复制COW机制下如果写入频繁父子进程的内存占用会逐渐接近两倍。一台128GB的机器跑100GB的Redis实例RDB触发时内存大概率不够用。要么关RDB只用AOF丢数据风险增大要么限制单实例容量在机器内存的一半以下。无论哪种单实例在这个数据量级下都很勉强。再看写入QPS。千万用户中日活假设20%200万每人每天平均操作购物车3次就是600万次写操作/天。均摊下来约70次/秒。高峰时段集中了一天50%的流量假设集中在4小时内高峰期平均约200/s尖峰秒级可能到千级别。大促期间DAU和人均操作都会翻倍尖峰QPS可能到几千。单master对简单命令的理论吞吐是10万/s但购物车用的是HGET/HSET操作5KB左右的value实际吞吐大概在3~5万/s。日常几千的峰值单master是扛得住的。选Cluster不是因为单master的QPS不够而是因为存储量撑不住单实例。既然存储已经需要分片了写入能力的线性扩展就是附带的收益大促场景下不需要担心单点瓶颈。部署模式写能力存储容量自动故障转移水平扩展适用规模主从复制单主写入有上限单机内存无需人工介入不支持百万以下哨兵模式单主写入有上限单机内存有不支持百万级Cluster集群多主分片写入多节点叠加有支持千万级及以上结论千万级用户建议上Cluster。Cluster把16384个哈希槽分散到多个master节点存储和写入压力都被分摊。购物车场景用Cluster还有一个天然优势购物车数据按用户ID隔离不存在跨用户的事务需求。用户ID做Hash分片后同一个用户的数据一定落在同一个slot不会出现跨slot操作。这和订单系统不一样订单可能需要按商家维度做跨用户查询购物车是天生适合Cluster分片的业务。实际部署建议6节点起步3主3从每个master分配约20GB内存。业务量上涨后平滑扩展到9节点或12节点即可不需要改应用代码。Redis数据为什么必须落库Redis虽然有RDB和AOF持久化机制但指望它当唯一存储是有风险的集群故障切换时主从切换可能丢几秒的写入数据运维失误误执行FLUSHDB、机器硬件故障都可能导致数据丢失客服需要恢复用户购物车数据从Redis里不方便查运营和BI团队需要分析用户的加购行为、购物车转化率必须有结构化的MySQL数据京东的购物车系统也是类似架构Redis作为主存储承接读写MySQL作为持久化存储做兜底和分析。异步双写对短暂的写入延迟有一定容忍度。异步落库方案的技术选型怎么把Redis的数据同步到MySQL三种方案摆在面前方案实时性可靠性实现复杂度适用场景MQ实时异步秒级延迟MQ故障时有风险中等对跨端一致性有要求定时任务扫描分钟级延迟有时间窗口风险简单可接受分钟级延迟混合方案MQ 定时兜底秒级最高较高大厂生产环境我最开始倾向于定时任务因为实现简单购物车数据不像订单那样对丢失零容忍。后来在生产环境碰到一个问题用户在手机上加了3件商品切到电脑上打开发现购物车是空的。定时任务还没跑到MySQL里没有最新数据而电脑端走了降级逻辑从MySQL读取。对用户来说这就是Bug。购物车跨端一致性的要求决定了必须用实时异步。但MQ本身也可能挂所以最终选了MQ 定时任务兜底的混合方案。正常链路走MQ几秒内落库MQ挂了或者消费失败定时任务每5分钟扫一次对比Redis和MySQL中购物车的version字段不一致的重新同步。有人会问MQ和定时任务都上是不是过度设计不是。定时任务的角色是保险绳正常情况下它什么都不做对比version发现一致就跳过。只在MQ链路出故障时才生效。这两套机制的职责不重叠MQ负责实时定时任务负责兜底。维护成本可接受。高频操作的写合并这里有一个容易被忽略的问题用户在购物车里加1、减1、再加13秒内可能操作5次。如果每次操作都立刻发MQ一个用户一天操作20次购物车千万活跃用户就是两亿条MQ消息。数据库也扛不住这种写入频率。核心认知购物车只需要持久化最终状态中间状态没有业务意义。用户把数量从1改到2再改到3MySQL里只需要最终值3中间的变化过程不需要记录。这和订单不一样订单的每次状态变更都有业务含义购物车没有。基于这个认知写合并策略有三种选择策略原理延迟MQ流量削减效果延迟消息合并操作后发延迟5秒的MQ消息消费时读Redis最新状态5秒5秒内N次操作→1次落库脏标记 定时刷盘写Redis时打dirty标记定时扫描批量落库3~10秒N次操作→1次落库本地攒批 定时提交应用内存攒变更到阈值后批量发MQ可控攒批期间→1次落库我选延迟消息。做法是用户每次操作购物车写Redis成功后检查一个expire为5秒的标记keycart:sync:{userId}。如果这个key不存在发一条延迟5秒的MQ消息并设置标记key如果key已存在说明5秒内已经发过消息了跳过。5秒后消费者收到消息从Redis读取当前最新状态一次性写入MySQLreplace into全量覆盖。不管中间用户操作了多少次落库只有最终状态。为什么不选脏标记方案两个原因第一脏标记需要额外维护一个dirty集合定时任务扫描这个集合时如果用户量大会有热点问题第二定时任务的写入是批量的、周期性的每隔几秒一波写入打到数据库对MySQL不够友好。延迟消息的写入天然是分散的每个用户的5秒倒计时起点不同数据库压力更均匀。降级策略任何依赖外部组件的架构都需要考虑挂了怎么办Redis Cluster全挂概率极低但必须有预案。自动降级到MySQL直读直写QPS承接能力下降但业务不中断。恢复后从MySQL预热数据回Redis。MQ挂了Redis继续正常服务主存储不受影响定时任务兜底落库用户无感知。MQ恢复后积压的消息自动消费。MySQL挂了对用户无影响用户请求只走Redis但异步落库会暂停。MQ消息堆积MySQL恢复后自动消费堆积消息补数据。多类型购物车的抽象这套购物车系统不只服务一种场景。有个人购物车一个人自己下单、拼单购物车多人拼一单、团餐购物车企业团餐。三种购物车的业务逻辑差异很大但底层的流程链引擎和Redis存储方案是共享的。购物车类型存储Key模式过期时间写入者结算方式个人购物车cart:user:{userId}90天单人独立结算拼单购物车cart:spell:{roomId}:{userId}1天多人各写各的合并结算团餐购物车cart:group:{userId}90天单人团餐结算三种购物车共享相同的流程链基础设施ProcessChain ProcessNode但各自组装不同的流程节点。比如拼单购物车额外需要一个「同步房间版本号」的节点团餐购物车需要一个「校验团餐菜单」的节点这些节点在个人购物车链中不存在。这种设计的好处是新增一种购物车类型时不需要从零开始。创建一个新的Service实现组装需要的流程节点定义自己的Redis Key模式就完成了。共享的节点如调用结算中心、持久化、清洗下架商品直接复用只需要写差异化的节点。与结算中心的协作购物车系统有一个明确的职责边界只管理商品组合不做价格计算。用户在购物车里看到的价格、优惠、满减金额都不是购物车自己算的。购物车的流程链中有一个节点专门做这件事把当前购物车里的商品列表和用户信息打包通过RPC调用结算中心结算中心返回每件商品的最终价格和优惠明细。为什么要这样拆分因为价格计算的规则复杂度远高于购物车本身。满减、折扣、优惠券叠加、会员价、限时特价这些规则的排列组合和优先级处理如果放在购物车服务里购物车会变成一个巨无霸。结算中心独立出来后购物车的代码量和复杂度控制在一个合理范围内。降级策略结算中心超时或不可用时购物车返回商品原价并在前端标注「促销信息加载中」。用户能看到购物车内容只是价格暂时不准确。等结算中心恢复后刷新即可。这比购物车整个不可用要好。小结购物车系统的架构设计核心不在于用了什么技术组件而在于几个关键判断第一个判断是购物车数据的特性。购物车是整体性数据每次修改都是全量覆盖。用户加了一件商品实际是把整个购物车读出来、追加一件、整体写回去。这个特性决定了它的一致性要求比订单低得多可以接受最终一致性可以用延迟消息做写合并。如果你的业务数据也有类似的「全量覆盖」特性很多架构方案可以直接复用。第二个判断是流程编排的投入产出比。不是所有业务都需要自研流程引擎。判断标准很简单如果你的核心操作超过8个步骤且不同操作之间共享超过50%的步骤引擎化的收益就是正的。如果只有三五个步骤或者每种操作完全独立直接写方法反而更清晰。第三个判断是存储架构跟着数据量走。Redis Cluster不是因为它先进才选是因为千万级用户的存储量和写入QPS算下来单master撑不住。如果你的用户量在百万以下哨兵模式完全够用。架构选型不是选最强的是选刚好够用且留有余量的。购物车看起来简单但它是「简单的接口、复杂的内部」的典型代表。好的架构不是把它变复杂而是用合理的抽象把复杂度管理起来让每一层看起来都是简单的。渠道发布最近在知乎出了「应付6000万会员的秒杀系统专栏」和「几亿用户,百万并发的C端商品系统实战」专栏感兴趣的可以订阅一下。至于知识星球的可以搜老码头的技术浮生录它是一个能实际帮你解决难题的星球。有问题的找知心的Sam哥支持无限次语音一对一解决你遇到的难题。「另外后续我新写的所有对外的付费专栏在星球内都是免费的且可以拿到所有源代码。」知识星球内后续将推出20个付费专栏覆盖电商全链路选购线用户会员营销线中后台购物车服务营销系统订单系统商品服务用户系统支付系统菜单服务结算服务从前台选购到中后台结算星球成员全部免费后续新增也不额外收费。我的知乎账号:SamDeepThinking

相关文章:

千万级用户购物车系统的架构设计

我们当时搞的购物车服务,其实还是有点庞大的,看似是一个简单的CRUD,但是当你真正去实现一个购物车的时候,发现压根不是那回事。 当商品类型从单一SKU扩展到普通商品、套餐组合、活动商品,拼单等混合的时候,…...

中兴860A四川电信高安版救砖记:遥控失效后,我是如何通过修改init.rc寄生脚本让遥控器起死回生的

中兴860A四川电信高安版遥控失效深度修复指南 当你的中兴860A四川电信高安版机顶盒突然"罢工",遥控器怎么按都没反应,那种感觉就像电视突然变成了哑巴。这不是简单的配对问题,而是一场与系统底层限制的较量。本文将带你深入Android…...

从Arrays.fill()到Stream API:Java二维数组初始化的几种高效写法与性能对比

从Arrays.fill()到Stream API:Java二维数组初始化的几种高效写法与性能对比 在算法竞赛和数据处理应用中,二维数组的初始化往往是性能优化的第一个瓶颈。我曾在一个图像处理项目中,因为选择了不当的初始化方式,导致整体性能下降了…...

从极坐标栅格到地面点云:一种基于坡度与邻域一致性的分割实践

1. 极坐标栅格构建:自动驾驶的"地面扫描仪" 想象你正在玩一款赛车游戏,车辆需要自动识别哪些是能开的平坦路面,哪些是必须绕开的障碍物。现实中自动驾驶车辆面临同样的挑战,而极坐标栅格就是它的"地面扫描仪"…...

保姆级教程:用Intel官方工具搞定Realsense D435深度不准和黑点问题

深度视觉优化实战:Intel RealSense D435深度校准全流程解析 刚拆封的RealSense D435摄像头在深度模式下出现零星黑点?深度图某些区域数值明显失真?这些问题往往不是硬件缺陷,而是出厂校准参数与实际使用环境不匹配导致的。作为计算…...

开源高级提示词数据库:一键部署,解锁AI生产力

1. 项目概述:一个开箱即用的高级提示词数据库如果你和我一样,经常在ChatGPT、Claude或者Midjourney这类AI工具里折腾,那你肯定明白一个道理:好的提示词(Prompt)就是生产力。但问题来了,那些真正…...

别再只会addItem了!QT QComboBox的5个高级用法与实战场景(含完整代码)

别再只会addItem了!QT QComboBox的5个高级用法与实战场景(含完整代码) 在QT开发中,QComboBox可能是最容易被低估的控件之一。很多开发者仅仅把它当作一个简单的下拉选择框,用addItem()填充几个静态选项就草草了事。但实…...

602 游戏平台 — 做玩家喜爱、信任的游戏平台!

602 游戏是2013 年上线的老牌正规页游平台,十年稳定运营,始终以 “玩家喜爱、信任”为核心,主打传奇类精品页游 ,三端互通✅ 平台核心优势(为什么玩家信任)正规合规,账号安全:文网文…...

RDMA之从userspace verbs 到kernel verbs

用户态RDMA(userspace verbs)RDMA是一种高性能网络协议,一般用在GPU集群的高速通信库,如NCCL、NVSHMEM等,这些都是用户态通信库,我们熟知的RDMA大部分都是用户态RDMA。比如,如下一个简单的RDMA程序int main() { ​// 1…...

深耕区域数字生态,智森传媒赋能本地中小企业破局增长

在本地生活流量红利消退、行业内卷加剧的当下,中小企业数字化转型已不是选择题,而是生存题。十堰智森网络传媒立足本土市场,以技术研发为根基,以区域获客为核心,以数字人直播为抓手,为中小企业搭建全链路数…...

深入解析epoll ET模式与守护进程

引言在前面的文章中,我们学习了 epoll 的基础用法和 LT 模式。本文将深入讲解两个重要主题:epoll 的 ET 模式:边缘触发模式的编程要点与完整实现守护进程:Linux 后台服务进程的原理与编写规范ET 模式是 epoll 高性能的关键&#x…...

win10打印机不能共享报0x0000011b/0x00000709修复工具合集分享 ,亲测解决Windows打印机共享报错问题

先说说我的情况。公司大概十几个人,两台共享打印机,一台接在Win10的台式机上,一台接在Win11的笔记本上。本来用着一直正常,去年开始,陆陆续续有同事反映连不上打印机。 最常见的报错就是0x00000709,还有0x…...

拾亩绿光纯亚麻籽微粉效果怎么样

很多人想通过亚麻籽补充营养,却常遇到传统亚麻籽难吸收、营养易流失的问题:直接嚼咽口感粗糙,普通研磨粉冲调结块,榨油后Omega-3等核心营养大量损耗。拾亩绿光纯亚麻籽微粉依托南京国英健康科技有限公司的专利技术,可解…...

Windows 10 PL2303驱动修复终极指南:3种方案解决串口设备兼容性问题

Windows 10 PL2303驱动修复终极指南:3种方案解决串口设备兼容性问题 【免费下载链接】pl2303-win10 Windows 10 driver for end-of-life PL-2303 chipsets. 项目地址: https://gitcode.com/gh_mirrors/pl/pl2303-win10 PL2303驱动修复方案是解决Windows 10系…...

爆单实操课:从3C到美妆,跨境商家如何用AI神器搞定TikTok本土化

每天都有无数跨境卖家在各大社群里发问:怎么用ai生成带货视频,有哪些工具比较好用? 在 TikTok 这个极度依赖内容爆发的平台上,不同类目的产品对视频素材的需求千差万别。靠人工剪辑不仅效率低,且极难跨越本土化语言的障…...

语音真实度突破98.7%的关键在哪?ElevenLabs最新v3.2引擎深度测评,附权威MOS评分对比表

更多请点击: https://intelliparadigm.com 第一章:语音真实度突破98.7%的关键在哪?ElevenLabs最新v3.2引擎深度测评,附权威MOS评分对比表 ElevenLabs v3.2 引擎在2024年Q2发布的音频合成基准测试中,首次在自然度&…...

Sora 2如何“唤醒”3D Gaussian Splatting?:从神经辐射场到毫秒级动态场景生成的4层技术跃迁解析

更多请点击: https://intelliparadigm.com 第一章:Sora 2与3D Gaussian Splatting融合的范式革命 传统视频生成模型受限于体素网格或NeRF隐式表示的计算开销与几何保真度瓶颈,而Sora 2通过引入时空一致性token压缩机制,与3D Gaus…...

基于LLM的多智能体协作框架:从原理到实践构建自主开发团队

1. 项目概述与核心价值最近在开源社区里,一个名为zxkane/autonomous-dev-team的项目引起了我的注意。乍一看这个标题,你可能会联想到科幻电影里的全自动机器人编程,或者是一些过于理想化的“AI接管开发”的噱头。但在我花时间深入研究和实践之…...

PCI总线‘对话’的艺术:主从设备如何通过FRAME#、STOP#信号优雅地‘开始’与‘结束’传输

PCI总线‘对话’的艺术:主从设备如何通过FRAME#、STOP#信号优雅地‘开始’与‘结束’传输 在计算机系统的内部世界里,总线的数据传输就像一场精心编排的舞会。PCI总线作为这场舞会的舞台,主从设备之间的每一次交互都遵循着严格的礼仪规则。这…...

别再乱加电阻了!手把手教你用SI9000搞定PCB阻抗匹配(附50欧姆计算实例)

高速PCB设计实战:用SI9000精准计算阻抗匹配的工程方法 当信号频率突破百兆赫兹时,PCB走线就不再是简单的电气连接——它们变成了需要精密控制的传输线。去年参与一个千兆以太网项目时,我曾目睹团队因阻抗失配导致信号完整性崩溃的惨痛案例&am…...

音频变压器关键参数深度解析:Z值与最大电流的工程实践

音频变压器关键参数深度解析:Z值与最大电流的工程实践引言在专业音频系统、高保真音响以及工业信号隔离场景中,音频变压器始终扮演着不可替代的角色。它的核心使命是在保持信号完整性的同时,完成阻抗匹配、地环路隔离和信号平衡转换三大任务。…...

为AI智能体构建可编程邮箱:mailbot实战指南

1. 项目概述:为AI智能体打造专属的“可编程邮箱”如果你正在开发一个AI智能体,无论是客服机器人、自动化工作流还是个人助理,让它具备收发邮件的能力往往是刚需。传统的做法是什么?要么去折腾Gmail的API,忍受OAuth授权…...

3分钟掌握Krita AI抠图:点一下就能完成的智能选区革命

3分钟掌握Krita AI抠图:点一下就能完成的智能选区革命 【免费下载链接】krita-vision-tools Krita plugin which adds selection tools to mask objects with a single click, or by drawing a bounding box. 项目地址: https://gitcode.com/gh_mirrors/kr/krita-…...

百度文库文档免费下载终极指南:3步快速获取纯净PDF

百度文库文档免费下载终极指南:3步快速获取纯净PDF 【免费下载链接】baidu-wenku fetch the document for free 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wenku 你是否曾在百度文库找到心仪的文档,却被烦人的广告、付费提示和杂乱页面…...

【DeepSeek开发者垂直搜索实战指南】:3大行业落地案例+5个避坑要点,限时公开内部调优参数

更多请点击: https://intelliparadigm.com 第一章:DeepSeek开发者垂直搜索应用案例全景概览 DeepSeek系列大模型凭借其开源、高性能与强推理能力,正被广泛集成至开发者垂直搜索场景中——从代码片段检索、API文档语义查找,到私有…...

【力扣100题】22. 矩阵置零

一、题目描述 给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2: …...

日本电子产业转型启示:从技术过剩到商业模式创新

1. 日本电子产业的十字路口:一场箱根闭门会背后的行业剧痛2013年的春天,当全球电子产业的聚光灯都打在硅谷和深圳时,日本箱根的一家温泉旅馆里,正进行着一场鲜为人知却意义深远的对话。索尼、瑞萨、NEC、日立、松下、富士通、Mega…...

AXI协议深度解析:从握手到低功耗,一次搞懂芯片内部数据流的那些“潜规则”

AXI协议深度解析:从握手到低功耗,一次搞懂芯片内部数据流的那些“潜规则” 在当今高性能计算和复杂SoC设计中,AXI协议已成为连接处理器、存储器和外设的黄金标准。但真正理解AXI的精髓,远不止于掌握基础操作——那些隐藏在规范字里…...

Excel数据同步ERP/CRM太麻烦?一个Python脚本搞定多系统自动填充(基于GoBot)

Excel数据同步ERP/CRM太麻烦?一个Python脚本搞定多系统自动填充(基于GoBot) 每次月底看着财务同事在ERP系统里逐条录入Excel数据,市场部同事又在CRM里重复同样的操作,这种低效场景你一定不陌生。数据在不同系统间的孤岛…...

告别桌面混乱!Ubuntu 16.04 多桌面+Terminator分屏,打造程序员高效工作流

Ubuntu 16.04多桌面与Terminator分屏:构建程序员的高效工作流 作为一名长期在Ubuntu环境下工作的开发者,我深刻体会到工作环境配置对效率的影响。桌面混乱、窗口堆叠、频繁切换不仅浪费时间,还会打断编程的"心流"状态。经过多次迭代…...