Golang singleflight 快速上手
📅 2026/8/1 3:52:14
👁️ 次浏览
文章目录1.简介2.适用场景3.核心方法4.快速上手示例4.1 安装4.2 基本用法5.注意事项6.生产级使用示例带超时控制7.总结1.简介singleflight 是 Go 标准库扩展包golang.org/x/sync/singleflight提供的一个**请求合并请求抑制**工具。singleflight 的核心作用是在多个并发请求同时调用同一个函数时只让第一个请求真正执行其他请求会等待并共享第一个请求的结果。2.适用场景缓存击穿当缓存过期瞬间大量并发请求同时打到数据库singleflight 可以保证只有一个请求去查 DB其他请求等待结果。防止重复计算多个请求同时触发同一个昂贵的计算如生成报告、查询大数据。防止重复 RPC 调用在微服务中多个上游同时请求同一个下游接口时合并请求。3.核心方法方法说明Do(key string, fn func() (interface{}, error)) (interface{}, error, bool)同步执行相同 key 的并发请求只执行一次 fn其他等待结果。返回值shared表示结果是否被共享。DoChan(key string, fn func() (interface{}, error)) -chan Result异步版本返回一个 channel结果通过 channel 返回。Forget(key string)主动清除某个 key 的正在执行状态。下次对该 key 的Do会重新执行而不是等待之前的执行结果。4.快速上手示例4.1 安装go get golang.org/x/sync/singleflight4.2 基本用法packagemainimport(fmtsynctimegolang.org/x/sync/singleflight)// 模拟一个耗时操作比如查询数据库funcfetchDataFromDB(keystring)(string,error){fmt.Printf( 真正执行查询: key%s\n,key)time.Sleep(2*time.Second)// 模拟耗时returnresult_for_key,nil}funcmain(){varg singleflight.Groupvarwg sync.WaitGroup key:user_123concurrency:5fori:0;iconcurrency;i{wg.Add(1)gofunc(idint){deferwg.Done()// Do 方法第一个参数是 key用于去重第二个参数是实际执行的函数result,err,shared:g.Do(key,func()(interface{},error){returnfetchDataFromDB(key)})iferr!nil{fmt.Printf(goroutine %d got error: %v\n,id,err)return}fmt.Printf(goroutine %d got result: %v (shared%v)\n,id,result,shared)}(i)}wg.Wait()}输出大致顺序 真正执行查询: keyuser_123 goroutine 3 got result: result_for_user_123 (sharedtrue) goroutine 0 got result: result_for_user_123 (sharedtrue) ...关键点fetchDataFromDB只被执行了一次只有第一个 goroutine 触发了它。其他 4 个 goroutine等待并共享了第一个的结果。shared为true表示这个结果是和其他调用者共享的。5.注意事项panic 传播如果fn中发生 panicDo会重新 panic不会吞掉异常。建议在fn内部做好 recover。结果共享同一个 key 的多个调用者会共享同一个结果包括错误。如果第一个执行返回错误所有等待者都会收到该错误。key 的作用域singleflight.Group的 key 只在同一个 Group 实例中有效。不同 Group 实例之间的 key 互不影响。内存泄漏风险如果Do的fn执行时间很长甚至永不返回Group会一直持有该 key 的状态导致内存累积。对于长期运行的 key可以考虑在适当时候调用Forget。6.生产级使用示例带超时控制funcGetUserWithCache(ctx context.Context,userIDstring)(*User,error){// 先查缓存...ifcached,ok:cache.Get(userID);ok{returncached,nil}// 使用 singleflight 防止缓存击穿result,err,_:singleflightGroup.Do(userID,func()(interface{},error){// 加个超时控制避免长时间阻塞ctx,cancel:context.WithTimeout(ctx,500*time.Millisecond)defercancel()user,err:fetchUserFromDB(ctx,userID)iferr!nil{returnnil,err}cache.Set(userID,user)returnuser,nil})iferr!nil{returnnil,err}returnresult.(*User),nil}7.总结singleflight 请求合并器确保同一时间对同一个 key 的多个并发请求只执行一次其他请求共享结果。特别适合防止缓存击穿和重复计算。
SAP项目上线效果好不好,系统本身只占两成,剩下八成看实施团队。这不是我瞎说,做SAP实施十来年的同行基本都认这个比例。
上海这边SAP官方认证合作伙伴有几十家。但定位差距很大:有的专做大型集团S/4HANA,有的只做中小…
📅 2026/8/1 3:52:14
1. 从一块电视棒到无线电世界的钥匙:RTL-SDR的硬件本质如果你对无线电、频谱分析或者软件定义无线电(SDR)感兴趣,那么“RTL-SDR”这个名字你肯定不陌生。它几乎成了SDR入门和低成本无线电实验的代名词。但很多人可能不知道&#x…
📅 2026/8/1 3:52:14
1. 从“裸奔”到“有章法”:为什么嵌入式开发需要文件系统? 在嵌入式开发这条路上摸爬滚打几年后,我发现自己和很多同行一样,都经历过一个相似的阶段:项目初期,数据量小,几个全局数组、几段静态…
📅 2026/8/1 3:52:14
1. 项目概述:为什么需要蓝图驱动的样条线移动?在虚幻引擎5(UE5)的项目开发中,无论是制作一个简单的过场动画,还是实现复杂的巡逻AI路径,让物体沿着预设的路径平滑移动都是一个高频需求。手动K帧…
📅 2026/8/1 4:46:00
1. 项目概述:为什么我们需要专业降AI工具?在内容创作领域,AI生成内容(AIGC)的爆发式增长带来了一个意想不到的挑战——如何让AI生成的内容更自然、更专业。我最近测试了市面上10款主流降AI软件,发现它们的功…
📅 2026/8/1 4:46:00
1. BERT模型概述:从Transformer到双向编码器2018年,谷歌AI团队发布的BERT(Bidirectional Encoder Representations from Transformers)彻底改变了自然语言处理领域的游戏规则。作为首个真正实现双向上下文理解的预训练语言模型&am…
📅 2026/8/1 4:46:00
Codepilot 多模型协作实战:Grok 爬取、DeepSeek 写稿、GLM 统筹在AI编程助手快速发展的今天,单一模型往往难以满足复杂项目的全流程需求。本文基于实际项目经验,分享一套完整的Codepilot多模型协作方案,通过Grok进行数据爬取、Dee…
📅 2026/8/1 4:46:00
1. 项目概述:从“黑盒”到“白盒”的桥梁搞嵌入式开发,特别是单片机、ARM Cortex-M这类芯片,最怕的就是程序跑飞了或者逻辑卡死。板子一上电,灯不亮、串口没反应,这时候如果只能靠猜、靠重新烧录碰运气,那效…
📅 2026/8/1 4:46:00
1. 项目缘起:从理论到仿真的跨越 做电子设计,尤其是数字电路和单片机应用,最头疼的是什么?我猜很多朋友会说是“焊接调试”。辛辛苦苦画好原理图,打板、买元件、焊接,一通操作下来,上电发现数码…
📅 2026/8/1 4:45:00
AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言
HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…
📅 2026/8/1 0:00:26
无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut
在数字媒体创作领域,视频编辑处理的质量损…
📅 2026/8/1 0:00:30
1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…
📅 2026/8/1 0:00:30
更多请点击:
https://codechina.net
第一章:AI帮助理解数学概念 人工智能正以前所未有的方式重塑数学学习的路径。通过自然语言处理与符号计算的深度融合,AI不仅能解析抽象定义,还能将定理、证明和几何直觉转化为可交互、可验证的…
📅 2026/8/1 1:20:16
1. 项目背景与核心价值去年参与的一个短剧项目让我深刻体会到传统创作流程的痛点:编剧团队花了三周打磨剧本,角色设计反复修改了七版,最后成片时又因为演员档期问题不得不临时调整分镜。这种低效的创作模式在快节奏的内容行业越来越难以为继。…
📅 2026/8/1 1:20:19
remix-i18next TypeScript类型安全实践:确保翻译键与类型定义同步 【免费下载链接】remix-i18next The easiest way to translate your React Router framework mode apps 项目地址: https://gitcode.com/gh_mirrors/re/remix-i18next
在开发多语言应用时&am…
📅 2026/8/1 1:20:17
AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言
HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…
📅 2026/8/1 0:00:26
无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut
在数字媒体创作领域,视频编辑处理的质量损…
📅 2026/8/1 0:00:30
1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…
📅 2026/8/1 0:00:30