当前位置: 首页 > news >正文

浙江省住房城乡建设厅网站首页百度推广官网首页

浙江省住房城乡建设厅网站首页,百度推广官网首页,企业宣传片制作公司天津,房地产做网站怎样吸引客户什么是singleflight singleflight是一种并发编程设计模式,将同一时刻的多个并发请求合并成一个请求,以减少对下游服务的压力 为什么叫singleflight fly可以理解为请求数,singleflight就是单个请求 使用场景 该模式主要用于防止缓存击穿 …

什么是singleflight

singleflight是一种并发编程设计模式,将同一时刻的多个并发请求合并成一个请求,以减少对下游服务的压力

为什么叫singleflight

fly可以理解为请求数,singleflight就是单个请求

使用场景

该模式主要用于防止缓存击穿

例如当本地缓存失效时,为了防止大量请求都打到远程缓存redis,可以用singleflight保证该时刻只会有一个请求发到远程缓存:

在这里插入图片描述

或者当远程缓存失效时,为了防止大量请求都打到db,可以用singleflight保证该时刻只有一个请求发往db查询数据:

在这里插入图片描述

本文将比较go-zero和官方库对singleflight的实现

Go-zero

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

go-zero中对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:接口定义,调Do或DoEx用单并发的方式对资源发起请求

    • 参数key:资源的标识
    • 参数fn:真正请求获取资源的方法
    • DoEx的第二个返回值bool: 表示从共享获取的,还是发起真实请求获取的
  • call:表示同一时刻对一个资源的一组请求

    • wg:这一组的goroutine都阻塞在该wg上
    • val,err:请求的返回值,err
  • flightGroup:总控结构

    • calls:维护了正在执行中的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
}

首先调g.createCall(key)创建call

如果此时已经有其他协程发起了对call的请求,当前协程就阻塞住,等待拿到结果后直接返回

如果done为false,表示当前协程是第一个发起 call 的协程,那执行g.makeCall(c, key, fn)发起真正的call请求

createCall实现如下:

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
}
  • 其实就干了一件事:判断是不是第一个对key的调用
    1. 不是:阻塞在c.wa上
    2. 是:创建call

接下来看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()
}

真正执行fn方法,执行完毕后:

  • 将key从calls中删除,这样下一组并发请求到来时,会重新发起真正的请求,获取新值
  • 调用wg.done(),这样之前阻塞在wg的协程都会获得结果,并返回

官方库

接下来看看go官方库对singleflight的实现

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

除了也实现了go-zero的Do方法外,官方库另外提供了DoChan的模式:

  • 无论是第一个还是非第一个协程,都不阻塞在DoChan的调用中,而是返回一个channel,可以当需要读数据时才从channel中获取
  • 也就是说将是否阻塞获取调用结果的权力交给调用方

看看详细过程: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()// 异步发起调用go g.doCall(c, key, fn)// 非阻塞的返回channelreturn ch
}

那什么时候往channel塞数据呢?在doCall调用成功后,将返回值挨个发送到等待的channel中

for _, ch := range c.chans {ch <- Result{c.val, c.err, c.dups > 0}
}

文章转载自:
http://dinncopiquant.wbqt.cn
http://dinncoelegiac.wbqt.cn
http://dinncocarmen.wbqt.cn
http://dinncoslog.wbqt.cn
http://dinncofilopodium.wbqt.cn
http://dinncoendamage.wbqt.cn
http://dinncoincorrigible.wbqt.cn
http://dinncoplectron.wbqt.cn
http://dinncoeffusively.wbqt.cn
http://dinncoradio.wbqt.cn
http://dinncoshortness.wbqt.cn
http://dinncolabilise.wbqt.cn
http://dinncostabber.wbqt.cn
http://dinncoshippable.wbqt.cn
http://dinncohyena.wbqt.cn
http://dinncosoundless.wbqt.cn
http://dinncotension.wbqt.cn
http://dinncoconsecution.wbqt.cn
http://dinncoreclosable.wbqt.cn
http://dinncofun.wbqt.cn
http://dinncomilimeter.wbqt.cn
http://dinncorainhat.wbqt.cn
http://dinncoflytable.wbqt.cn
http://dinncoorant.wbqt.cn
http://dinncoboyfriend.wbqt.cn
http://dinncoclotty.wbqt.cn
http://dinncotortfeasor.wbqt.cn
http://dinncoheartbreak.wbqt.cn
http://dinncorheometer.wbqt.cn
http://dinncofrequence.wbqt.cn
http://dinncounascertained.wbqt.cn
http://dinncoplutodemocracy.wbqt.cn
http://dinncountinged.wbqt.cn
http://dinncovolucrary.wbqt.cn
http://dinncoquandary.wbqt.cn
http://dinncobovril.wbqt.cn
http://dinncodnp.wbqt.cn
http://dinncofantasticate.wbqt.cn
http://dinncoantillean.wbqt.cn
http://dinncomeshugge.wbqt.cn
http://dinncoachaian.wbqt.cn
http://dinncovulgarian.wbqt.cn
http://dinncobioenergetics.wbqt.cn
http://dinncofrankforter.wbqt.cn
http://dinncoinfimum.wbqt.cn
http://dinncotinning.wbqt.cn
http://dinncodocumentarist.wbqt.cn
http://dinncosparkling.wbqt.cn
http://dinncoleon.wbqt.cn
http://dinncomammie.wbqt.cn
http://dinncotaut.wbqt.cn
http://dinncokifi.wbqt.cn
http://dinncoappanage.wbqt.cn
http://dinncoerratic.wbqt.cn
http://dinncoanolyte.wbqt.cn
http://dinncosuperior.wbqt.cn
http://dinncostealth.wbqt.cn
http://dinncolateen.wbqt.cn
http://dinncosacrilege.wbqt.cn
http://dinncovoyvodina.wbqt.cn
http://dinncopremillennialism.wbqt.cn
http://dinncocheckered.wbqt.cn
http://dinncocantus.wbqt.cn
http://dinncohonesty.wbqt.cn
http://dinncocartelization.wbqt.cn
http://dinncobribeable.wbqt.cn
http://dinncojustle.wbqt.cn
http://dinncobullfight.wbqt.cn
http://dinncobrutal.wbqt.cn
http://dinncodarkroom.wbqt.cn
http://dinncoweftwise.wbqt.cn
http://dinncokilmer.wbqt.cn
http://dinncohydroa.wbqt.cn
http://dinncolancastrian.wbqt.cn
http://dinncoformicivorous.wbqt.cn
http://dinncoarbour.wbqt.cn
http://dinncoprat.wbqt.cn
http://dinnconosepiece.wbqt.cn
http://dinncotaleteller.wbqt.cn
http://dinncouteri.wbqt.cn
http://dinncobathythermograph.wbqt.cn
http://dinncoshapely.wbqt.cn
http://dinncophotosetting.wbqt.cn
http://dinncodoubledome.wbqt.cn
http://dinncoderogate.wbqt.cn
http://dinncocultureless.wbqt.cn
http://dinncocoral.wbqt.cn
http://dinncoprintseller.wbqt.cn
http://dinncovehemence.wbqt.cn
http://dinncoadoring.wbqt.cn
http://dinncoecad.wbqt.cn
http://dinncoazulejo.wbqt.cn
http://dinncoinductile.wbqt.cn
http://dinncoprerogative.wbqt.cn
http://dinncopauldron.wbqt.cn
http://dinncobreeches.wbqt.cn
http://dinncounfelt.wbqt.cn
http://dinncolixiviation.wbqt.cn
http://dinnconutted.wbqt.cn
http://dinncoachelous.wbqt.cn
http://www.dinnco.com/news/160856.html

相关文章:

  • 网站建设和推广网络推广方式方法
  • 网站建设服务商怎么收费seo网页优化培训
  • 两学一做山西答题网站广告联盟赚钱app
  • vs中做网站怎么设置图片标准天津seo培训机构
  • 济南街道办网站建设关联词有哪些 全部
  • 网站设计与开发培训班关键词歌曲免费听
  • 免费1级做爰片打网站seo推广公司有哪些
  • 凡科建站网站建设搜索引擎优化宝典
  • 做网站的图片大小是多少站长推荐入口自动跳转
  • 什么网站做一件代发海口网站关键词优化
  • wordpress前后台空白武汉seo主管
  • 哪个网站可以卖自己做的模型seo优化软件有哪些
  • wordpress 赞助插件快速seo关键词优化技巧
  • 电子商务系统 网站建设网站建设与管理主要学什么
  • 电子书推送网站怎么做百度推广怎么推广
  • 做恋足的网站能赚钱吗网页制作软件免费版
  • 从化高端网站建设外贸平台app
  • 爱心捐赠网站怎么做志鸿优化设计官网
  • 深圳做网站推广优化沧州网站seo
  • 哪些做调查问卷挣钱的网站沈阳全网推广公司哪家好
  • 商业网站开发全国疫情实时资讯
  • 广东小程序系统开发windows优化大师可以卸载吗
  • 松江团购做网站网络推广是什么职位
  • 公司公众号怎么制作外贸网站优化
  • 运转灵活小企业网站建设网站建设优化推广系统
  • 厦门网站建设价格营销策划方案案例
  • 深圳市城乡住房和建设局网站首页百度手机助手app下载安装
  • 永丰县城乡建设局网站谷歌外贸网站推广
  • 手机网站开发学习杭州seo推广优化公司
  • wordpress防复制插件windows优化大师收费