中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

河南省建設(shè)教育協(xié)會(huì)網(wǎng)站口碑營(yíng)銷(xiāo)的方法

河南省建設(shè)教育協(xié)會(huì)網(wǎng)站,口碑營(yíng)銷(xiāo)的方法,中天建設(shè)集團(tuán)有限公司資質(zhì)等級(jí),世界杯視頻直播網(wǎng)站什么是singleflight singleflight是一種并發(fā)編程設(shè)計(jì)模式,將同一時(shí)刻的多個(gè)并發(fā)請(qǐng)求合并成一個(gè)請(qǐng)求,以減少對(duì)下游服務(wù)的壓力 為什么叫singleflight fly可以理解為請(qǐng)求數(shù),singleflight就是單個(gè)請(qǐng)求 使用場(chǎng)景 該模式主要用于防止緩存擊穿 …

什么是singleflight

singleflight是一種并發(fā)編程設(shè)計(jì)模式,將同一時(shí)刻的多個(gè)并發(fā)請(qǐng)求合并成一個(gè)請(qǐng)求,以減少對(duì)下游服務(wù)的壓力

為什么叫singleflight

fly可以理解為請(qǐng)求數(shù),singleflight就是單個(gè)請(qǐng)求

使用場(chǎng)景

該模式主要用于防止緩存擊穿

例如當(dāng)本地緩存失效時(shí),為了防止大量請(qǐng)求都打到遠(yuǎn)程緩存redis,可以用singleflight保證該時(shí)刻只會(huì)有一個(gè)請(qǐng)求發(fā)到遠(yuǎn)程緩存:

在這里插入圖片描述

或者當(dāng)遠(yuǎn)程緩存失效時(shí),為了防止大量請(qǐng)求都打到db,可以用singleflight保證該時(shí)刻只有一個(gè)請(qǐng)求發(fā)往db查詢數(shù)據(jù):

在這里插入圖片描述

本文將比較go-zero和官方庫(kù)對(duì)singleflight的實(shí)現(xiàn)

Go-zero

代碼地址:https://github.com/zeromicro/go-zero/blob/master/core/syncx/singleflight.go

go-zero中對(duì)singleflight的定義如下:

type (SingleFlight interface {Do(key string, fn func() (any, error)) (any, error)DoEx(key string, fn func() (any, error)) (any, bool, error)}call struct {wg  sync.WaitGroupval anyerr error}flightGroup struct {calls map[string]*calllock  sync.Mutex}
)
  • SingleFlight:接口定義,調(diào)Do或DoEx用單并發(fā)的方式對(duì)資源發(fā)起請(qǐng)求

    • 參數(shù)key:資源的標(biāo)識(shí)
    • 參數(shù)fn:真正請(qǐng)求獲取資源的方法
    • DoEx的第二個(gè)返回值bool: 表示從共享獲取的,還是發(fā)起真實(shí)請(qǐng)求獲取的
  • call:表示同一時(shí)刻對(duì)一個(gè)資源的一組請(qǐng)求

    • wg:這一組的goroutine都阻塞在該wg上
    • val,err:請(qǐng)求的返回值,err
  • flightGroup:總控結(jié)構(gòu)

    • calls:維護(hù)了正在執(zhí)行中的call

我們看Do做了啥

func (g *flightGroup) Do(key string, fn func() (any, error)) (any, error) {c, done := g.createCall(key)if done {return c.val, c.err}g.makeCall(c, key, fn)return c.val, c.err
}

首先調(diào)g.createCall(key)創(chuàng)建call

如果此時(shí)已經(jīng)有其他協(xié)程發(fā)起了對(duì)call的請(qǐng)求,當(dāng)前協(xié)程就阻塞住,等待拿到結(jié)果后直接返回

如果done為false,表示當(dāng)前協(xié)程是第一個(gè)發(fā)起 call 的協(xié)程,那執(zhí)行g.makeCall(c, key, fn)發(fā)起真正的call請(qǐng)求

createCall實(shí)現(xiàn)如下:

func (g *flightGroup) createCall(key string) (c *call, done bool) {g.lock.Lock()if c, ok := g.calls[key]; ok {g.lock.Unlock()c.wg.Wait()return c, true}c = new(call)c.wg.Add(1)g.calls[key] = cg.lock.Unlock()return c, false
}
  • 其實(shí)就干了一件事:判斷是不是第一個(gè)對(duì)key的調(diào)用
    1. 不是:阻塞在c.wa上
    2. 是:創(chuàng)建call

接下來(lái)看makeCall

func (g *flightGroup) makeCall(c *call, key string, fn func() (any, error)) {defer func() {g.lock.Lock()delete(g.calls, key)g.lock.Unlock()c.wg.Done()}()c.val, c.err = fn()
}

真正執(zhí)行fn方法,執(zhí)行完畢后:

  • 將key從calls中刪除,這樣下一組并發(fā)請(qǐng)求到來(lái)時(shí),會(huì)重新發(fā)起真正的請(qǐng)求,獲取新值
  • 調(diào)用wg.done(),這樣之前阻塞在wg的協(xié)程都會(huì)獲得結(jié)果,并返回

官方庫(kù)

接下來(lái)看看go官方庫(kù)對(duì)singleflight的實(shí)現(xiàn)

代碼地址:https://cs.opensource.google/go/x/sync/+/036812b2:singleflight/singleflight.go

除了也實(shí)現(xiàn)了go-zero的Do方法外,官方庫(kù)另外提供了DoChan的模式:

  • 無(wú)論是第一個(gè)還是非第一個(gè)協(xié)程,都不阻塞在DoChan的調(diào)用中,而是返回一個(gè)channel,可以當(dāng)需要讀數(shù)據(jù)時(shí)才從channel中獲取
  • 也就是說(shuō)將是否阻塞獲取調(diào)用結(jié)果的權(quán)力交給調(diào)用方

看看詳細(xì)過(guò)程:DoChan

func (g *Group) DoChan(key string, fn func() (interface{}, error)) <-chan Result {ch := make(chan Result, 1)g.mu.Lock()if g.m == nil {g.m = make(map[string]*call)}if c, ok := g.m[key]; ok {c.dups++c.chans = append(c.chans, ch)g.mu.Unlock()// 返回channelreturn ch}c := &call{chans: []chan<- Result{ch}}c.wg.Add(1)g.m[key] = cg.mu.Unlock()// 異步發(fā)起調(diào)用go g.doCall(c, key, fn)// 非阻塞的返回channelreturn ch
}

那什么時(shí)候往channel塞數(shù)據(jù)呢?在doCall調(diào)用成功后,將返回值挨個(gè)發(fā)送到等待的channel中

for _, ch := range c.chans {ch <- Result{c.val, c.err, c.dups > 0}
}
http://www.risenshineclean.com/news/22355.html

相關(guān)文章:

  • 長(zhǎng)安網(wǎng)站建設(shè)費(fèi)用查詢網(wǎng)站流量
  • 重慶梁平網(wǎng)站建設(shè)哪家便宜優(yōu)化網(wǎng)站標(biāo)題是什么意思
  • 做qq游戲的視頻秀網(wǎng)站楓樹(shù)seo
  • 網(wǎng)站登錄注冊(cè)頁(yè)面模板下載百度搜索引擎收錄
  • 小型網(wǎng)站開(kāi)發(fā)用什么語(yǔ)言營(yíng)銷(xiāo)案例網(wǎng)站
  • 企業(yè)門(mén)戶網(wǎng)站建設(shè)渠道服裝市場(chǎng)調(diào)研報(bào)告范文
  • 鄭州網(wǎng)站建設(shè)公司價(jià)格經(jīng)濟(jì)新聞最新消息財(cái)經(jīng)
  • 邢臺(tái)做網(wǎng)站口碑好怎么弄推廣廣告
  • 百度收錄網(wǎng)站要多網(wǎng)站策劃書(shū)模板
  • 東莞企業(yè)黃頁(yè)百度關(guān)鍵詞優(yōu)化送網(wǎng)站
  • 編程線下培訓(xùn)機(jī)構(gòu)廣安seo外包
  • 泗洪網(wǎng)站建設(shè)蘭蔻搜索引擎營(yíng)銷(xiāo)案例
  • 做網(wǎng)站要做哪些站長(zhǎng)工具高清無(wú)嗎
  • 網(wǎng)站優(yōu)化標(biāo)題怎么做自媒體平臺(tái)注冊(cè)入口官網(wǎng)
  • 怎么做動(dòng)態(tài)網(wǎng)站系統(tǒng)哪里有永久免費(fèi)建站
  • 做網(wǎng)站用什么主機(jī)操作系統(tǒng)品牌網(wǎng)絡(luò)營(yíng)銷(xiāo)案例
  • web前端概述網(wǎng)站seo專員招聘
  • 2023年?yáng)|莞疫情最新消息seo關(guān)鍵詞首頁(yè)排名代發(fā)
  • asp網(wǎng)站做視頻教程提高網(wǎng)站收錄的方法
  • 一起做陶瓷的網(wǎng)站網(wǎng)絡(luò)推廣引流是做什么的
  • 網(wǎng)站建設(shè)工作室 杭州營(yíng)銷(xiāo)推廣與策劃
  • 自己做網(wǎng)站怎么優(yōu)化產(chǎn)品軟文是什么意思
  • 開(kāi)網(wǎng)站做代發(fā)友情鏈接怎么互換
  • 網(wǎng)站logo怎么修改百度推廣客戶端app
  • 旅游網(wǎng)站建設(shè)分析 需求石家莊最新消息
  • 網(wǎng)站建設(shè)公司 北京百度瀏覽器網(wǎng)頁(yè)
  • 企業(yè)貸款政策最新消息2022東莞seo整站優(yōu)化
  • 微信手機(jī)網(wǎng)站制作北京、廣州最新發(fā)布
  • 營(yíng)銷(xiāo)型網(wǎng)站建設(shè)的一般過(guò)程包括哪些環(huán)節(jié)?西部數(shù)碼域名注冊(cè)官網(wǎng)
  • 網(wǎng)站建設(shè)方案設(shè)計(jì)什么文案容易上熱門(mén)