原文链接:golang 并发demo 写入 redis

源代码:

package mainimport ("fmt""runtime""strconv""time""gopkg.in/redis.v3"
)var (jobnum = runtime.NumCPU()//每次写入redis的数量//除以 jobnum 为了保证改变了任务数, 总量不变, 便于测试procnum = 100000 / jobnum
)type Job struct {ID     stringClient *redis.ClientResult chan<- string
}func waitJobs(dones <-chan struct{}, results chan string) {working := jobnumdone := falsefor {select {case result := <-results:println(result)case <-dones:working--if working <= 0 {done = true}default:if done {return}}}
}func initClient(poolSize int) *redis.Client {client := redis.NewClient(&redis.Options{Addr:         "localhost:6379",DialTimeout:  time.Second,ReadTimeout:  time.Second,WriteTimeout: time.Second,PoolSize:     poolSize,Password:     "123.com",DB:           0,})if err := client.FlushDb().Err(); err != nil {panic(err)}return client
}func main() {start := time.Now()fmt.Println("start:", start)defer func() {end := time.Now()fmt.Println("end:", end)fmt.Println("jobs num:", jobnum, "total items:", jobnum*procnum)fmt.Println("total seconds:", end.Sub(start).Seconds())}()//任务channel 定义缓冲器为job数量jobs := make(chan Job, jobnum)//存放结果results := make(chan string, jobnum*procnum)//每个任务完成之后给dones发送一次dones := make(chan struct{}, jobnum)client := initClient(10)defer client.Close()//定义每个任务执行的方法jobfunc := func(client *redis.Client, id string) (string, error) {defer func() {//完成之后向 dones 发送数据dones <- struct{}{}//fmt.Println("job id:", id, "完成")
        }()//写入 procnum 条数据for idx := 0; idx < procnum; idx++ {key := id + "-" + strconv.Itoa(idx)_, err := client.Set(key, time.Now().String(), 0).Result()if err != nil {return "", err}//fmt.Println("key:", key, " | result:", val, " | error:", err)
        }return "ok", nil}//1 添加 job 到 channel
    go func() {for index := 0; index < jobnum; index++ {jobs <- Job{strconv.Itoa(index), client, results}}defer close(jobs)}()//2 并行执行 jobsfor j := range jobs {go func(job Job) {jobfunc(client, job.ID)job.Result <- "ok"}(j)}//3 等待所有任务完成
    waitJobs(dones, results)
}

运行结果:

[root@localhost 111]# go run redis.go
start: 2019-09-24 08:26:34.614166323 +0000 UTC m=+0.001802059
ok
ok
ok
ok
ok
ok
ok
ok
end: 2019-09-24 08:26:35.655656884 +0000 UTC m=+1.043292369
jobs num: 8 total items: 100000
total seconds: 1.04149031

8 个 goroutine: 1s 完成10w数据写入

转载于:https://www.cnblogs.com/wangjq19920210/p/11579059.html

golang 并发demo 写入 redis相关推荐

  1. 数据库并发入门学习笔记,怎么写入redis的数据,配置缓存。

    一切都是为了吹牛逼. 1. 高并发的设计思路 简单理解为服务器能抗住多少用户访问量. 普通笔记本支持100个并发量,很明显学校的访问都扛不住. 大量用户访问时,数据库压力过大容易崩溃,考虑中间做一个r ...

  2. 在Golang开发中使用Redis

    周五上班的主要任务是在公司老平台上用redis处理一个队列问题,顺便复习了一下redis操作的基础知识,回来后就想着在自己的博客demo里,用redis来优化一些使用场景,学习一下golang开发下r ...

  3. ​Golang 并发编程指南

    分享 Golang 并发基础库,扩展以及三方库的一些常见问题.使用介绍和技巧,以及对一些并发库的选择和优化探讨. go 原生/扩展库 提倡的原则 不要通过共享内存进行通信;相反,通过通信来共享内存. ...

  4. Golang并发模型:轻松入门流水线FAN模式

    前一篇文章<Golang并发模型:轻松入门流水线模型>,介绍了流水线模型的概念,这篇文章是流水线模型进阶,介绍FAN-IN和FAN-OUT,FAN模式可以让我们的流水线模型更好的利用Gol ...

  5. 高并发简单解决方案————redis队列缓存+mysql 批量入库(ThinkPhP)

    源码地址:https://github.com/Tinywan/PHP_Experience 问题分析 问题一:要求日志最好入库:但是,直接入库mysql确实扛不住,批量入库没有问题,done.[批量 ...

  6. Golang并发模型:轻松入门协程池

    goroutine是非常轻量的,不会暂用太多资源,基本上有多少任务,我们可以开多少goroutine去处理.但有时候,我们还是想控制一下. 比如,我们有A.B两类工作,不想把太多资源花费在B类务上,而 ...

  7. 4种Golang并发操作中常见的死锁情形

    摘要:什么是死锁,在Go的协程里面死锁通常就是永久阻塞了,你拿着我的东西,要我先给你然后再给我,我拿着你的东西又让你先给我,不然就不给你.我俩都这么想,这事就解决不了了. 本文分享自华为云社区< ...

  8. Golang并发:再也不愁选channel还是选锁

    周末又到了,为大家准备了一份实用干货:如何使用channel和Mutex解决并发问题,利用周末的好时光,配上音乐,思考一下吧?. 来,问自己个问题:面对并发问题,是用channel解决,还是用Mute ...

  9. golang并发编程之Ticker

    golang并发编程之Ticker Timer只执行一次,Ticker可以周期的执行 icker是一个定时触发的计时器 它会以一个间隔(interval)往channel发送一个事件(当前时间) 而c ...

最新文章

  1. UML基础教程(内部使用教程) 非常不错的ppt!!强烈推荐
  2. msb Lesson00_Object_Class.scala
  3. Android 控件之RatingBar评分条(五星)自定义样式
  4. 《统计学习方法》P59决策树绘制-sklearn版本
  5. CUBA平台–新的Java企业应用程序框架
  6. matplotlib绘制饼状图
  7. [NodeJs] 如何使用nodejs对base64进行编解码?
  8. empty怎么发音_empty是什么意思
  9. Recommender Systems协同过滤
  10. 合并报表软件系统_报表难题统统扫除!
  11. 计算机ppt制作培训心得,学习ppt制作体会
  12. 【渝粤题库】陕西师范大学200941小学数学教学论 作业(高起专)
  13. 利用POI将PPT转换为图片
  14. 法国在华企业名单,坚决抵制!
  15. mac上手总结~瞎玩玩
  16. iframe 、frameset 、frame的区别
  17. 【逐函数讲解ORB_SLAM2源码】4.计算umax
  18. 微软CEO鲍尔默失策太多次 应只拿1美元年薪
  19. python 加密解密之 -- unzip数据
  20. 深度学习之自编码器(5)VAE图片生成实战

热门文章

  1. NANUI能否运行在linux,Nanui 项目示例
  2. 不能将参数转化为lparam_反渗透纯水机是将自来水直接转化为超纯水的装置
  3. python3字典列表_python3入门(3)---列表、元组、字典、集合详解
  4. java接口配置文件_Java读取property配置文件,另接口的配置
  5. 不规则图形数格子的方法_小学数学,怎么数平面图形中长方形与正方形个数
  6. java2第九章的总结_java并发的艺术-读书笔记-第九章线程池
  7. java中sql去除游标_java.sql.SQLException:-ORA-01000:已超过最大打开游标
  8. 分区供水条件口诀_经典口诀2020年一建市政管道篇
  9. 喜马拉雅xm格式转化mp3_怎样让mp3录音转文字?
  10. vue中向数组去重_「前端剑指offer第3期」来,手写一下数组去重