最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang?防緩存擊穿singleflight的實(shí)現(xiàn)

 更新時(shí)間:2022年08月02日 08:55:26   作者:xc_oo  
本文主要介紹了golang?防緩存擊穿singleflight的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、什么是緩存擊穿

當(dāng)一個(gè)key是熱點(diǎn)key時(shí),一般會(huì)做緩存來抗大量并發(fā),但當(dāng)緩存失效的一瞬間,這些大量的并發(fā)請求會(huì)擊穿緩存,直接請求數(shù)據(jù)庫

為了避免緩存擊穿,一種解決方法可以設(shè)置緩存永不過期,另一種可以使用golang的包 singleflight golang.org/x/sync/singleflight

二、原理

多個(gè)并發(fā)請求對一個(gè)失效key進(jìn)行數(shù)據(jù)獲取時(shí),只會(huì)有其中一個(gè)去直接獲取數(shù)據(jù),其它請求會(huì)阻塞等待第一個(gè)請求返回給它們結(jié)果

三、實(shí)現(xiàn)

package singleflight

import (
	"sync"
)

var WaitCount int
var DirectCount int

type Caller struct {
	val interface{}
	err error

	wg sync.WaitGroup
}

type Group struct {
	mu sync.RWMutex
	m  map[string]*Caller
}

func (g *Group) Do(key string, fn func() (interface{}, error)) (interface{}, error) {
	g.mu.Lock()
	if g.m == nil {
		g.m = make(map[string]*Caller)
	}

	c, ok := g.m[key]
	if ok {
                //阻塞等待其它已經(jīng)執(zhí)行此操作的返回結(jié)果
		g.mu.Unlock()
		c.wg.Wait()
		WaitCount++
		return c.val, c.err
	}

	//直接請求獲取數(shù)據(jù)
	c = &Caller{}
	g.m[key] = c
	c.wg.Add(1)
	g.mu.Unlock()

	c.val, c.err = fn()
	c.wg.Done()

	g.mu.Lock()
	delete(g.m, key)
	g.mu.Unlock()

	DirectCount++
	return c.val, c.err
}

測試:

func TestGroup_Do(t *testing.T) {
	sg := &Group{}
	wg := sync.WaitGroup{}

	for i := 0; i < 10000; i++ {
		fn := func() (interface{}, error) {
			return i, nil
		}
		wg.Add(1)
		go func() {
			defer wg.Done()
			got, err := sg.Do("test-key", fn)
			_, _ = got, err
			//t.Log("got:", i)
		}()
	}

	wg.Wait()
	fmt.Println("waitCount:", WaitCount)
	fmt.Println("DirectCount:", DirectCount)
}

輸出:

waitCount: 8323

DirectCount: 1401

到此這篇關(guān)于golang 防緩存擊穿singleflight的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)golang 防緩存擊穿singleflight 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解golang consul-grpc 服務(wù)注冊與發(fā)現(xiàn)

    詳解golang consul-grpc 服務(wù)注冊與發(fā)現(xiàn)

    這篇文章主要介紹了詳解golang consul-grpc 服務(wù)注冊與發(fā)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • 在go語言中安裝與使用protobuf的方法詳解

    在go語言中安裝與使用protobuf的方法詳解

    protobuf以前只支持C++, Python和Java等語言, Go語言出來后, 作為親兒子, 那有不支持的道理呢? 這篇文章主要給大家介紹了關(guān)于在go語言中使用protobuf的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-08-08
  • Go語言Gin框架前后端分離項(xiàng)目開發(fā)實(shí)例

    Go語言Gin框架前后端分離項(xiàng)目開發(fā)實(shí)例

    本文主要介紹了Go語言Gin框架前后端分離項(xiàng)目開發(fā)工程化實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11
  • Go語言模型:string的底層數(shù)據(jù)結(jié)構(gòu)與高效操作詳解

    Go語言模型:string的底層數(shù)據(jù)結(jié)構(gòu)與高效操作詳解

    這篇文章主要介紹了Go語言模型:string的底層數(shù)據(jù)結(jié)構(gòu)與高效操作詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 一文帶你了解Go語言中函數(shù)設(shè)計(jì)的實(shí)踐示例

    一文帶你了解Go語言中函數(shù)設(shè)計(jì)的實(shí)踐示例

    良好設(shè)計(jì)的函數(shù)具有清晰的職責(zé)和邏輯結(jié)構(gòu),提供準(zhǔn)確的命名和適當(dāng)?shù)膮?shù)控制,下面我們將一一描述函數(shù)設(shè)計(jì)時(shí)能夠遵循的最佳實(shí)踐,希望對大家有所幫助
    2023-06-06
  • Go?語言使用goroutine運(yùn)行閉包踩坑分析

    Go?語言使用goroutine運(yùn)行閉包踩坑分析

    這篇文章主要介紹了Go?語言使用goroutine運(yùn)行閉包踩坑解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • Golang定時(shí)任務(wù)框架GoCron的源碼分析

    Golang定時(shí)任務(wù)框架GoCron的源碼分析

    本文主要介紹了Golang定時(shí)任務(wù)框架GoCron的源碼分析,原生的gocron存在一些問題,如任務(wù)列表維護(hù)不當(dāng)、并發(fā)操作不可預(yù)測等,經(jīng)過改進(jìn)的gocron解決了這些問題,感興趣的可以了解一下
    2025-03-03
  • 一文帶你掌握Go語言運(yùn)算符的使用

    一文帶你掌握Go語言運(yùn)算符的使用

    運(yùn)算符用于在程序運(yùn)行時(shí)執(zhí)行數(shù)學(xué)或邏輯運(yùn)算。Go 語言內(nèi)置的運(yùn)算符有:算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、位運(yùn)算符、賦值運(yùn)算符、其他運(yùn)算符。本文將帶大家詳細(xì)了解一下這些運(yùn)算符的使用,感興趣的可以了解一下
    2022-04-04
  • go select編譯期的優(yōu)化處理邏輯使用場景分析

    go select編譯期的優(yōu)化處理邏輯使用場景分析

    select 是 Go 中的一個(gè)控制結(jié)構(gòu),類似于用于通信的 switch 語句。每個(gè) case 必須是一個(gè)通信操作,要么是發(fā)送要么是接收。接下來通過本文給大家介紹go select編譯期的優(yōu)化處理邏輯使用場景分析,感興趣的朋友一起看看吧
    2021-06-06
  • golang并發(fā)執(zhí)行的幾種方式小結(jié)

    golang并發(fā)執(zhí)行的幾種方式小結(jié)

    本文主要介紹了golang并發(fā)執(zhí)行的幾種方式小結(jié),主要包括了Channel,WaitGroup ,Context,使用這三種機(jī)制中的一種或者多種可以達(dá)到并發(fā)控制很好的效果,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08

最新評論

视频| 腾冲县| 海宁市| 图片| 永顺县| 禹州市| 温州市| 吉安市| 麻江县| 沙坪坝区| 长沙市| 四子王旗| 民丰县| 满洲里市| 锦屏县| 镶黄旗| 香格里拉县| 都昌县| 连云港市| 通州区| 石景山区| 鸡泽县| 老河口市| 区。| 彭州市| 田林县| 雅安市| 牟定县| 讷河市| 乐平市| 克东县| 依安县| 长宁县| 威海市| 宁波市| 逊克县| 呼伦贝尔市| 兴宁市| 濮阳市| 达拉特旗| 昌吉市|