首页/数据/数据库速查/请求合并 / 单飞(singleflight)
Redis 运维与场景124 条

请求合并 / 单飞(singleflight)

同一键的并发回源合并为一个:进程内 singleflight 或分布式锁版本;是击穿与穿透场景之外的通用减负手段。

数据库速查数据更新于 2026-10-12

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 次
合并窗口要短(毫秒级):窗口太长会放大单次回源的失败影响;配合超时与降级策略。

易错点

  • 合并 key 设计错误:不同用户被合并(key 必须含全部查询参数)
  • 没有超时控制:一个慢回源拖住所有合并请求

数据来源与参考

  • Redis 官方文档: 缓存模式
  • singleflight 库文档

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌