原来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/

相关文章
|
弹性计算 tengine 负载均衡
slb高可用性
【11月更文挑战第4天】
360 1
|
10月前
|
缓存 网络协议 安全
即时通讯初学者必知必会的20个网络编程和通信安全知识点
即时通讯IM应用开发的初学者很容易迷失在网络编程的复杂性以及通信安全的各种概念里,本文不涉及深度理论知识,尽量通过一句话或几句话让你快速了解20个相关的网络编程和通信安全知识点,希望能助你愉快地开始即时通讯应用开发。
463 0
|
存储 JavaScript 开发者
Vue 组件间通信的最佳实践
本文总结了 Vue.js 中组件间通信的多种方法,包括 props、事件、Vuex 状态管理等,帮助开发者选择最适合项目需求的通信方式,提高开发效率和代码可维护性。
|
缓存 Java 应用服务中间件
OpenResty 简介及其容器化实践
【9月更文挑战第2天】OpenResty 是一个基于 Nginx 与 Lua 的高性能 web 平台,它扩展了 Nginx 的功能,使之能够处理更加复杂的业务逻辑。通过集成 Lua 脚本,OpenResty 可以实现高效的请求处理、缓存、负载均衡等功能。
367 8
|
IDE API Android开发
安卓与iOS开发环境的差异及适配策略
在移动应用开发的广阔舞台上,Android和iOS两大操作系统各据一方,各自拥有独特的开发环境和工具集。本文旨在深入探讨这两个平台在开发环境上的关键差异,并提供有效的适配策略,帮助开发者优化跨平台开发流程。通过比较Android的Java/Kotlin和iOS的Swift/Objective-C语言特性、IDE的选择、以及API和系统服务的访问方式,本文揭示了两个操作系统在开发实践中的主要分歧点,并提出了一套实用的适配方法,以期为移动开发者提供指导和启示。
394 11
|
Linux Shell 网络安全
Linux 命令 `clear` 详解
了解 Linux 的 `clear` 命令,用于清除终端屏幕,保持整洁。只需输入 `clear` 或使用 `Ctrl + L` 快捷键,也可尝试 `reset` 命令和 `printf "\033c"`。注意,`clear` 不会删除历史数据,仅清空屏幕显示。这个命令能提升终端使用体验和工作效率。
|
监控 项目管理 决策智能
运筹优化学习22:新项目研发项目进度制定与优化研究(三)
运筹优化学习22:新项目研发项目进度制定与优化研究
运筹优化学习22:新项目研发项目进度制定与优化研究(三)
|
机器学习/深度学习 存储 人工智能
杜克大学陈怡然:高效人工智能系统的软硬件协同设计(1)
杜克大学陈怡然:高效人工智能系统的软硬件协同设计
495 0
|
Java 数据库连接 数据库
Spring整合MyBatis---注解版
Spring整合MyBatis---注解版
273 0
Spring整合MyBatis---注解版