首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏跟着asong学Golang

    赏析Singleflight设计

    今天想与大家分享一下singleflight这个库,singleflight仅仅只有100多行却可以做到防止缓存击穿,有点厉害哦!所以本文我们就一起来看一看他是怎么设计的~。 注意:本文基于 https://pkg.go.dev/golang.org/x/sync/singleflight进行分析。 方法三 方法三就是singleflight的设计思路,也会使用互斥锁,但是相对于方法二的加锁粒度会更细,这里先简单总结一下singleflight的设计原理,后面看源码在具体分析。 截屏2021-07-14 下午8.30.56 源码赏析 已经迫不及待了,直奔主题吧,下面我们一起来看看singleflight是怎么设计的。 因为最近我在项目中也使用singleflight这个库,所以就看了一下源码实现,真的是厉害,这么短的代码就实现了这么重要的功能,我怎么就想不到呢。。。。

    69310编辑于 2022-07-11
  • 来自专栏golang算法架构leetcode技术php

    golang源码分析:singleflight

    singleflight通常被用来做防止缓存击穿,代码位置在https://github.com/golang/groupcache/tree/master/singleflight,在详细介绍代码内容之前 方法三:就是singleflight的设计思路,也会使用互斥锁,但是相对于方法二的加锁粒度会更细 singleflight 源码分析 说完了singleflight的应用场景,下面详细分析下 singleflight的源码,源码非常简洁,目录下就包含了两个文件singleflight.go 和对应的测试的测试文件singleflight_test.go 源码中就定义了两个结构体和一个方法

    82721编辑于 2022-08-02
  • 来自专栏Go 技术

    Go singleflight 源码剖析

    前言 前面的一篇文章 Go singleflight:防缓存击穿利器 详细介绍 singleflight 包的使用,展示如何利用它来避免缓存击穿。 而本篇文章,我们来剖析 singleflight 包的源码实现和工作原理,探索单飞的奥秘。 准备好了吗?准备一杯你最喜欢的咖啡或茶,随着本文一探究竟吧。 singleflight 版本:golang.org/x/sync v0.6.0 结构体解析 Group Group 是 singleflight 包的一个核心结构体,它管理着所有的请求,确保同一时刻, singleflight 能实现这种效果,关键点在于: 将多个相同请求合并成一个请求,确保函数只执行一次:singleflight 为了解决这个问题,引入了互斥锁 sync.Mutex 和 map。 结果共享机制:singleflight 通过阻塞式和非阻塞式两种方式,实现了结果的共享。

    64041编辑于 2024-04-16
  • 来自专栏Go 技术

    Go singleflight:防缓存击穿利器

    本文将深入探讨 Go 语言中 singleflight 包的使用。从缓存击穿问题的基础知识开始,进而详细介绍 singleflight 包的使用,展示如何利用它来避免缓存击穿。准备好了吗? singleflight 包Package singleflight provides a duplicate function call suppression mechanism.这段英文来自官方文档的介绍 ,直译过来的意思是:singleflight 包提供了一种“重复函数调用抑制机制”。 一句话概括就是 singleflight 将多个请求合并成一个请求,多个请求共享同一个结果。组成部分Group:这是 singleflight 包的核心结构体。 singleflight 包的源码解析文章即将发布,如果你对 singleflight 的源码感兴趣,别忘了点个关注,以免错过精彩内容。我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!

    82944编辑于 2024-04-14
  • 来自专栏Go语言学习专栏

    go中的singleflight是如何实现的?

    内容整理如下: go go singleflight 的底层实现 singleflight 是 Go 语言标准库中的一个很有用的包,它主要用来处理并发请求时的重复问题。 比如在高并发场景下,如果多个请求同时访问同一个资源,singleflight 可以确保这些请求中只有一个实际执行,其他请求则等待这个结果。 具体来说,singleflight 里有一个核心结构叫做 Group。当你调用 Do 方法时,它接收一个键(key)和一个函数(fn)。这个键是用来标识请求的唯一性,而函数则是实际要执行的操作。 内部实现上,singleflight 使用了一个互斥锁(mutex)来保护其状态,并且有一个映射表(map)来存储正在进行的请求。

    7210编辑于 2026-03-17
  • 来自专栏网管叨bi叨

    并发编程--用SingleFlight合并重复请求

    大家好啊,今天网管想给大家介绍一下Go的singleflight包,当然它不是直译过来的单飞的意思~~! SingleFlight是Go语言sync扩展库提供的另一种并发原语,那么SingleFlight是用于解决什么问题的呢? 翻译过来就是:singleflight包提供了一种抑制重复函数调用的机制。 Go提供的SingleFlight Go扩展库里用singleflight.Group结构体类型提供了SingleFlight并发原语的功能。 singleflight.Group由一个互斥锁sync.Mutex和一个映射表组成,每一个 singleflight.call结构体都保存了当前调用对应的信息: type Group struct {

    1.5K30发布于 2020-12-31
  • 来自专栏捉虫大师

    使用增强版 singleflight 合并事件推送,效果炸裂!

    最近在工作中对 Go 的 singleflight 包做了下增强,解决了一个性能问题,这里记录下,希望对你也有所帮助。 singleflight 是什么 singleflight 直接翻译为”单(次)飞(行)“,它是对同一种请求的抑制,保证同一时刻相同的请求只有一个在执行,且在它执行期间的相同请求都会 Hold 直到执行完成 图片 singleflight 的原理 最初 singleflight 出现在 groupcache 项目中,这个项目也是 Go 团队所写,后来该包被移到 Go 源码中,在 Go 源码中的版本经过几轮迭代 https://github.com/golang/groupcache/blob/master/singleflight/singleflight.go singleflight 把每次请求定义为 call 直接使用 singleflight,能行吗?

    1.4K20编辑于 2023-05-19
  • 来自专栏味笼的学习笔记

    Go并发聚合请求利器——singleflight的源码详解

    简介singlefilght ,在go标准库中("golang.org/x/sync/singleflight")提供了可重复的函数调用抑制机制。 定义全局变量var sf singleflight.Groupfunc callFuncBySF(key string, i int) (int, error) {// 2. (int)return res, err}3.2 进阶方法singleflight的本质是对某次函数调用的复用,只执行1次,并将执行期间相同的函数返回相同的结果。 一次请求还是多次请求,对于下游服务而言并没有太大区别,此时使用 singleflight 只是为了降低请求的数量级,那么使用 Forget() 提高下游请求的并发。 原理源码:https://cs.opensource.google/go/x/sync/+/f12130a5:singleflight/singleflight.goGroup// Group 对外的核心结构体

    3.4K11编辑于 2023-02-20
  • 来自专栏才浅coding攻略

    读猿码系列——6.Golang中用幂等思路解决缓存击穿的方案:singleflight

    在绝大多数情况下,可以考虑使用singleflight来抑制重复函数调用。 https://pkg.go.dev/golang.org/x/sync@v0.0.0-20220929204114-8fcdb60fdcc0/singleflight 上面是singleflight包的地址 下面这段代码对比使用多个goroutine直接调用100次同一函数和使用singleflight包的Do()方法处理后再调用100次同一函数两者的耗时。 由于 singleflight 是以阻塞读的方式来控制向下游请求的并发量,在第一个下游请求没有返回之前,所有请求都将被阻塞。 ---- 除了缓存击穿这类缓存Miss缓解数据库压力的应用场景,singleflight还可以被用于查询DNS记录,Go语言的net标准库里使用的lookupGroup结构,就是Go扩展库提供的原语singleflight.Group

    87120编辑于 2022-12-12
  • Go 语言中的防并发神器:singleflight 包深度解析

    一、 singleflight 包 的基本概念singleflight 包 (位于 golang.org/x/sync/singleflight) 的主要作用是对多个针对同一 key 的并发请求进行合并 限流降级:在短时间内高并发请求某个接口时, singleflight 可以减少后端服务的负载。 声明一个 singleflight.Group 对象,用于合并相同 key 的请求。 防止缓存击穿实战代码示例:package mainimport ( "golang.org/x/sync/singleflight" "time")var ( group singleflight.Group 五、实际项目中的应用建议在实际项目中,使用 singleflight 包 时建议结合以下几点来进行优化:与缓存结合使用:对于高并发的数据查询场景,可以先查询缓存,只有在缓存失效时才使用 singleflight

    44810编辑于 2025-08-01
  • 来自专栏人人都是架构师

    Go每日一库之187:singleflight(合并重复调用)

    本文主要介绍Go语言中的singleflight包,包括什么是singleflight以及如何使用singleflight合并请求解决缓存击穿问题。 这就是singleflight包提供给我们的能力,避免了同时执行重复的函数。 singleflight介绍 singleflight包中定义了一个名为Group的结构体类型,它表示一类工作,并形成一个命名空间,在这个命名空间中,可以使用重复抑制来执行工作单元。 singleflight包提供了DoChan方法,支持我们异步获取调用结果。 (string), err } 应用场景 singleflight将并发调用合并成一个调用的特点决定了它非常适合用来防止缓存击穿。 下面是一段使用singleflight进行查询的伪代码。

    2.3K40编辑于 2023-09-30
  • 来自专栏Pseudoyu

    [译] Go sync.Once 的妙用

    进一步阅读/其他注意事项 另一个类似于 sync.Once 的机制是 golang.org/x/sync/singleflightsingleflight 只会删除正在进行中的请求中的重复请求(即不会持久化缓存),但与 sync.Once 相比,singleflight 通过 context 实现起来可能更简洁(通过使用 select singleflight 实现的模式和 sync.Once 十分接近,但如果 map 中存有值,则会提前返回。

    46520编辑于 2023-04-11
  • 来自专栏yuyy.info技术专栏

    Go 进阶训练营 – 评论系统架构设计四:可用性设计

    Singleflight 对于热门的主题,如果存在缓存穿透的情况,会导致大量的同进程、跨进程的数据回源到存储层,可能会引起存储过载的情况,如何只交给同进程内,一个人去做加载存储? 使用归并回源的思路:https://pkg.go.dev/golang.org/x/sync/singleflight,同一时间只有一个协程去拿数据,拿到数据前,相同任务目标的其他协程都阻塞,拿到数据后 这是单个进程内的Singleflight,多节点下也会出现重复构建缓存的情况。

    84130编辑于 2022-11-22
  • 来自专栏萝卜要加油

    使用对冲请求降低长尾延迟

    Go High-Performance Programming EP7: Use singleflight To Merge The Same Request 中详细介绍了如何使用 SingleFlight 这个场景下面,使用SingleFlight 能够一定程度的缓解重复请求。 还有一种做法是只发送一个请求, 到P95的时候,如果还没有收到返回,那么就立即向第二个节点发送请求。

    30110编辑于 2025-03-07
  • 缓存 redis

    如果想要对本地保证强一致性,那么就需要加入分布式锁或者使用一些负载均衡算法和 singleflight ,分布式锁比较简单,就是更新时候将缓存和数据库数据锁住。 单机上也可以使用 singleflight 那么,单机上每次都有一个线程去更新 key 。 使用负载均衡和 singleflight 结合也可以完成,我们知道 singleflight 每个单机就会有一个线程去更新,那么多个机器就有多个线程,负载均衡即使在众多机器中选出一个机器,两者结合就是每次都有一个线程更新

    55010编辑于 2024-05-06
  • 来自专栏捉虫大师

    翻车了,被读者找出 BUG

    本文是上篇文章《使用增强版 singleflight 合并事件推送,效果炸裂!》 如果在 singleflight 层面去解决这个问题,暂时我还没有想到很好的办法,如果读者朋友们有好的方法,欢迎私信我。

    29140编辑于 2023-06-12
  • 来自专栏Go语言学习专栏

    Go面试题从浅入深高频必刷「2025版」

    未初始化,写入或者读取都会阻塞 往close的channel写入数据会发生panic close未初始化channel会发生panic close已经close过的channel会发生panic 08 SingleFlight 基本概念 SingleFlight 是 Go 开发组提供的一个扩展并发原语。 与sync.Once的区别 sync.Once 不是只在并发的时候保证只有一个 goroutine 执行函数 f,而是会保证永远只执行一次,而 SingleFlight 是每次调用都重新执行,并且在多个请求同时调用的时候只有一个执行 sync.Once 主要是用在单次初始化场景中,而 SingleFlight 主要用在合并并发请求的场景中 应用场景 使用 SingleFlight 时,可以通过合并请求的方式降低对下游服务的并发压力, 这样一来,之后这个 key 请求会执行 f,而不是等待前一个未完成的 fn 函数的结果 实现方法 SingleFlight 定义一个辅助对象 call,这个 call 就代表正在执行 fn 函数的请求或者是已经执行完的请求

    15010编辑于 2026-03-17
  • 来自专栏网管叨bi叨

    Golang 并发编程之同步原语

    在这一节中我们就会介绍 Go 语言中常见的同步原语 Mutex、RWMutex、WaitGroup、Once 和 Cond 以及扩展原语 ErrGroup、Semaphore和 SingleFlight  我们在这一节中就会介绍 Go 语言目前在扩展包中提供的三种原语,也就是 ErrGroup、Semaphore 和 SingleFlightsingleflight 提供的这一功能减少下游的压力;它的使用其实也非常简单,我们可以直接使用 singleflight.Group{} 创建一个新的 Group 结构体,然后通过调用 Do 方法就能对相同的请求进行抑制 小结 singleflight 包提供的 Group 接口确实非常好用,当我们需要这种抑制对下游的相同请求时就可以通过这个方法来增加吞吐量和服务质量,在使用的过程中我们也需要注意以下的几个问题: Do 和 DoChan 一个用于同步阻塞调用传入的函数,一个用于异步调用传入的参数并通过 Channel 接受函数的返回值; Forget 方法可以通知 singleflight 在持有的映射表中删除某个键,

    1.4K50发布于 2020-05-20
  • 来自专栏TIGERB的技术博客

    PHP转Go速学手册

    减少缓存穿透利器之singleflight包的使用 作用:缓存等穿透时减少请求数。 使用: package main import ( "io/ioutil" "net/http" "sync" "testing" "golang.org/x/sync/singleflight = nil { t.Error(err) return } t.Log("log") }() } wg.Wait() } // 使用singleflight的代码示例 func TestDemo_Singleflight(t *testing.T) { t.Parallel() singleGroup := singleflight.Group{} wg := 使用Singleflight只发起了1次请求 ? 7. Channel的使用 作用:不要通过共享内存来通信,要通过通信来实现共享内存。相当于管道。

    2.9K31发布于 2021-07-28
  • 来自专栏golang算法架构leetcode技术php

    golang源码分析:groupcache(2)

    Group{ name: name, getter: getter, peers: peers, cacheBytes: cacheBytes, loadGroup: &singleflight.Group = nil { fn(g) } groups[name] = g return g 重点注意下其中loadGroup: &singleflight.Group{},初始化了单飞,后面获取数据就是基于单飞的

    36510编辑于 2023-09-06
领券