golang数据聚合的优雅操作

场景:

需要将上传的数据进行特性分组之后再进行数据库批量插入或流向下一个处理方法。

痛点:

由于数据不确定性做聚合操作之后会有多组数据需要缓存,如果多协程进行操作需要将缓存数据进行加锁,容易造成数据死锁。

解决:

通过管道和select进行数据传递,同时在select中做缓存的所有操作,在给定条件流向下一个处理方法时通过channel传递过去同时清空对应缓存,
这样操作都在select中不会有竞争发生。

具体方法:

1.创建缓存
2.创建select处理缓存数据流过来的通道
3.在select中缓存数据同时聚合数据,之后判断是否流向下一通道
4.创建worker处理聚合后数据

样例

package mainimport ("fmt""math/rand""time"
)type Data struct {Id    intValue interface{}
}func main() {execCacheCount := 50workerCount := 10c := make(chan Data)stream := make(chan map[int][]Data)go func() {cache := map[int][]Data{}for {select {case data := <-c:cacheData, exist := cache[data.Id]if exist {cacheData = append(cacheData, data)} else {cacheData = []Data{data}}cache[data.Id] = cacheDataif len(cacheData) >= execCacheCount {stream <- cachecache = map[int][]Data{}}}}}()for i := 0; i < workerCount; i++ {go func() {for {select {case data := <-stream:for key, value := range data {fmt.Println("key:", key, "values:", value)}}}}()}for {r := rand.New(rand.NewSource(time.Now().UnixNano()))data := Data{Id:    r.Intn(10),Value: r.Intn(20),}c <- datatime.Sleep(20 * time.Millisecond)}
}

golang数据聚合的优雅操作相关推荐

  1. 利用python进行数据分析——使用groupby机制对pandas对象类的数据进行聚合与分组操作

    文章目录 数据聚合与分组操作 一.GroupBy机制 1.1遍历各分组 1.2选取一列或所有列的子集 1.3 通过字典或Series进行分组 1.4 通过函数进行分组 1.5根据索引层级分组 二. 数 ...

  2. pandas数据聚合与分组

    前言 数据聚合于分组操作在众多的关系型或非关系型库中都有涉及,大体原理都是类似,根据某个或者多个业务字段将获取到的数据进行聚合操作或者分组操作,pandas提供了非常友好的分组聚合功能,可以方便使用人 ...

  3. 品达物流TMS项目_第6章 数据聚合服务开发(pd-aggregation)

    品达物流TMS项目_第6章 数据聚合服务开发(pd-aggregation) 文章目录 品达物流TMS项目_第6章 数据聚合服务开发(pd-aggregation) 第6章 数据聚合服务开发(pd-a ...

  4. Java物流项目第五天 数据聚合服务开发(pd-aggregation)

    品达物流TMS项目 第6章 数据聚合服务开发(pd-aggregation) 1. Canal概述 canal译意为水道/管道,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费. ...

  5. php数据group去重,MongoDB_Mongodb聚合函数count、distinct、group如何实现数据聚合操作, 上篇文章给大家介绍了Mong - phpStudy...

    Mongodb聚合函数count.distinct.group如何实现数据聚合操作 上篇文章给大家介绍了Mongodb中MapReduce实现数据聚合方法详解,我们提到过Mongodb中进行数据聚合操 ...

  6. MongoDB(6)数据聚合 amp;amp; 管道操作

    MongoDB 入门专栏 http://blog.csdn.net/column/details/19681.html 管道操作 mongodb 的数据聚合过程通常会配合管道操作,mongodb 的管 ...

  7. 如何做服务编排/数据聚合?(使用Goku API Gateway实现)

    什么是服务编排/数据聚合? 服务编排/数据聚合 指的是可以通过一个请求来依次调用多个微服务,并对每个服务的返回结果做数据处理,最终整合成一个大的结果返回给前端. 例如一个服务是"查询用户预定 ...

  8. pandas dataframe数据聚合groupby、agg、privot基于sum统计详解及实例

    pandas dataframe数据聚合groupby.agg.privot基于sum统计详解及实例 知道了sum.那么min.max.mean.median都是举一反三的事情了. 在日常的数据分析中 ...

  9. mysql 分组排序_Python、PowerBI、Excel、MySQL,都能做?搞清楚数据聚合与分箱

    阅读提示 本内容为日常频繁使用的数据处理操作,不涉及底层技术问题,烦请爱钻牛角的杠精绕行. 本内容尽量简单直白.步骤详细,适合数据分析入门.特别喜欢技术语言的大佬们,可自行跳过. 上一篇:数据更新删除 ...

最新文章

  1. 搜索:广搜 词语阶梯
  2. 轮播图js怎么设置图片自适应大小
  3. pcb结构链表_lwip中tcp_pcb结构体及其组成链表
  4. t4b代码生成_用T4模板实现简单的代码生成器
  5. python进行usb通讯_Python实现树莓派USB串口通讯
  6. 关于android 双击事件
  7. 一级指针,二级指针,指向数组的指针
  8. 【Flink】did not rea ct to cancelling signal for 30 seconds, but is stuck No implementation was bound
  9. mysql install语句_MySQL入门学习(一)安装与基本操作
  10. 运行通达信行情接口软件的电脑需要什么配置?
  11. 微信小程序官方示例文档免费下载文档
  12. 解构2019世界人工智能大会:三大变化,十年趋势,一场地球与火星的碰撞
  13. 百度地图坐标系统解析
  14. cocos creator pc web端 全屏
  15. 大数据练习环境部署(3) - Hadoop集群部署
  16. Android开发AndroidStudio与eclipse安装与使用
  17. 十七、网上商城项目(3)
  18. react 发post请求 通过a标签 下载pdf文档
  19. 计算机读不了硬盘分区,一分钟告诉你硬盘要不要分区,为什么
  20. 微信公众平台的TOKEN安全验证

热门文章

  1. 电脑桌面云便签怎么设置延时提醒便签事项?
  2. 易语言 access 查询_手机资讯:如何查询送修的 iPhone 维修状态
  3. Windows server 2012 CA认证
  4. chrome 27 中文离线安装包下载
  5. idea怎么让相同的目录名重叠起来
  6. C语言之fileno函数
  7. BATJ大厂测试人员必知的经典性能问题
  8. Android 备份短信
  9. Cesium Render渲染(3):VBO(Buffer缓冲区),VAO(VBO的封装)和FBO(帧缓冲区)
  10. Linux设备驱动之SPI驱动