Go并发原语之SingleFlight

news/2024/9/20 2:27:13/文章来源:https://www.cnblogs.com/beatle-go/p/18354711

引入

如下图所示,可能存在来自桌面端和移动端的用户有 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 也都会接收到同样的错误

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/782911.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

词向量的转换理解以及与真实的关系

实际上就是去除该矩阵的某一行。该矩阵实际上就是一个有N个词的300维向量,或者说该矩阵就是一个完整的词向量词汇表。而这个词汇表是通过交叉熵损失最小来构造的。 即归根到底是“在特定语料库中(包含context中共现概率),以数学方法计算输入产生哪些输出”最复合“实际情况…

盘点国内外有哪些软件测试认证

在软件测试行业,技术实力固然重要,但手握权威认证更能为职业发展增添砝码。无论你是刚入行的新人,还是经验丰富的测试工程师,获取一张含金量高的软件测试认证都能让你的职场之路更加平坦。那么,国内外有哪些值得考取的软件测试认证呢?让我们一起来盘点。 你是否正在为选择…

用友金蝶怎么选

财务知识——用友和金蝶选择谁?

概率论沉思录:合情推理

最近蔻享学术主办了每周一次的《概率论沉思录》读书会活动,恰好我也正在读该书中译版,通过该活动我了解到了不同学科的老师(数学/物理/统计/计算机)对这本书的不同理解,而我自己对该书的理解也在这个过程中逐渐深入了。于是准备每周都持续更新一下我的读书笔记。本书作者是…

八重终结 Phase 4 狱火焚天

Ending Time Octet 【八重终结】 Phase 4 Inferno Combusts 【狱火焚天】 PV on Bilibili Part 1 联合动画 Part 1 Part 2 完整音乐 涉及 AU Murder Time Trio Former Time Trio Karmatic Time Trio Chaotic Time Trio Phase 3 Chaotic Time Trio Phase 4 归冢余妄个人曲 传说之…

【grpcurl】使用grpcurl测试GRPC服务

一、场景由于我们需要访问GRPC服务的方法,便于我们进行测试,所以我们开启了grpc服务的反射机制二、安装grpcurlhttps://github.com/fullstorydev/grpcurlhttps://github.com/fullstorydev/grpcurl/releases 下载对应环境的包即可sudo dpkg -i grpcurl_1.9.1_linux_amd64.debu…

windbg 搭建双机调试环境

当我们搭建好驱动开发环境后,就可以设置双机调试了,虚拟机的安装可以参考网上其他教程,比较简单,我们直接来讲设置双击调试需要注意的一些地方。 1.设置被调试的虚拟机 首先,将虚拟机关机,如果此时已经有了串行端口存在首先移除,管道名字输入 \\.\pipe\com_1,并选择“该…

windbg 搭建双击调试环境

当我们搭建好驱动开发环境后,就可以设置双机调试了,虚拟机的安装可以参考网上其他教程,比较简单,我们直接来讲设置双击调试需要注意的一些地方。 1.设置被调试的虚拟机 首先,将虚拟机关机,如果此时已经有了串行端口存在首先移除,管道名字输入 \\.\pipe\com_1,并选择“该…

NDT算法详解与C++实现

点云匹配在感知环节是一个很重要的信息获取手段,而其中的算法也有几个比较经典了,例如ICP(Iterative Closest Point,迭代最近点)算法,而本文决定记录学习的是NDT算法,也就是Normal Distribution Transform,正态分布变换算法。什么是正态分布变换算法呢,简言之,就是把…

HBase学习的第一天--hbase的简介和搭建

HBase架构与基础命令 一、了解HBase 1.1 HBase概述HBase是基于Hadoop中HDFS做存储的数据库HBase 是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,用于存储海量的结构化或者半结构化,非结构化的数据(底层是字节数组做存储的) HBase是Hadoop的生态系统之一,是建立…

实景三维:解锁地理信息新维度,引领未来城市智慧之钥

在这个信息爆炸与科技日新月异的时代,地理信息与遥感技术正以前所未有的速度改变我们认知世界的方式。在推动“实景三维平台”这一前沿科技的构建上,它不仅是地理信息的立体呈现,更是智慧城市的基石,打开了通往未来城市规划、管理、决策与服务的新视界。实景三维平台:数字…

【Linux系列】内核参数

sysctl命令常用参数 RAID性能参数调优 网络协议栈调整:单位是字节 TCP并发性能优化 对于用不上IPV6的建议直接禁用 TCP keepalive时长控制 memory OOM控制 安全防护模块 保障TCP通信质量 IO密集性服务器优化参数 路由器选项控制 路由机制控制 内存大页面使用策略内核参数主要保…