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

推荐微网站建设绍兴建设开发有限公司网站

推荐微网站建设,绍兴建设开发有限公司网站,建设银行江西分行官方网站,晚上正能量免费下载软件安全前言 在缓存系统中#xff0c;如果发生了缓存未命中#xff0c;通常会向数据库或者其他的缓存系统来请求数据。 想象这样一种情况#xff0c;缓存系统中某个热点值被删除了#xff0c;随后一大批请求到来#xff0c;造成大量的cache miss#xff0c;如果这些请求全部都…前言 在缓存系统中如果发生了缓存未命中通常会向数据库或者其他的缓存系统来请求数据。 想象这样一种情况缓存系统中某个热点值被删除了随后一大批请求到来造成大量的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)numtime.Sleep(1*time.Second)return []byte(key)}key : keyfor 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.hkea.cn/news/14504454/

相关文章:

  • 律师网站建设公司源码下载网站cms
  • 基层建设期刊上什么网站查询文章网站建设首页
  • 7黄页网站建设淄博物联网app开发公司
  • 网站快慢由什么决定网站建设 预付款
  • wordpress 地图html长沙seo
  • 公司做网站多泉州网站建设有哪些
  • 有哪些做伦敦金的网站做网站凡科如何
  • 建设网站地图素材企业为什么要交税
  • 化工厂网站建设wordpress 网络公司
  • 怀宁县住房与城乡建设局网站恒大房地产最新消息
  • 怎么样做美术招生信息网站120平米装修实用图
  • 100个万能网站广告设计网站排行榜前十名有哪些
  • 江门北京网站建设邹平网站建设公司报价
  • 知名企业网站截图做网站asp
  • 天津建站模板衡量一个网站的指标
  • 要做一个网站得怎么做嘉兴手机模板建站
  • 网站建设价格标准新闻江西今天发生的重大新闻事件
  • 吴桥县做网站建设云个人证件查询系统
  • 网站icp备案证明文件wordpress 整站模板
  • 自己建网站可以赚钱吗东莞旅游网站建设
  • 网站服务器如何搭建广东营销型网站
  • 泉州网站建设方案优化免费建电子商务网站
  • 手机便宜电商网站建设驻马店市住房和城乡建设局网站首页
  • 沧州市做网站wordpress自建邮箱
  • 赣州网站建设策划wordpress淘宝客主题下载
  • 天津企业网站制作中国室内设计公司
  • 那些做兼职的小网站seo网站诊断方案
  • 做网站赔了8万wordpress一定是主页吗
  • 织梦摄影网站源码网站建设 盈利
  • 做网站需要套模板色系网站哪里有