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 }