原来Sync.Once还能这么用
介绍
sync.Once估计大家都不陌生,官方介绍中,
Once is an object that will perform exactly one action
正是因为这个特性,Once常常被用于单例对象的初始化场景。
也正是因为这个特性,其实它还能做一些其他的事情。
缓存击穿
日常背诵八股文,我相信你们对缓存击穿这个词特别熟悉。
缓存击穿一般代指热点key缓存失效(到期|删了),同一时刻大量对热点key的并发请求。缓存找不到数据,所有请求都打入到DB层。此时,身为开发的你,明天和意外就不知道哪个先到了。
为了防止这种情况发生,针对相同key的b2b供应网请求,只需要一个请求(A)到达DB层取数据,其他请求等待A通知就行了。
就像这样,

图片来源:[1]
singleflight
Go里有很多防缓存击穿的工具,比如singleflight库。


通过上面简单的代码大概能看出,其实就是对key做了缓存。
把一个key对应call结构存储在map中。保证只有一个key真正执行fn()服务 ,其他请求则通过sync.waitGroup的wait等待结果。
至于g.docall(c,key,fn),

当带着全村人希望的那个请求,获取到数据,给对应key的call赋值,最终执行done,香港云服务器通知等待这个key全村的村民获取数据。
代码并不复杂。
自定义singleflight
我们也可以实现一个简易版本的。

代码整体不难,主要的点在于我们是通过通道来实现通知自家兄弟取数据。
最后,让我们使用Once来达到同样的效果,不然标题不白起了嘛。

上面核心代码都写出来了,实际开发中需要对请求资源做一些超时控制等操作。
总结
平常对Once的使用只停留在初始化工作上,而弱化了它的使用场景。对于其他工具也是一个道理,这就需要去积累和挖掘了。云服务器提供商
附录
[1]https://medium.com/codex/caching-system-stability-766bf5fff69f
https://blog.chuie.io/posts/synconce/
相关文章
电脑安装ADM插线教程(一步步教你安装ADM插线,畅享高速网络)
摘要:在如今数字化的时代,快速、稳定的网络连接已经成为了人们日常生活和工作中不可或缺的一部分。ADM插线可以帮助我们快速连接到网络,提供更稳定、更高速的网络体验。本文将为大家详细介绍如何...2025-11-05
本文转载自微信公众号「二马读书」,作者二马读书。转载本文请联系二马读书公众号。随着业务发展,很多系统需要经历服务拆分的过程。微服务化过程踩坑也是很正常的事。如果在服务拆分之前做好充分准备,能帮我们少走2025-11-05
想了解更多内容,请访问:和华为官方合作共建的鸿蒙技术社区https://harmonyos.51cto.com任务是操作系统一个重要的概念,是竞争系统资源的最小运行单元。任务可以使用或等待CPU、使用2025-11-05
Dubbo原理剖析 之 @DubboReference.version设置为
*本文转载自微信公众号「不送花的程序猿」,作者Howinfun。转载本文请联系不送花的程序猿公众号。1 背景Dubbo在消费端提供了一个功能,即将消费者的版本号指定为*,那么不管服务端的接口版本是啥,2025-11-05解决以电脑联网错误651的有效方法(摆脱网络连接问题,享受顺畅网络体验)
摘要:在使用电脑联网时,有时候会遇到错误651的问题,这个错误会导致我们无法正常连接网络,给我们的工作和生活带来不便。本文将介绍一些解决该问题的有效方法,帮助读者快速解决以电脑联网错误6...2025-11-05
前言工欲善其事,必先利其器。了解完性能指标之后,性能优化的目标已经明确了。接下来我们借助一些性能测量工具,明确网页距离优化目标之前还有多大的差距。一个好的工具可以让你事半功倍,接下来我将用3篇文章分别2025-11-05


最新评论