0
点赞
收藏
分享

微信扫一扫

go学习笔记 - 通过singleflight防止缓存击穿

天使魔鬼 2022-04-29 阅读 92

安装singleflight


go get -u golang.org/x/sync/singleflight

基本使用

package main

import (
	"fmt"
	"golang.org/x/sync/singleflight"
	"log"
	"sync"
)

var singleHandle singleflight.Group

func main() {
	group := sync.WaitGroup{}
	for i := 0; i < 10; i++ { // 模拟10个并发
		group.Add(1)
		go func(i int) {
			defer group.Done()
			fmt.Printf("goroutine #%d got result: %s\n", i, GetName("key"))
		}(i)
	}
	group.Wait()
	fmt.Println("全部执行完毕")
}

func GetName(key string) string {
	ret, err, shared := singleHandle.Do(key, func() (interface{}, error) {
		log.Printf("getting %s from database\n", key)
		log.Printf("setting %s in cache\n", key)
		return "value", nil
	})
	if err != nil {
		fmt.Printf("GetName error:%s\n", err)
		return ""
	}
	fmt.Printf("shared: %v   ", shared)
	return ret.(string)
}

举报

相关推荐

0 条评论