缓存击穿了怎么办?使用singleflight轻松解决!

本文介绍了缓存击穿问题及其对后端数据库的影响,重点探讨了Go语言中的singleflight库如何有效地解决这个问题。通过分析singleflight的使用场景、简介、方法以及工作原理,展示其在防止并发重复请求和优化资源获取中的作用。
摘要由CSDN通过智能技术生成

singleflight使用场景

  1. 缓存击穿:缓存在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。
    • 绝大多数公司都是这么用的
  2. 请求资源去重复
    • 我们的用法,需要改动一行代码。

singleflight 简介

singleflightgolang.org/x/sync/singleflight 项目下,对外提供了以下几个方法

//Do方法,传入key,以及回调函数,如果key相同,fn方法只会执行一次,同步等待
//返回值v:表示fn执行结果
//返回值err:表示fn的返回的err
//返回值shared:表示是否是真实fn返回的还是从保存的map[key]返回的,也就是共享的
func (g *Group) Do(key string, fn func() (interface{}, error)) (v interface{}, err error, shared bool) {
//DoChan方法类似Do方法,只是返回的是一个chan
func (g *Group) DoChan(key string, fn func() (interface{}, error)) <-chan Result {
//设计Forget 控制key关联的值是否失效,默认以上两个方法只要fn方法执行完成后,内部维护的fn的值也删除(即并发结束后就失效了)
func (g *Group) Forget(key string) 

singleflight的使用

从singleflight的test探寻最简单用法

func TestDo(t *testing.T) {
   
    var g Group
    // key 可以理解资源的id
    v, err, _ := g.Do("key", func() (interface{
   }, error) {
   
    // do what you want
        return "bar", nil
    })
    if got, want := fmt.Sprintf("%v (%T)", v, v), "bar (string)"; got != want {
   
        t.Errorf("Do = %v; want %v", got, want)
    }
    if err != nil {
   
        t.Errorf("Do error = %v", err)
    }
}

验证并发重复请求

func process(g *Group, t *testing.T, ch chan 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值