原来Sync.Once还能这么用

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

[[420150]]

介绍

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的使用只停留在初始化工作上,而弱化了它的使用场景。对于其他工具也是一个道理,这就需要去积累和挖掘了。

附录

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

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

 

责任编辑:武晓燕 来源: 吴亲强的深夜食堂
相关推荐

2024-06-05 11:06:22

Go语言工具

2023-06-06 08:28:58

Sync.OnceGolang

2023-03-28 08:20:07

场景sync.Once​系统

2010-01-20 10:37:48

Chrome浏览器

2019-12-30 09:51:35

Word设计模式软件

2024-01-08 13:40:00

并发安全• 数量

2024-10-17 16:55:08

2022-01-04 08:00:48

前端技术Esbuild

2020-10-09 10:45:22

语言代码数组

2022-10-28 19:19:11

ChromeNetwork网络

2021-11-22 11:05:20

Vue 3setup前端

2022-06-07 08:55:04

Golang单例模式语言

2019-03-28 11:07:56

Spring BootRedis缓存

2018-01-25 14:53:20

iPhone技巧删除照片

2022-01-27 14:12:49

Python游戏脚本

2021-12-30 10:55:54

Python游戏脚本

2013-03-26 13:26:41

婚礼微信微信公众账号

2021-04-19 05:42:51

Mmap文件系统

2022-02-14 21:58:58

netstatLinuxWindows

2020-11-02 14:38:56

Java 深度学习模型
点赞
收藏

51CTO技术栈公众号