原来Sync.Once还能这么用

系统运维2025-11-04 13:02:117

介绍

sync.Once估计大家都不陌生,官方介绍中,

Once is an object that will perform exactly one action

正是因为这个特性,Once常常被用于单例对象的初始化场景。

也正是因为这个特性,其实它还能做一些其他的事情。

缓存击穿

日常背诵八股文,我相信你们对缓存击穿这个词特别熟悉。

缓存击穿一般代指热点key缓存失效(到期|删了),同一时刻大量对热点key的并发请求。缓存找不到数据,所有请求都打入到DB层。此时,身为开发的你,明天和意外就不知道哪个先到了。

为了防止这种情况发生,针对相同key的站群服务器请求,只需要一个请求(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的使用只停留在初始化工作上,而弱化了它的使用场景。对于其他工具也是一个道理,这就需要去积累和挖掘了。云南idc服务商

附录

[1]https://medium.com/codex/caching-system-stability-766bf5fff69f

https://blog.chuie.io/posts/synconce/

本文地址:http://www.bzve.cn/news/23f65499322.html
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

全站热门

电脑QQ时钟错误的原因和解决方法(探究电脑QQ时钟错误的根源,以及如何解决这一问题)

以艺龙旅行抢票怎么样?(艺龙抢票服务的优势和用户体验)

牛肉币电脑端预约教程——让预约变得更简单(教你如何在电脑端快速、方便地预约牛肉币)

华硕X552MD主板的性能和功能评测(一款可靠稳定的主板选择,满足多种需求)

解决电脑蓝牙启动数据错误的方法(排查和修复蓝牙启动数据错误的步骤)

解决电脑主机错误的有效方法(快速修复电脑主机错误的关键步骤)

探究TCL空气净化器的效果及特点(科技智能、高效净化,TCL空气净化器的综合评测)

LG43寸电视的优势与特点(品质卓越、智能便捷、视听享受非凡)

友情链接

滇ICP备2023006006号-39