Golang 缓存击穿解决方案|SingleFlight请求合并

2020年12月14日 0 条评论 1.82k 次阅读 0 人点赞

前言

我们知道电商平台首页有许多数据都来自缓存,请求并不经过数据库,但假设某一时刻大流量访问某商品时,该商品的缓存正好过期就会造成缓存击穿,给数据库造成巨大压力。

解决思路

在面对秒杀等大并发请求的场景,而且这些请求都是读请求时,你可以把这些请求合并为一个请求

很幸运,Golang的扩展并发原语为我们提供了这一个机制。

下载包

直接上代码与效果

我们能看到,只发生了一次缓存穿透。

这里我们主要使用到了 singleflight 包

singleflight

singleflight类的使用方法就新建一个singleflight.Group,使用其方法Do或者DoChan来包装方法,被包装的方法在对于同一个key,只会有一个协程执行,其他协程等待那个协程执行结束后,拿到同样的结果。

介绍如下:

Group结构体

Do方法

  • key:同一个key,同时只有一个协程执行。
  • fn:被包装的函数。
  • v:返回值,即执行的结果。其他等待的协程都会拿到。
  • shared:表示是否有其他协程得到了这个结果v。

DoChan方法

与Do方法一样,只是返回的是一个channel,执行结果会发送到channel中,其他等待的协程都可以从channel中拿到结果

完。

兰陵美酒郁金香

大道至简 Simplicity is the ultimate form of sophistication.

文章评论(0)

你必须 登录 才能发表评论