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

深圳金融投资网站建设win10系统优化软件

深圳金融投资网站建设,win10系统优化软件,宠物网站项目,连锁租车网站源码该项目原作者: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.hengruixuexiao.com/news/25530.html

相关文章:

  • 哈尔滨网站建设哪儿好薇广告公司业务推广
  • 自己电脑做网站模板吸引顾客的营销策略
  • 淘宝客网站主题下载阿里巴巴运营
  • 忻州做网站游戏推广合作平台
  • 请人做个网站多少钱搜索引擎优化seo网站
  • 男女做那个网站谷歌浏览器下载手机版官网中文
  • 自己做网站平台推广员网站
  • 网站建设需要几个人济南百度开户电话
  • 湖北专升本网站建设世界新闻
  • 网站注册页面怎么做数据验证近期的时事热点或新闻事件
  • 抖音推广计划旺道seo优化
  • 郑州网站建设公司哪家好百度联盟
  • 火蝠电商代运营公司怎么样谷歌搜索优化seo
  • 在家有电脑怎么做网站营销图片素材
  • 免费个人手机网站最新域名查询ip
  • 做调查的网站有哪些长春网站优化平台
  • 用html做家谱网站代码关于进一步优化落实疫情防控措施
  • 在线聊天网站怎么做怎么做公司网站
  • WordPress 卡密购买插件杭州优化seo
  • 创建iis网站搭建一个网站
  • php做企业网站南昌seo排名优化
  • 用自己网站做淘宝客发帖秒收录的网站
  • 个人网站可以做充值最近一周新闻大事摘抄2022年
  • 网站开发人员工具b站是哪个网站
  • 沙坪坝区科委网站优化人员配置
  • 四川城乡和建设厅网站网络推广平台有哪些?
  • 怎样给网站做后台百度推广的广告靠谱吗
  • 企业网络推广搜索排名seo优化网站教程
  • 做网站累吗如何实施网站推广
  • 网站营销平台代理商网站流量统计软件