Golang singleflight 快速上手
文章目录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合作伙伴选型实测:4家官方授权服务商技术能力与真实案例对比

上海SAP合作伙伴选型实测:4家官方授权服务商技术能力与真实案例对比

SAP项目上线效果好不好,系统本身只占两成,剩下八成看实施团队。这不是我瞎说,做SAP实施十来年的同行基本都认这个比例。 上海这边SAP官方认证合作伙伴有几十家。但定位差距很大:有的专做大型集团S/4HANA,有的只做中小…

2026/8/1 3:51:23阅读更多 →
ComfyUI-Inpaint-CropAndStitch:终极智能局部修复指南

ComfyUI-Inpaint-CropAndStitch:终极智能局部修复指南

ComfyUI-Inpaint-CropAndStitch:终极智能局部修复指南 【免费下载链接】ComfyUI-Inpaint-CropAndStitch ComfyUI nodes to crop before sampling and stitch back after sampling that speed up inpainting 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-…

2026/8/1 3:49:22阅读更多 →
2026这6款王炸降AI率网站大起底,一键让AIGC率断崖式下跌!

2026这6款王炸降AI率网站大起底,一键让AIGC率断崖式下跌!

步入 2026 年,学术战场的规则早已悄然改写。曾经只需应对查重率的焦虑,如今已演变为一场关于 AI 痕迹的生死战。随着各大高校全面启用更智能、更精准的 AIGC 检测系统,论文审核的标准也愈发严苛。光是降低重复率已经不够,真正让无…

2026/8/1 3:49:22阅读更多 →
若依框架跨域问题解决方案与最佳实践

若依框架跨域问题解决方案与最佳实践

1. 若依框架跨域问题深度解析最近在基于若依框架开发前后端分离项目时,遇到了经典的跨域报错问题。控制台那个醒目的"Access-Control-Allow-Origin"错误提示,相信不少开发者都曾为此头疼过。今天我就从HTTP协议层开始,带大家彻底搞…

2026/8/1 5:05:50阅读更多 →
GraphRAG 上线就崩?权限日志没搞定,图谱再漂亮也没用

GraphRAG 上线就崩?权限日志没搞定,图谱再漂亮也没用

聊《大家都在聊GraphRAG,企业真正需要的却不是更多 Demo》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。 摘要 前阵子帮一个金融客户做知识问答系统,Demo 阶段 GraphRAG 的召回效果确实惊…

2026/8/1 5:05:50阅读更多 →
Python win32com操作Excel全攻略:从基础读写到高级自动化实战

Python win32com操作Excel全攻略:从基础读写到高级自动化实战

1. 为什么选择win32com来操作Excel?一个老码农的视角如果你在Python里需要和Excel打交道,尤其是处理那些带有复杂格式、宏、图表,或者需要模拟用户点击“另存为”这类操作的场景,你大概率会听到pandas、openpyxl这些库的名字。它们…

2026/8/1 5:05:50阅读更多 →
我用AI写了半年代码——回头看,这5个能力正在退化

我用AI写了半年代码——回头看,这5个能力正在退化

从年初开始,我几乎每天都在用Claude Code或Cursor写代码。效率确实高了不少——以前要写半天的CRUD页面,现在二十分钟搞定。 但最近发生了一件事让我警觉:同事问我一个Promise.allSettled和Promise.all的区别,我张了张嘴&#xff…

2026/8/1 5:05:50阅读更多 →
750 亿参数只激活 37 亿:LG 开源 K-EXAONE 2.0,与 DeepSeek 的路线之争迎来新玩家

750 亿参数只激活 37 亿:LG 开源 K-EXAONE 2.0,与 DeepSeek 的路线之争迎来新玩家

750 亿参数只激活 37 亿:LG 开源 K-EXAONE 2.0,与 DeepSeek 的路线之争迎来新玩家7 月 31 日,LG AI 研究院在 Hugging Face 上放出了 K-EXAONE 2.0 的完整权重,三个数字在开源圈迅速传开:750B 总参数、37B 激活参数、A…

2026/8/1 5:05:50阅读更多 →
ADB解锁智能电视安装限制:从原理到实战的完整指南

ADB解锁智能电视安装限制:从原理到实战的完整指南

1. 问题缘起:当智能电视不再“智能”最近在折腾家里的老款TCL智能电视,想装几个自己常用的App,结果发现应用商店里空空如也,想从U盘安装APK文件,系统直接弹出一个“为保障电视安全,禁止安装来源不明的应用”…

2026/8/1 5:03:50阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/31 20:44:05阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/31 17:41:43阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/31 20:44:05阅读更多 →
无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 在数字媒体创作领域,视频编辑处理的质量损…

2026/8/1 0:00:10阅读更多 →
AI辅助本科论文写作:8大工具评测与高效使用指南

AI辅助本科论文写作:8大工具评测与高效使用指南

1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…

2026/8/1 0:00:10阅读更多 →
如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为抢不到热门演唱会门票…

2026/8/1 0:00:10阅读更多 →
无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 在数字媒体创作领域,视频编辑处理的质量损…

2026/8/1 0:00:10阅读更多 →
AI辅助本科论文写作:8大工具评测与高效使用指南

AI辅助本科论文写作:8大工具评测与高效使用指南

1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…

2026/8/1 0:00:10阅读更多 →
如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为抢不到热门演唱会门票…

2026/8/1 0:00:10阅读更多 →