sync.Once估计大家都不陌生,官方介绍中,
专业从事网站设计制作、成都网站制作,高端网站制作设计,重庆小程序开发公司,网站推广的成都做网站的公司。优秀技术团队竭力真诚服务,采用H5开发+CSS3前端渲染技术,响应式网站开发,让网站在手机、平板、PC、微信下都能呈现。建站过程建立专项小组,与您实时在线互动,随时提供解决方案,畅聊想法和感受。
Once is an object that will perform exactly one action
正是因为这个特性,Once常常被用于单例对象的初始化场景。
也正是因为这个特性,其实它还能做一些其他的事情。
日常背诵八股文,我相信你们对缓存击穿这个词特别熟悉。
缓存击穿一般代指热点key缓存失效(到期|删了),同一时刻大量对热点key的并发请求。缓存找不到数据,所有请求都打入到DB层。此时,身为开发的你,明天和意外就不知道哪个先到了。
为了防止这种情况发生,针对相同key的请求,只需要一个请求(A)到达DB层取数据,其他请求等待A通知就行了。
就像这样,
图片来源:[1]
Go里有很多防缓存击穿的工具,比如singleflight库。
通过上面简单的代码大概能看出,其实就是对key做了缓存。
把一个key对应call结构存储在map中。保证只有一个key真正执行fn()服务 ,其他请求则通过sync.waitGroup的wait等待结果。
至于g.docall(c,key,fn),
当带着全村人希望的那个请求,获取到数据,给对应key的call赋值,最终执行done,通知等待这个key全村的村民获取数据。
代码并不复杂。
我们也可以实现一个简易版本的。
代码整体不难,主要的点在于我们是通过通道来实现通知自家兄弟取数据。
最后,让我们使用Once来达到同样的效果,不然标题不白起了嘛。
上面核心代码都写出来了,实际开发中需要对请求资源做一些超时控制等操作。
平常对Once的使用只停留在初始化工作上,而弱化了它的使用场景。对于其他工具也是一个道理,这就需要去积累和挖掘了。
附录
[1]https://medium.com/codex/caching-system-stability-766bf5fff69f
https://blog.chuie.io/posts/synconce/
本文名称:原来Sync.Once还能这么用
浏览路径:http://www.shufengxianlan.com/qtweb/news46/485446.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联