日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
原來Sync.Once還能這么用

介紹

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

專業(yè)從事網(wǎng)站設(shè)計制作、成都網(wǎng)站制作,高端網(wǎng)站制作設(shè)計,重慶小程序開發(fā)公司,網(wǎng)站推廣的成都做網(wǎng)站的公司。優(yōu)秀技術(shù)團隊竭力真誠服務(wù),采用H5開發(fā)+CSS3前端渲染技術(shù),響應(yīng)式網(wǎng)站開發(fā),讓網(wǎng)站在手機、平板、PC、微信下都能呈現(xiàn)。建站過程建立專項小組,與您實時在線互動,隨時提供解決方案,暢聊想法和感受。

Once is an object that will perform exactly one action

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

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

緩存擊穿

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

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

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

就像這樣,

圖片來源:[1]

singleflight

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

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

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

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

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

代碼并不復(fù)雜。

自定義singleflight

我們也可以實現(xiàn)一個簡易版本的。

代碼整體不難,主要的點在于我們是通過通道來實現(xiàn)通知自家兄弟取數(shù)據(jù)。

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

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

總結(jié)

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

附錄

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

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


當(dāng)前標(biāo)題:原來Sync.Once還能這么用
文章轉(zhuǎn)載:http://www.5511xx.com/article/ccsgicj.html