github.com/songzhibin97/gkit@v1.2.13/cache/singleflight/example_test.go (about)

     1  package singleflight
     2  
     3  // getResources 一般用于去数据库去获取数据
     4  func getResources() (interface{}, error) {
     5  	return "test", nil
     6  }
     7  
     8  // cache 填充到 缓存中的数据
     9  func cache(v interface{}) {
    10  	return
    11  }
    12  
    13  // ExampleNewSingleFlight
    14  func ExampleNewSingleFlight() {
    15  	singleFlight := NewSingleFlight()
    16  
    17  	// 如果在key相同的情况下, 同一时间只有一个 func 可以去执行,其他的等待
    18  	// 多用于缓存失效后,构造缓存,缓解服务器压力
    19  
    20  	// 同步:
    21  	v, err, _ := singleFlight.Do("test1", func() (interface{}, error) {
    22  		// todo 这里去获取资源
    23  		return getResources()
    24  	})
    25  	if err != nil {
    26  		// todo 处理错误
    27  	}
    28  	// v 就是获取到的资源
    29  	cache(v)
    30  
    31  	// 异步:
    32  	ch := singleFlight.DoChan("test2", func() (interface{}, error) {
    33  		// todo 这里去获取资源
    34  		return getResources()
    35  	})
    36  
    37  	result := <-ch
    38  	if result.Err != nil {
    39  		// todo 处理错误
    40  	}
    41  	cache(result.Val)
    42  
    43  	// 尽力取消
    44  	singleFlight.Forget("test2")
    45  }