Below you will find pages that utilize the taxonomy term “Singleflight”
November 19, 2020
Golang中的并发原语 Singleflight
"\u003cp\u003e在Golang中有一个并发原语是 \u003ca href=\"https://pkg.go.dev/golang.org/x/sync/singleflight\"\u003eSingleflight\u003c/a\u003e,好像知道的开发者并不多。其中著名的 \u003ca href=\"https://github.com/golang/groupcache\"\u003ehttps://github.com/golang/groupcache\u003c/a\u003e 就用到了这个并发原语。\u003c/p\u003e\n\u003ch2 id=\"golang版本\"\u003eGolang版本\u003c/h2\u003e\n\u003cp\u003ego1.15.5\u003c/p\u003e\n\u003ch2 id=\"相关知识点\"\u003e相关知识点\u003c/h2\u003e\n\u003cp\u003emap、Mutex、channel、\u003c/p\u003e\n\u003ch2 id=\"使用场景\"\u003e使用场景\u003c/h2\u003e\n\u003cp\u003e一般用在对指定资源频繁操作的情况下,如高并发下的“缓存击穿”问题。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e缓存击穿:一个存在的key,在缓存过期的瞬间,同时有大量的请求过来,造成所有请求都去DB读取数据,这些请求都会击穿缓存到DB,造成瞬时DB请求量大、压力瞬间骤增,导致数据库负载过高,影响整个系统正常运行。(缓存击穿不同于 缓存雪崩 和 缓存穿透)\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e怎么理解这个原语呢,简单的讲就是将对同一个资源的多个请求合并为一个请求。\u003c/p\u003e\n\u003cp\u003e举例说明,假如当有10万个请求来获取同一个key的值的时候,正常情况下会执行10万次get操作。而使用singleflight并发语后,只需要首次的地个请求执行一次get操作就可以了,其它请求再过来时,只需要只需要等待即可。待执行结果返回后,再把结果分别返回给等待中的请求,每个请求再返回给客户端,由此看看,在一定的高 …\u003c/p\u003e"