自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

原來Sync.Once還能這么用

開發(fā) 前端
緩存擊穿一般代指熱點key緩存失效(到期|刪了),同一時刻大量對熱點key的并發(fā)請求。緩存找不到數據,所有請求都打入到DB層。此時,身為開發(fā)的你,明天和意外就不知道哪個先到了。

[[420150]]

介紹

sync.Once估計大家都不陌生,官方介紹中,

Once is an object that will perform exactly one action

正是因為這個特性,Once常常被用于單例對象的初始化場景。

也正是因為這個特性,其實它還能做一些其他的事情。

緩存擊穿

日常背誦八股文,我相信你們對緩存擊穿這個詞特別熟悉。

緩存擊穿一般代指熱點key緩存失效(到期|刪了),同一時刻大量對熱點key的并發(fā)請求。緩存找不到數據,所有請求都打入到DB層。此時,身為開發(fā)的你,明天和意外就不知道哪個先到了。

為了防止這種情況發(fā)生,針對相同key的請求,只需要一個請求(A)到達DB層取數據,其他請求等待A通知就行了。

就像這樣,

圖片來源:[1]

singleflight

Go里有很多防緩存擊穿的工具,比如singleflight庫。

通過上面簡單的代碼大概能看出,其實就是對key做了緩存。

把一個key對應call結構存儲在map中。保證只有一個key真正執(zhí)行fn()服務 ,其他請求則通過sync.waitGroup的wait等待結果。

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

當帶著全村人希望的那個請求,獲取到數據,給對應key的call賦值,最終執(zhí)行done,通知等待這個key全村的村民獲取數據。

代碼并不復雜。

自定義singleflight

我們也可以實現一個簡易版本的。

代碼整體不難,主要的點在于我們是通過通道來實現通知自家兄弟取數據。

最后,讓我們使用Once來達到同樣的效果,不然標題不白起了嘛。

上面核心代碼都寫出來了,實際開發(fā)中需要對請求資源做一些超時控制等操作。

總結

平常對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?系統(tǒng)

2010-01-20 10:37:48

Chrome瀏覽器

2019-12-30 09:51:35

Word設計模式軟件

2024-01-08 13:40:00

并發(fā)安全? 數量

2024-10-17 16:55:08

2022-01-04 08:00:48

前端技術Esbuild

2022-06-07 08:55:04

Golang單例模式語言

2021-11-22 11:05:20

Vue 3setup前端

2020-10-09 10:45:22

語言代碼數組

2022-10-28 19:19:11

ChromeNetwork網絡

2019-03-28 11:07:56

Spring BootRedis緩存

2021-12-30 10:55:54

Python游戲腳本

2022-01-27 14:12:49

Python游戲腳本

2018-01-25 14:53:20

iPhone技巧刪除照片

2013-03-26 13:26:41

婚禮微信微信公眾賬號

2022-02-14 21:58:58

netstatLinuxWindows

2021-04-19 05:42:51

Mmap文件系統(tǒng)

2020-11-02 14:38:56

Java 深度學習模型
點贊
收藏

51CTO技術棧公眾號