什么是单飞?
什么是单飞?
提示
题眼: 防击穿。
singleflight 提供了一种抑制重复调用的机制。多个 goroutine 在同一时刻请求同一个 key 时,只会有一个 goroutine 真正执行目标函数,其他 goroutine 等待结果复用即可。
它最常见的使用场景是防止缓存击穿。
缓存击穿指的是:某个热点 key 恰好过期,在这个瞬间又有大量并发请求同时到来,结果所有请求都绕过缓存直接打到数据库,导致后端压力骤增。
singleflight.Group 常用的三个方法如下:
Do:同步调用。相同 key 的并发请求只会执行一次函数,其余请求等待结果。DoChan:异步版调用,返回一个通道用于接收执行结果。Forget:删除指定 key 的去重记录,让后续请求重新发起调用。
重要
参考答案:
单飞可以理解成“同一个时刻、同一个 key,只让一个请求真正落到后端”。其他同时到来的请求不用各自再查一遍,而是等第一个请求执行完成后直接复用它的结果。
Go 里对应的工具就是 singleflight。它最常用的是 Do 方法,传入一个 key 和一个函数后,相同 key 的并发调用会自动合并,只保留一次真实执行。这样在热点缓存失效时,可以明显减少数据库或下游服务的瞬时压力。
DoChan 适合用在异步监听结果的场景,Forget 则适合在特殊情况下手动清理某个 key 的状态,让它下一次重新执行。
它非常适合防缓存击穿,但也不是所有接口都值得上单飞。只有那些热点明显、下游成本高、并发量大的接口,用它的收益才更明显。
