学习笔记 | 使用增强版 singleflight 合并事件推送,效果炸裂

简介: 学习笔记 | 使用增强版 singleflight 合并事件推送,效果炸裂

go01.jpeg

https://mp.weixin.qq.com/s/KUkzHS4Yfad3l_CnU49lLg

singleflight 是什么

singleflight 直接翻译为"单(次)飞(行)"

举个例子,当程序中有读(如 Redis、MySQL、Http、RPC等)请求,且并发非常高的情况,使用 singleflight 能得到比较好的效果,它限制了同一时刻只有一个请求在执行,也就是并发永远为1

singleflight 的原理

将整个代码分成三块:

① 懒加载方式初始化 map;

② 如果当前 key 存在,即相同请求正在调用中,就等它完成,完成后直接使用它的 value 和 error;

③ 如果当前 key 不存在,即没有相同请求正在调用中,就创建一个 call 对象,并把它放进 map,接着执行 fn 函数,当函数执行完唤醒 waitGroup,并删除 map 相应的 key,返回 value 和 error

读可以抑制,写呢?

增强代码参考

package singleflight


import(

"sync"

)


type WriteGroup struct{

mu    sync.Mutex

wgs   map[string]*sync.WaitGroup

group Group

}


func(g *WriteGroup)Do(key string, fn func()error)error{

g.mu.Lock()

if g.wgs ==nil{

 g.wgs =make(map[string]*sync.WaitGroup)

}

wg, ok := g.wgs[key]

if!ok {

 wg =&sync.WaitGroup{}

 wg.Add(1)

 g.wgs[key]= wg

}

g.mu.Unlock()


if!ok {

 err :=fn()


 g.mu.Lock()

 wg.Done()

 delete(g.wgs, key)

 g.mu.Unlock()

 return err

}


wg.Wait()

_, err := g.group.Do(key,func()(interface{},error){

 returnnil,fn()

})

return err

}

目录
相关文章
|
9月前
|
Java API 数据处理
深潜数据海洋:Java文件读写全面解析与实战指南
通过本文的详细解析与实战示例,您可以系统地掌握Java中各种文件读写操作,从基本的读写到高效的NIO操作,再到文件复制、移动和删除。希望这些内容能够帮助您在实际项目中处理文件数据,提高开发效率和代码质量。
204 4
|
10月前
|
移动开发 前端开发 JavaScript
React 视频播放器组件:Video Player
本文介绍了如何使用 React 和 HTML5 `<video>` 标签构建自定义视频播放器组件。首先,通过创建基础的 React 项目和 VideoPlayer 组件,实现了基本的播放、暂停功能。接着,探讨了常见问题如视频加载失败、控制条样式不一致、性能优化不足及状态管理混乱,并提供了相应的解决方案。最后,总结了构建高效视频播放器的关键要点,帮助开发者应对实际开发中的挑战。
853 27
|
监控 安全 物联网
在使用物联网卡过程中的一些限制
在使用物联网卡(IoT卡)的过程中,确实存在一些限制和注意事项,这些限制主要来源于技术、安全、法规以及服务提供商的政策等多个方面。以下是一些常见的限制及操作建议:
|
消息中间件 运维 Kubernetes
工作中用Go: Go中异步任务怎么写
工作中用Go: Go中异步任务怎么写
3603 0
工作中用Go: Go中异步任务怎么写
|
缓存 NoSQL Java
一次访问Redis延时高问题排查与总结
作者抽丝剥茧的记录了一次访问Redis延时高问题的排查和总结。
|
存储 缓存 NoSQL
数据缓存,可以尝试用RocksDB了
`shigen`,一个专注于Java、Python、Vue和Shell的博主,探讨了为何在学习阿里云DRM产品时选择RocksDB而非Redis或Guava。RocksDB是一个高速、可配置的存储系统,适用于Flash和HDFS,支持数据压缩。与Redis相比,RocksDB在高速存储和灵活性上更具优势。在尝试使用RocksDB与SpringBoot集成时遇到问题,目前尚未解决。他还对比了RocksDB、Redis和Guava Cache的特性,强调RocksDB适合大规模、高性能场景,而Redis适合内存存储和实时性需求。
343 0
数据缓存,可以尝试用RocksDB了
|
编译器 C++ 开发者
【C++ 泛型编程 进阶篇】:用std::integral_constant和std::is_*系列深入理解模板元编程(二)
【C++ 泛型编程 进阶篇】:用std::integral_constant和std::is_*系列深入理解模板元编程
486 1
|
SQL 存储 NoSQL
SpringBoot整合MongoDB
SpringBoot整合MongoDB
6249 0
SpringBoot整合MongoDB
|
存储 缓存 NoSQL
顶会论文解读|DEPART:分布式KV存储系统的副本解耦方案(1)
顶会论文解读|DEPART:分布式KV存储系统的副本解耦方案
343 0
|
JSON Go 数据处理
JSON数据处理:匿名结构体助你起飞
JSON数据处理:匿名结构体助你起飞
272 0