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

企业网站开源代码广州品牌设计工作室

企业网站开源代码,广州品牌设计工作室,广告策划书撰写,沈阳网站建设找哪家该项目原作者:https://github.com/geektutu/7days-golang。本文旨在记录本人做该项目时的一些疑惑解答以及部分的测试样例以便于本人复习。 1 缓存雪崩、缓存击穿与缓存穿透 概念解析: 缓存雪崩:缓存在同一时刻全部失效,造成瞬…

该项目原作者:https://github.com/geektutu/7days-golang。本文旨在记录本人做该项目时的一些疑惑解答以及部分的测试样例以便于本人复习。

1 缓存雪崩、缓存击穿与缓存穿透

概念解析

  • 缓存雪崩:缓存在同一时刻全部失效,造成瞬时DB请求量大、压力骤增,引起雪崩。缓存雪崩通常因为缓存服务器宕机、缓存的 key设置了相同的过期时间等引起。
  • 缓存击穿:一个存在的key,在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到 DB ,造成瞬时DB请求量大、压力骤增。
  • 缓存穿透:查询一个不存在的数据,因为不存在则不会写到缓存中,所以每次都会去请求 DB,如果瞬间流量过大,穿透到 DB,导致宕机。

2 singleflight介绍

singleflight 是一个非常有用的包,它提供了一种机制来抑制对某个函数的多次重复调用。这个包特别适用于避免在高并发场景下对同一资源的重复请求,比如在缓存击穿问题中,多个请求同时访问同一个资源时,singleflight 可以确保这些请求中只有一个实际执行,其他请求则等待这个结果,从而减少对后端服务的压力

核心概念
singleflight 包中定义了一个名为 Group 的结构体类型,它表示一类工作,并形成一个命名空间,在这个命名空间中,可以使用重复抑制来执行工作单元。当你调用 Do 方法时,它接收一个键(key)和一个函数(fn)。这个键是用来标识请求的唯一性,而函数则是实际要执行的操作。Do 方法首先会检查是否已经有相同的请求正在处理中。如果有,那么当前请求就会被放入一个等待队列,直到第一个请求完成并返回结果。这时,所有等待的请求都会收到相同的结果。

使用场景
singleflight 常用于以下场景:

  • 缓存击穿:在高并发的情况下,某个热点数据缓存失效后,大量的请求直接访问数据库,造成数据库的压力过大,甚至宕机的现象。使用singleflight 可以确保即使在缓存失效时,也只有一次数据库请求被执行,其他请求等待这次请求的结果 。
  • 避免重复计算:在需要进行复杂计算且结果可以被多个请求共享的场景中,singleflight 可以确保计算只执行一次,其他请求共享这个结果,从而提高效率。

基本使用
使用 singleflight 时,首先需要创建一个 Group 实例,然后通过调用 Do 方法来执行具体的函数。如果相同的键对应的函数已经
被调用,那么后续的调用将会等待第一个调用的结果,而不是重复执行函数

var g singleflight.Group// 模拟耗时操作
func getData(key string) (string, error) {// 模拟数据库查询耗时time.Sleep(2 * time.Second)return "data for " + key, nil
}func main() {// 第一次调用result1, err, shared := g.Do("key", func() (interface{}, error) {return getData("key")})if err != nil {log.Fatal(err)}fmt.Printf("Result1: %s, Shared: %v\n", result1, shared)// 第二次调用,将共享第一次调用的结果result2, err, shared := g.Do("key", func() (interface{}, error) {return getData("key")})if err != nil {log.Fatal(err)}fmt.Printf("Result2: %s, Shared: %v\n", result2, shared)
}

在这个例子中,即使 getData 函数被调用了两次,但由于 singleflight 的机制,实际的数据库查询操作只执行了一次,两次调用共享了这个结果

3 运用singleflight到geecache中

type Group struct {name      stringgetter    GettermainCache cachepeers     PeerPicker// use singleflight.Group to make sure that// each key is only fetched onceloader *singleflight.Group
}func NewGroup(name string, cacheBytes int64, getter Getter) *Group {// ...g := &Group{// ...loader:    &singleflight.Group{},}return g
}func (g *Group) load(key string) (value ByteView, err error) {// each key is only fetched once (either locally or remotely)// regardless of the number of concurrent callers.viewi, err := g.loader.Do(key, func() (interface{}, error) {if g.peers != nil {if peer, ok := g.peers.PickPeer(key); ok {if value, err = g.getFromPeer(peer, key); err == nil {return value, nil}log.Println("[GeeCache] Failed to get from peer", err)}}return g.getLocally(key)})if err == nil {return viewi.(ByteView), nil}return
}
  • 修改 geecache.go 中的 Group,添加成员变量 loader,并更新构建函数 NewGroup。
  • 修改 load 函数,将原来的 load 的逻辑,使用 g.loader.Do 包裹起来即可,这样确保了并发场景下针对相同的 key,load 过程只会调用一次。
http://www.yayakq.cn/news/830902/

相关文章:

  • 招聘网站怎么做推广住房和城乡建设部网站 挂证通报
  • 养生类网站源码一件代发货源app
  • 做网站电子版报价模板一站式+wordpress
  • 男女做网站互联网行业特点
  • 郑州网站制作报价用wordpress搭建
  • 宁波网站建设外包做网站支付系统
  • flash 好的网站企业信息公开网站
  • 北京公司网站设计价格2008 iis 添加 网站 权限设置
  • php网站开发用什么软件性病医院网站优化服务商
  • 如何更改 网站 关键词制作一个简单的网站
  • 即墨区建设局网站网站如何吸引
  • 怎么做简单的网站首页网站的支付接口对接怎么做
  • 网站建设与管理课后作业答案百度上做优化一年多少钱
  • 哪个网站是可以做书的住房和城乡建设部网站查询
  • 美丽寮步网站建设台州小型网站建设
  • 网站开发阶段网站空间续费多钱一年
  • 淘客做的领券网站网站开发外包维护合同范本
  • 网站开发设计有限公司seo云优化软件破解版
  • 西安网站网络营销淘宝店铺去哪里买
  • 潍坊免费模板建站深圳 网站开发公司
  • 中国免费企业建站如何做网站走查
  • 最便宜买机票网站建设马鞍山网站seo
  • 深圳福田网站制作中国十大搜索引擎排名最新
  • 外文网站制作深圳分销网站设计价格
  • 青海城乡建设厅网站 官网服务网站排名咨询
  • 企业建网站服务郑州网站外包
  • 视频点播网站开发教程推广公众号的9种方法
  • 免费网站模板制作软件定制开发公司地址
  • 仿微博网站模板境外电商网站建设
  • 鄂州网站设计制作公司手表网站免费设计