当前位置:首页 >专题 >Go 请求合并与缓存防击穿工程实践专题

Go 请求合并与缓存防击穿工程实践专题
Go 请求合并与缓存防击穿

Go 请求合并与缓存防击穿工程实践专题

热点缓存失效时,几十或几百个请求可能同时回源,把数据库和下游接口瞬间推到峰值。本专题围绕 Go 的 singleflight 请求合并机制,串起缓存 miss、结果共享、超时错误、sync.Map 选型、并发扇出和 HTTP 下游保护,帮助开发者把一次性优化落成可观测、可验证的生产方案。

站内实战文章

从缓存 miss 到并发回源、错误传播和下游保护

Go singleflight 怎么合并同一请求:缓存失效时别让 500 个请求一起回源
文章

Go singleflight 怎么合并同一请求:缓存失效时别让 500 个请求一起回源

从热门缓存键失效场景讲清同 key 请求合并、回源边界、多实例限制和上线核对项。
Go singleflight 防缓存击穿实战:相同请求只查一次数据库
文章

Go singleflight 防缓存击穿实战:相同请求只查一次数据库

用商品详情接口演示缓存 miss 后的 singleflight、缓存回填、等待超时和降级兜底。
Go singleflight 实战:别让缓存击穿打爆下游服务
文章

Go singleflight 实战:别让缓存击穿打爆下游服务

围绕 Do、DoChan、shared、Forget、错误传播和上线观测复盘 singleflight 的生产边界。
Go sync.Map 适合热点读缓存吗:读写比例、类型断言与基准测试
文章

Go sync.Map 适合热点读缓存吗:读写比例、类型断言与基准测试

从热点读缓存场景评估 sync.Map 的读写比例、类型断言成本和基准测试方法。
Go errgroup 实战:并发扇出别把错误和取消弄丢
文章

Go errgroup 实战:并发扇出别把错误和取消弄丢

用批量下游调用说明 errgroup 的错误收敛、Context 取消、SetLimit 和结果聚合。
Go HTTP 客户端超时实战:别让默认 Client 拖垮 goroutine
文章

Go HTTP 客户端超时实战:别让默认 Client 拖垮 goroutine

从下游卡死事故讲清 HTTP Client、Transport、Request Context、连接复用和重试边界。

常见问题

请求合并和缓存防击穿最容易混淆的边界

singleflight 能替代分布式锁吗?

不能。singleflight 只在单个进程内合并相同 key 的进行中调用,多实例部署时每个实例仍可能各自回源;跨实例协调需要 Redis 锁、共享缓存或其他分布式方案,并单独评估锁超时和故障边界。

singleflight 能解决缓存穿透和缓存雪崩吗?

它主要解决同一热点 key 在短时间内的重复回源,也就是缓存击穿的一部分。缓存穿透还需要空值缓存或布隆过滤器,缓存雪崩还需要 TTL 抖动、预热、限流和降级等组合措施。

Do 和 DoChan 应该怎么选?

同步等待结果时 Do 更直接;需要通过 select 同时监听请求 context、超时或其他事件时,DoChan 更容易编排。无论选择哪一个,都要保证回源函数本身支持取消或有明确超时。

请求合并的 key 应该怎么设计?

key 必须包含会影响结果的完整业务维度,例如租户、地区、语言和版本;key 太粗会错误共享结果,key 太细又无法合并。建议记录 shared 比例、等待时长和回源错误,结合指标持续校准。

微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码