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

golang使用map支持高并發(fā)的方法(1000萬(wàn)次操作14ms)

 更新時(shí)間:2022年11月15日 10:43:47   作者:飛鳥(niǎo)真人  
這篇文章主要介紹了golang使用map支持高并發(fā)的方法(1000萬(wàn)次操作14ms),本文給大家詳細(xì)講解,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

語(yǔ)言原生的map存在2個(gè)問(wèn)題:

1)不是線程安全的;

2)數(shù)據(jù)量大時(shí)候需要盡量避免使用string等,GC壓力很大;

有人使用泛型實(shí)現(xiàn)了相關(guān)的cocurent-map,(https://github.com/orcaman/concurrent-map)但是關(guān)于鍵值部分仍然默認(rèn)使用了string,為了提高效率,這里對(duì)其做了一些修改,讓鍵值也可以自定義類(lèi)型:https://github.com/robinfoxnan/go_concurrent_map

基本使用方法:

	// Create a new map.
	m := cache.NewConcurrentMap[uint64, string]()
 
	// Sets item within map, sets "bar" under key "foo"
	m.Set(199010212, "bar")
 
	// Retrieve item from map.
	bar, ok := m.Get(199010212)
	fmt.Println(bar, ok)
 
	// Removes item under key "foo"
	m.Remove(199010212)

為了實(shí)現(xiàn)計(jì)數(shù)器等,需要在加鎖期間更新,需要使用回調(diào)函數(shù):

// 計(jì)數(shù)器
type BaseCounter struct {
	Count     uint64
	CountLast uint64
}
 
var MapOfAppUserCount ConcurrentMap[uint64, *AppUserCounter]
 
func InitMaps() {
	MapOfAppVistedCount = NewConcurrentMap[uint64, *BaseCounter]()
}
 
// 沒(méi)有值,則設(shè)置;如果有,則更新; 新增的部分通過(guò)新的值傳遞過(guò)來(lái)!
func appAddCallBack(exist bool, valueInMap *BaseCounter, newValue *BaseCounter) *BaseCounter {
	if exist == false {
		return newValue
	} else {
		valueInMap.Count += newValue.Count
		return valueInMap
	}
}
 
// 對(duì)應(yīng)用計(jì)數(shù)器加i
func AppAddBy(key uint64, i uint64) uint64 {
	c := BaseCounter{i, i}
	res := MapOfAppVistedCount.Upsert(key, &c, appAddCallBack)
	if res != nil {
		return res.Count
	}
	return 0
}

計(jì)數(shù)器的使用如下:

cache.InitMaps()
cache.AppAddBy(i, 1)

性能:

1)單線程初始化1~1000w的計(jì)數(shù)器,2412  ms

2)分給100個(gè)協(xié)程,14ms

測(cè)試代碼如下:

 func testSingle() {
	cache.InitMaps()
	timeUnixNano1 := time.Now().UnixMilli()
	// 100萬(wàn)次更新
	for i := uint64(0); i < 10000000; i++ {
		cache.AppAddBy(i, 1)
	}
	timeUnixNano2 := time.Now().UnixMilli()
	delta := timeUnixNano2 - timeUnixNano1
	fmt.Println("cost: ", delta, " ms")
 
	count := cache.AppAddBy(1, 1)
	fmt.Println(count)
	count = cache.AppAddBy(1, 2)
	fmt.Println(count)
	count = cache.AppAddBy(1, 3)
	fmt.Println(count)
}
 
var N int = 10000000
 
func doInsert(n int, index int, g *sync.WaitGroup) {
	m := N / n
	start := index * m
 
	//fmt.Println("thread ", index, "from ", start)
	for i := uint64(start); i < uint64(m); i++ {
		cache.AppAddBy(i, 1)
	}
	if g != nil {
		g.Done()
	}
}
 
func testMulti() {
	cache.InitMaps()
 
	group := sync.WaitGroup{}
	n := 100
	group.Add(n)
	timeUnixNano1 := time.Now().UnixMilli()
	for i := 0; i < n; i++ {
		go doInsert(n, i, &group)
	}
	group.Wait()
	timeUnixNano2 := time.Now().UnixMilli()
	delta := timeUnixNano2 - timeUnixNano1
	fmt.Println("cost: ", delta, " ms")
 
}

到此這篇關(guān)于golang讓map支持高并發(fā)(1000萬(wàn)次操作14ms)的文章就介紹到這了,更多相關(guān)golang map并發(fā)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在Golang中使用iota案例詳解

    在Golang中使用iota案例詳解

    在Go語(yǔ)言中,iota是一個(gè)預(yù)定義的標(biāo)識(shí)符,用于在常量聲明中生成連續(xù)的遞增值,iota的值從0開(kāi)始,每次在常量聲明中使用時(shí)遞增,本就給大家講解一下Golang中iota的使用案例,感興趣的同學(xué)跟著小編一起來(lái)看看吧
    2023-07-07
  • Go+Kafka實(shí)現(xiàn)延遲消息的實(shí)現(xiàn)示例

    Go+Kafka實(shí)現(xiàn)延遲消息的實(shí)現(xiàn)示例

    本文主要介紹了Go+Kafka實(shí)現(xiàn)延遲消息的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Golang多線程刷票的實(shí)現(xiàn)代碼

    Golang多線程刷票的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Golang多線程刷票的相關(guān)資料,這里實(shí)現(xiàn)刷票的功能,對(duì)于投票,刷票的很方便,并附實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2017-07-07
  • 使用golang腳本基于kubeadm創(chuàng)建新的token(問(wèn)題分析)

    使用golang腳本基于kubeadm創(chuàng)建新的token(問(wèn)題分析)

    這篇文章主要介紹了使用golang腳本基于kubeadm創(chuàng)建新的token(問(wèn)題分析),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-10-10
  • Golang語(yǔ)言的跨平臺(tái)UI工具包fyne使用詳解

    Golang語(yǔ)言的跨平臺(tái)UI工具包fyne使用詳解

    這篇文章主要為大家介紹了Golang語(yǔ)言的跨平臺(tái)UI工具包fyne使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Go語(yǔ)言流程控制詳情

    Go語(yǔ)言流程控制詳情

    這篇文章主要介紹了Go語(yǔ)言流程控制詳情,流程控制包含分三大類(lèi):條件判斷,循環(huán)控制和無(wú)條件跳轉(zhuǎn)。下面關(guān)于更多相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-03-03
  • 在Mac OS上安裝Go語(yǔ)言編譯器的方法

    在Mac OS上安裝Go語(yǔ)言編譯器的方法

    這篇文章主要介紹了在Mac OS上安裝Go語(yǔ)言編譯器的方法,Docker的興起使得Go近來(lái)人氣大幅攀升,需要的朋友可以參考下
    2015-10-10
  • 使用Go語(yǔ)言實(shí)現(xiàn)敏感詞過(guò)濾功能

    使用Go語(yǔ)言實(shí)現(xiàn)敏感詞過(guò)濾功能

    敏感詞過(guò)濾,算是一個(gè)比較常見(jiàn)的功能,尤其是在內(nèi)容、社交類(lèi)應(yīng)用中更是如此,本文介紹如何使用Go語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的敏感詞過(guò)濾功能,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • Go語(yǔ)言學(xué)習(xí)之將mp4通過(guò)rtmp推送流媒體服務(wù)的實(shí)現(xiàn)方法

    Go語(yǔ)言學(xué)習(xí)之將mp4通過(guò)rtmp推送流媒體服務(wù)的實(shí)現(xiàn)方法

    對(duì)音視頻一直是小白,決定沉下心來(lái),好好研究一下音視頻知識(shí),下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言學(xué)習(xí)之將mp4通過(guò)rtmp推送流媒體服務(wù)的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2022-12-12
  • 使用gopkg.in/yaml.v3?解析YAML數(shù)據(jù)詳解

    使用gopkg.in/yaml.v3?解析YAML數(shù)據(jù)詳解

    這篇文章主要為大家介紹了使用gopkg.in/yaml.v3?解析YAML數(shù)據(jù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09

最新評(píng)論

宝鸡市| 黄平县| 敦煌市| 邛崃市| 吉木乃县| 福州市| 红河县| 小金县| 陕西省| 沙雅县| 彭山县| 菏泽市| 涿州市| 利辛县| 五家渠市| 清涧县| 元阳县| 招远市| 太康县| 长春市| 塔城市| 平远县| 富阳市| 泊头市| 钟山县| 绥滨县| 陆丰市| 元氏县| 邵阳市| 阿瓦提县| 濮阳县| 敖汉旗| 噶尔县| 商河县| 黄冈市| 原平市| 梅州市| 冀州市| 驻马店市| 灵石县| 平阴县|