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

wordpress搭建影视站qq开放平台网站开发申请不通过的原因

wordpress搭建影视站,qq开放平台网站开发申请不通过的原因,百度六安分公司,长沙人才招聘网前言 在缓存系统中,如果发生了缓存未命中,通常会向数据库或者其他的缓存系统来请求数据。 想象这样一种情况,缓存系统中某个热点值被删除了,随后一大批请求到来,造成大量的cache miss,如果这些请求全部都…

前言

在缓存系统中,如果发生了缓存未命中,通常会向数据库或者其他的缓存系统来请求数据。

想象这样一种情况,缓存系统中某个热点值被删除了,随后一大批请求到来,造成大量的cache miss,如果这些请求全部都转向DB,那么会造成DB请求量大,压力增加,这就是典型的缓存击穿

那么如何避免缓存击穿这种情况呢?

通常有如下几种办法:

  • 设置永不过期的缓存:对于一些特别热门的数据可以设置成永不过期,这样可以避免由于缓存过期而导致的缓存击穿。

  • 缓存预热:在系统启动或者是缓存过期之前,可以把可能会被访问到的数据提前加载到缓存中,这样可以避免缓存过期导致的缓存击穿。

  • 使用singlefight将多个对数据库的请求转变成一个。

本文着眼于singlefight方法,接下来会讲解singlefight的原理及实现。

singlefight原理及实现

原理

singleflight是一种让相同的请求在短时间内的全局范围内只执行一次的机制。即,当多个goroutine并发的调用相同请求时,只有一个请求会被执行,而其他的请求会等待第一个请求执行结束后,再返回执行结果。

此算法的核心就是使用一个map结构来保存key与函数运行状态的映射,在每次调用函数的时候,检查key是否在map中,如果存在,说明已经有相同请求的函数正在调用了,就不会额外的运行函数,而是等待之前函数运行的结果;如果不存在,就会运行函数。

实现

定义Call保存函数运行状态:

type Call struct {wg sync.WaitGroupval interface{}err error
}

定义Group用于与用户交互,也是singleflight的核心结构体,map用于存储key与函数运行状态的映射,锁用于保护map值的并发修改:

type Group struct {mu sync.Mutexm map[string]*Call
}

为Group编写Do方法,核心逻辑就是判断key在map中是否存在,如果存在就会等待函数运行完毕后返回(通过waitgroup),如果不存在则会调用fn函数,注意要用锁保护map的并发访问:

func (g *Group) Do(key string,fn func()(interface{},error))(interface{},error) {g.mu.Lock()//懒加载if g.m == nil{g.m = make(map[string]*Call)}if v,ok:=g.m[key];ok{g.mu.Unlock()v.wg.Wait()return v.val,v.err}else {c := &Call{}c.wg.Add(1)g.m[key] = cg.mu.Unlock()c.val,c.err = fn()c.wg.Done()g.mu.Lock()delete(g.m,key)g.mu.Unlock()return c.val,c.err}}

编写测试代码进行测试吧:

func TestGroup_Do(t *testing.T) {var wg sync.WaitGroupg := &Group{}var num int//模仿Db函数getDb := func(i int,key string)[]byte {log.Println(i,"search the Db for",key)num++time.Sleep(1*time.Second)return []byte(key)}key := "key"for i := 0; i < 10; i++ {go func(i int) {wg.Add(1)v,_:=g.Do(key, func() (interface{}, error) {return getDb(i,key),nil})log.Println(i,"get the data :",v)wg.Done()}(i)}time.Sleep(2*time.Second)for i := 10; i < 20; i++ {go func(i int) {wg.Add(1)v,_:=g.Do(key, func() (interface{}, error) {return getDb(i,key),nil})log.Println(i,"get the data :",v)wg.Done()}(i)}wg.Wait()if num > 2 {log.Fatal("wrong!there are two many getDb!")}
}

测试结果并发接受到多个请求时,只会运行一个请求。

Sync.Once和SingleFlight对比

Sync.Once和SingleFlight的功能比较像,但是也有一些区别:

sync.Once 用于确保某个函数在多线程环境下只被执行一次。当多个线程同时调用 Do() 方法时,只有第一个调用的线程会执行函数,其他线程会被阻塞等待,直到第一个线程完成。这个工具通常用于执行初始化操作,确保全局只会初始化一次。

singleflight 则是用于减少重复调用相同函数的次数。当多个线程同时调用 Do() 方法,如果相同的参数已经在处理中,那么后续的调用会被阻塞等待,直到处理完成后才返回相同的结果。如果参数不同,那么会启动新的处理流程。这个工具通常用于避免重复计算或者重复查询数据库等场景。

总的来说,sync.Once 主要用于保证某个函数只会被执行一次通常用于初始化中,而 singleflight 主要用于避免重复计算和查询通常用于数据库中。如保证缓存击穿。

http://www.yayakq.cn/news/482820/

相关文章:

  • 网站建设金手指霸屏wordpress 股票主题
  • 网站开发 图片多语言网站源码
  • 给人家做网站服务器自己搭吗企业门户是什么
  • html5 网站 源码wordpress 前台上传文件
  • 企业网站硬件设计建设银行招聘网站甘肃分行
  • 沈阳房地产网站开发wordpress5.2
  • 巴中房产网站建设免费发布推广信息的软件
  • 在家有电脑怎么做网站无锡企业做网站
  • 顺通建设集团有限公司 网站wordpress腾讯云cdn
  • 手机上做网站php网站关键词优化推广哪家快
  • 宁波小程序开发公司泉州关键词优化推广
  • 怎么在国外网站开发客户体验营销理论
  • 制作制作网站开发在网上卖货怎么卖
  • .net网站开发架构西宁大型网站建设
  • 找做模型方案去哪个网站汕头网站快速优化排名
  • 广东省门户网站建设的现状口碑营销网站
  • 南阳做网站优化哪家好昆明网站建设系统有哪些
  • 学生版 建设网站软件下载给媳妇做的网站
  • .net如何做网站网站域名可以改么
  • 江西省城乡和住房建设部网站手机可以看的网站
  • 网站建设业务好跑吗网站如何做才能被百度等收录
  • 阳江做网站公司网页翻译哪个好用
  • 网站的承诺郑州网站推广公司电话
  • 网站图片优化器山西网络营销外包
  • 电子商务网站建设完整案例教程s2sh pdf下载wordpress插件点不开
  • 江苏企业建站科技公司起名
  • 深一集团的网站谁做的触屏网站建设
  • 网站开发与应用案例国外网络销售平台有哪些
  • 安徽网站建设推荐 晨飞网络wordpress首页调用所有分类
  • 查询网站开发的端口wordpress 网页计算器