原来sync.Once还能这么用

简介: 原来sync.Once还能这么用

介绍


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

Once is an object that will perform exactly one action

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

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


缓存击穿


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

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

为了防止这种情况发生,针对相同key的请求,只需要一个请求(A)到达DB层取数据,其他请求等待A通知就行了

就像这样


1668507893683.jpg


图片来源:[1]


singleflight


Go里有很多防缓存击穿的工具比如singleflight


1668507912686.jpg


1668507920859.jpg


通过上面简单的代码大概能看出,其实就是对key做了缓存

把一个key对应call结构存储在map中。保证只有一个key真正执行fn()服务 ,其他请求则通过sync.waitGroupwait等待结果

至于g.docall(c,key,fn)


1668507947074.jpg


当带着全村人希望的那个请求,获取到数据,给对应keycall赋值,最终执行done通知等待这个key全村的村民获取数据

代码并不复杂


自定义singleflight


我们也可以实现一个简易版本的

1668507994363.jpg

代码整体不难,主要的点在于我们是通过通道来实现通知自家兄弟取数据。

最后,让我们使用Once来达到同样的效果,不然标题不白起了嘛

1668508007556.jpg

上面核心代码都写出来了,实际开发中需要对请求资源做一些超时控制等操作。


总结


平常对Once的使用只停留在初始化工作上,而弱化了它的使用场景。对于其他工具也是一个道理,这就需要去积累和挖掘了


附录


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

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

相关文章
|
4月前
|
机器学习/深度学习 编解码 算法
空间转录组: 反卷积
空间转录组: 反卷积
空间转录组:  反卷积
|
弹性计算 tengine 负载均衡
slb高可用性
【11月更文挑战第4天】
376 1
|
存储 JavaScript 开发者
Vue 组件间通信的最佳实践
本文总结了 Vue.js 中组件间通信的多种方法,包括 props、事件、Vuex 状态管理等,帮助开发者选择最适合项目需求的通信方式,提高开发效率和代码可维护性。
|
IDE Java 测试技术
Java“非法的表达式开头"是什么原因引起的,怎么解决
“非法的表达式开头”通常是由于在Java代码中错误地放置了表达式或语法错误导致的。例如,在应该是一个语句的地方写了一个表达式,或者在表达式内部出现了不正确的结构。解决方法是检查并修正相关语法错误,确保表达式的正确性和位置适当性。检查括号是否配对完整,以及变量声明、运算符使用是否符合规范也是必要的步骤。
1021 7
|
缓存 Java 应用服务中间件
OpenResty 简介及其容器化实践
【9月更文挑战第2天】OpenResty 是一个基于 Nginx 与 Lua 的高性能 web 平台,它扩展了 Nginx 的功能,使之能够处理更加复杂的业务逻辑。通过集成 Lua 脚本,OpenResty 可以实现高效的请求处理、缓存、负载均衡等功能。
378 8
|
机器学习/深度学习 API 算法框架/工具
【Tensorflow+keras】Keras API三种搭建神经网络的方式及以mnist举例实现
使用Keras API构建神经网络的三种方法:使用Sequential模型、使用函数式API以及通过继承Model类来自定义模型,并提供了基于MNIST数据集的示例代码。
240 12
|
监控 项目管理 决策智能
运筹优化学习22:新项目研发项目进度制定与优化研究(三)
运筹优化学习22:新项目研发项目进度制定与优化研究
运筹优化学习22:新项目研发项目进度制定与优化研究(三)
|
机器学习/深度学习 存储 人工智能
杜克大学陈怡然:高效人工智能系统的软硬件协同设计(1)
杜克大学陈怡然:高效人工智能系统的软硬件协同设计
508 0