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

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

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

一、什么是緩存擊穿

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

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

二、原理

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

三、實現(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í)行此操作的返回結果
		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

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

相關文章

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

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

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

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

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

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

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

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

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

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

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

    Go?語言使用goroutine運行閉包踩坑分析

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

    Golang定時任務框架GoCron的源碼分析

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

    一文帶你掌握Go語言運算符的使用

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

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

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

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

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

最新評論

容城县| 阿城市| 滨海县| 浦城县| 陆川县| 临潭县| 襄城县| 鹤壁市| 鹰潭市| 赤峰市| 通化市| 平乡县| 满城县| 莎车县| 龙泉市| 杭锦后旗| 新晃| 泸州市| 庆元县| 桃园县| 普安县| 三门县| 丽江市| 蚌埠市| 馆陶县| 德化县| 油尖旺区| 区。| 疏勒县| 鄂尔多斯市| 蒲城县| 明光市| 花莲市| 集安市| 乐平市| 越西县| 德江县| 新竹县| 乾安县| 延吉市| 绥滨县|