首页 > 其他分享 >Go并发原语之SingleFlight

Go并发原语之SingleFlight

时间:2024-08-12 20:28:33浏览次数:7  
标签:调用 请求 数据库 并发 原语 缓存 Go SingleFlight 函数

引入

如下图所示,可能存在来自桌面端和移动端的用户有 1000 的并发请求,同一时刻来访问的获取文章列表的接口,获取前 20 条信息,如果这时服务直接去访问 redis 出现 cache miss, 那就会去请求 1000 次数据库,这时可能会给数据库带来较大的压力(这里的1000 只是一个例子,实际上可能远大于这个值)导致服务异常或者超时。

 这时就可以使用singleflight库了,直译过来就是单飞

实际开发中常见的做法是在查数据库前先去查缓存,如果缓存Miss(未命中)就去数据库中查到数据并放到缓存里。这是正常情况,然而缓存击穿则是指在高并发系统中,大量请求同时查询一个缓存的key,假如这个key刚好过期就会导致大量的请求都打到数据库上。在绝大多数情况下,可以考虑使用singleflight来抑制重复函数调用。

SingleFlight的作用是在处理多个goroutine同时调用同一个函数的时候,只让一个goroutine去实际调用这个函数,等到这个goroutine返回结果的时,再把结果返回给其他几个同时调用了相同函数的goroutine,这样可以减少并发调用的数量。

如果在某些场景下允许第一个调用失败后再次尝试调用该函数,而不希望同一时间内的多次请求都因第一个调用返回失败而失败,那么可以通过调用Forget方法来忘记这个key。

源码剖析

Group 是 singleflight 的核心,代表一个组,用于执行具有重复抑制的工作单元。

type Group struct {
    mu sync.Mutex       
    m  map[string]*call
}

SingleFlight 是使用互斥锁 Mutex 和 Map 来实现的。互斥锁 Mutex 提供并发时的读写保护,而 Map 用于保存同一个 key 正在处理的请求。

主要作用是合并并发请求的场景,针对于同一时刻相同的读请求。

而对于并发写请求的场景,如果是多次写只需要一次的情况,那么也是满足的。例如:每个 http 请求都会携带 token,每次请求都需要把 token 存入缓存或者写入数据库,如果多次并发请求同时进来,只需要写一次即可。

https://www.jb51.net/jiaoben/307907bv2.htm

特点

总结

  • Do和DoChan 一个用于同步阻塞调用传入的函数,一个用于异步调用传入的参数并通过 Channel 接收函数的返回值
  • Forget可以通知 Group 在持有的映射表中删除某个键,接下来对该键的调用就不会等待前面的函数返回了
  • 一旦调用的函数返回了错误,所有在等待的 Goroutine 也都会接收到同样的错误

 

标签:调用,请求,数据库,并发,原语,缓存,Go,SingleFlight,函数
From: https://www.cnblogs.com/beatle-go/p/18354711

相关文章

  • 你敢相信,我5分钟做了模式植物的GO和KEGG富集分析,并创建了orgDb数据库
    原文教程:我5分钟做了模式植物的GO和KEGG富集分析,并创建了orgDb数据库一边学习,一边总结,一边分享!本期教程获得本教程DataandCode,请在后台回复:20240811。2022年教程总汇2023年教程总汇写在前面我们在前面的教程分享了模式植物构建orgDb数据库|以org.Slycompe......
  • 从AlphaGo到AlphaPong:AI乒乓球机器人将如何改变乒乓球竞技?
    在人工智能领域,谷歌DeepMind的AlphaGo曾以其超凡的围棋能力震惊了世界。而如今,DeepMind又将其技术延伸到了乒乓球领域,推出了乒乓球机器人,被网友戏称为“AlphaPong”。这一机器人使用ABB的IRB1100机械手臂,能够与普通人进行激烈的乒乓对抗。那么,中国在乒乓球领域的传统优势是......
  • How to change the google translate voice to male All In One
    HowtochangethegoogletranslatevoicetomaleAllInOneTL;DR:Thereisnowaytodothatfornow./Thereiscurrentlynowaytodothis.https://support.google.com/translate/thread/2017149/is-there-a-male-voice-for-google-translator-where-can-i-s......
  • 计算机毕业设计django+vue代驾服务【开题+论文+程序】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着城市化进程的加速和汽车保有量的持续增长,代驾服务作为一种便捷、安全的出行方式,逐渐受到广大消费者的青睐。然而,传统的代驾服务模式往......
  • 计算机毕业设计django+vue民宿预定管理系统625l0【开题+论文+程序】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网技术的迅猛发展和旅游业的不断壮大,民宿作为旅游住宿的重要组成部分,其市场需求日益增加。然而,传统的民宿管理方式已难以满足日益......
  • Django 解除跨域限制
    Django解除跨域限制在Web开发中,跨域资源共享(CORS)是一个重要的安全特性,它限制了网页只能与其同源的服务器进行交互。然而,在开发过程中,我们经常需要前端(如Vue.js、React等)与后端(如Django)之间进行跨域请求。为了方便开发和测试,我们需要在Django中解除跨域限制。本文将详细介绍如何......
  • 基于django+vue基于web的园区车辆出入管理系统【开题报告+程序+论文】计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着城市化进程的加快,各类产业园区、住宅小区及商业综合体等园区规模不断扩大,车辆管理成为园区管理中的重要环节。传统的车辆出入管理方式......
  • 三十分钟入门基础Go(Java小子版)
    前言Go语言定义Go(又称Golang)是Google的RobertGriesemer,RobPike及KenThompson开发的一种静态、强类型、编译型语言。Go语言语法与C相近,但功能上有:内存安全,GC,结构形态及CSP-style并发计算。适用范围本篇文章适用于学习过其他面向对象语言(Java、Php),但没有学过......
  • Django项目与Vue的集成
    Django项目与Vue的集成在现代Web开发领域,前后端分离已成为一种主流趋势。Django,作为一个强大的PythonWeb框架,以其丰富的功能和高度的可扩展性而受到开发者的青睐。而Vue.js,作为一个轻量级的渐进式JavaScript框架,以其简洁的API和灵活的组件系统成为前端开发的热门选择。将Django......
  • 159.302 The 8-Puzzle: Search Algorithms
    159.302ArtificialIntelligenceAssignment#1The8-Puzzle:SearchAlgorithmsMaximumnumberofmemberspergroup:3studentsDeadlineforsubmission:9thofSeptemberInstructionsYourtaskistowriteaC++programthatwillsolvethe8-puzzleprob......