Go singleflight 示例
Go singleflight 示例
import "golang.org/x/sync/singleflight"
var g singleflight.Group
func GetUser(uid string) (string, error) {
v, err, _ := g.Do("user:"+uid, func() (interface{}, error) {
if v := redis.Get("user:" + uid); v != nil {
return v, nil
}
row, err := db.Query(uid) // 并发只执行一次
if err == nil {
redis.Set("user:"+uid, row, 300)
}
return row, err
})
return v.(string), err
}| 进程内 | singleflight / 异步合并队列 |
|---|---|
| 跨进程 | 分布式锁 + 双检 + 短超时 |
| 效果 | N 个并发回源合并为 1 次 |
合并窗口要短(毫秒级):窗口太长会放大单次回源的失败影响;配合超时与降级策略。