「有问必答」秒杀系统 Go并发编程实践!

news2024/9/27 19:22:13

有问必答

摘要

本文将介绍如何使用Go语言的并发原语来构建一个简单的高并发秒杀系统。

我们将使用Go语言的原生库和一些常见的技术手段,包括互斥锁、通道、计数器等,来解决并发访问和数据一致性的问题。

本文只是一个简单的示例,重点是Go语言并发原语在业务场景中的应用。

在实际应用中,还需要考虑数据库事务、分布式锁、限流等问题。我之前也写过一篇文章,附在了文末。

1. 引言

秒杀系统是一种高并发场景下的特殊应用,需要处理大量的并发请求和保证数据的一致性。本文将介绍如何使用Go语言的并发原语来构建一个高并发的秒杀系统,以满足用户的需求并保证系统的稳定性。

2. 架构设计

我们的秒杀系统将采用经典的客户端-服务器架构。客户端发送秒杀请求,服务器处理请求并更新库存。为了保证系统的高并发性能,我们将使用以下技术和原语:

  • 互斥锁(sync.Mutex):用于保护共享资源的并发访问。
  • 通道(channel):用于协程间的通讯。
  • 计数器(sync.WaitGroup):用于等待所有请求完成。

3. 实现步骤

下面是我们实现秒杀系统的关键步骤:

3.1 初始化库存

在系统启动时,我们需要初始化商品的库存。

var stock = 100 // 商品库存
var mu sync.Mutex

3.2 处理秒杀请求

当客户端发送秒杀请求时,服务器需要处理请求并更新库存。

func handleRequest(user int) {
    defer wg.Done()
    if tryAcquireLock() {
        if stock > 0 {
            // 执行秒杀逻辑
            stock--
            fmt.Printf("用户%d秒杀成功,剩余库存:%d\n", user, stock)
        } else {
            fmt.Printf("用户%d秒杀失败,库存不足\n", user)
        }
        releaseLock()
    } else {
        fmt.Printf("用户%d未获取到锁,秒杀失败\n", user)
    }
}

3.3 并发控制和等待

为了控制并发请求的数量,我们使用计数器和通道来限制并发度。

var wg sync.WaitGroup

func main() {
    for i := 1; i <= 1000; i++ {
        wg.Add(1)
        go handleRequest(i)
    }
    wg.Wait()
}

3.4 互斥锁和并发安全

为了保证并发访问的安全性,我们使用互斥锁来保护共享资源的访问。

注意:TryLock()是go1.18才引入的

func tryAcquireLock() bool {
    return mu.TryLock()
}

func releaseLock() {
    mu.Unlock()
}

4. 完整代码

package main

import (
 "fmt"
 "sync"
)

//后面开启了1000个goroutine,所以这里channel的缓冲区设置成了1000
var ch = make(chan bool, 1000)

type Product struct {
 sync.Mutex
 stock int64 // 商品库存
}

func main() {
 p := Product{stock: 1000}
 for i := 1; i <= 1000; i++ {
  go p.handleRequest(i)
 }
 <-ch
}

func (p *Product) handleRequest(user int) {
 if p.tryAcquireLock() {
  if p.stock > 0 {
   // 执行秒杀逻辑
   p.stock--
   fmt.Printf("用户%d秒杀成功,剩余库存:%d\n", user, p.stock)
  } else {
   fmt.Printf("用户%d秒杀失败,库存不足\n", user)
  }
  //这里是不可以使用defer的,因为可能会加锁失败,unlock一个不存在的锁
  p.releaseLock()
 } else {
  fmt.Printf("用户%d未获取到锁,秒杀失败\n", user)
 }
}

func (p *Product) tryAcquireLock() bool {
//p.TryLock() 方法用于尝试获取锁,如果成功获取到锁,则相当于执行了 Lock() 操作,即加锁成功。 
 return p.TryLock()
}

func (p *Product) releaseLock() {
 p.Unlock()
 ch <- true
}

解析代码

var ch = make(chan bool, 1000):后面开启了1000个goroutine,所以这里channel的缓冲区设置成了1000

p.releaseLock():这里是不可以使用defer的,因为可能会加锁失败,unlock一个不存在的锁

p.TryLock():方法用于尝试获取锁,如果成功获取到锁,则相当于执行了 Lock() 操作,即加锁成功。

5. 运行结果

6. 总结

通过使用Go语言的并发原语,我们成功地构建了一个高并发的秒杀系统。

使用互斥锁和计数器等原语,我们实现了并发控制、数据一致性和并发安全。这些原语帮助我们解决了高并发场景下的并发访问问题,并保证了系统的稳定性和性能。

本文只是一个简单的示例,实际的秒杀系统可能涉及更多的业务逻辑和并发控制。

在实际应用中,还需要考虑数据库事务、分布式锁、限流等问题。因此,建议根据实际需求和场景进行更详细的设计和实现。

我之前也有写万字长文总结过,感兴趣的朋友欢迎查看:万字详解:秒杀系统设计

一起学习

欢迎大家关注我的账号,你的支持,是我更文的最大动力!

也欢迎关注我的公众号: 程序员升职加薪之旅,领取更多Go学习和面试资料。

微信号:wangzhongyang1993

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

社区新零售:重塑零售业的全新模式

社区新零售&#xff1a;重塑零售业的全新模式 近年来&#xff0c;新零售业成为了研究的焦点&#xff0c;它是一种以互联网为基础的零售形式。新零售通过运用先进技术手段&#xff0c;如大数据和人工智能&#xff0c;对商品的生产、流通和销售过程进行升级改造&#xff0c;重新构…

40.0/jdbc/Java数据连接/jar包运用增删改

目录 40.1. 回顾 40.2. 正文 40.1 为什么需要jdbc 40.2 如何连接mysql数据库 40 .3 jdbc容易出现的错误 40.4 完成删除 40.5 完成修改 40.1. 回顾 1. 自联查询: 自己连接自己的表。注意:一定要为表起别名。 2. 嵌套查询: 把一个查询的结果作为另一个查询的条件值。 3. 组…

一文解决msxml3.dll文件缺失问题,快速修复msxml3.dll

在了解问题之前&#xff0c;我们必须首先清楚msxml3.dll到底是什么。DLL&#xff08;Dynamic Link Libraries&#xff09;文件是Windows操作系统使用的一个重要组成部分&#xff0c;用于存储执行特定操作或任务的代码和数据。msxml3.dll为Windows系统提供处理XML文档的功能。如…

竞赛选题 题目:基于深度学习卷积神经网络的花卉识别 - 深度学习 机器视觉

文章目录 0 前言1 项目背景2 花卉识别的基本原理3 算法实现3.1 预处理3.2 特征提取和选择3.3 分类器设计和决策3.4 卷积神经网络基本原理 4 算法实现4.1 花卉图像数据4.2 模块组成 5 项目执行结果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基…

亚马逊养号的用途?有没有快速养号方法?

亚马逊养号通常是创建多个买家账号来进行浏览、对比等&#xff0c;以下是一些可能的用途&#xff1a; 刷好评&#xff1a;通过养号&#xff0c;可以通过自己的账号给自己或他人的产品发布好评&#xff0c;以提高商品的声誉和销售。 刷销量&#xff1a;通过大量买家账号购买商品…

idea社区版免费下载方式

1.访问中国区网站 下载 IntelliJ IDEA – 领先的 Java 和 Kotlin IDE 2.完成下载安装

Python3.6.8升级Python3.12.0版本小记

Python3.6.8 升级 Python3.12.0版本小记 前言一、查看系统已安装Python的相关信息二、升级Python三、解决问题记录&#xff1a;升级之后cmd查看python版本仍为原版本 叮嘟&#xff01;这里是小啊呜的学习课程资料整理。好记性不如烂笔头&#xff0c;今天也是努力进步的一天。一…

融云筑基,移动云加速构建高性能智能算力底座

自2022年11月以来&#xff0c;全球大模型数量迅速增加&#xff0c;以ChatGPT为代表的大模型已经成为世界数字科技领域新热点。大模型带来的算力需求迅速增长&#xff0c;未来智算场景将会有非常大的突破空间。 在“十四五”规划的指引下&#xff0c;各地政府积极投入智算中心建…

【Qt】QStackedWidget、QRadioButton、QPushButton及布局实现程序首页自动展示功能

效果 在程序启动后&#xff0c;有时不会进入到工作页面&#xff0c;会进入到产品展示页面。 动画如下&#xff1a; 首页展示 页面操作 当不点击时&#xff0c;一秒自动刷新一次&#xff1b;当点击时&#xff0c;会自动跳转到对应页面&#xff1b;点击上一页、下一页、及跳转页…

安防视频监控/视频融合/云存储EasyCVR页面数据显示不全该如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

11.27/28 知识回顾与问题(Django之Web应用与http协议)

一、http有哪些主要版本以及特点 1. 主要版本以及各自特点 HTTP/0.9&#xff1a;最初版本的HTTP协议&#xff0c;只支持GET方法&#xff0c;并且没有请求头和响应头的概念&#xff0c;只能传输纯文本。于1991年发布&#xff0c;由Tim Berners-Lee创建&#xff0c;被认为是HTTP的…

【数据结构复习之路】树和二叉树(严蔚敏版)万字详解主打基础

专栏&#xff1a;数据结构复习之路 复习完上面四章【线性表】【栈和队列】【串】【数组和广义表】&#xff0c;我们接着复习 树和二叉树&#xff0c;这篇文章我写的非常详细且通俗易懂&#xff0c;看完保证会带给你不一样的收获。如果对你有帮助&#xff0c;看在我这么辛苦整理…

RPA机器人如何解决非银企直联网银账户的数据自动采集?

数字时代来临&#xff0c;随着全球信息化水平的不断提升&#xff0c;企业们纷纷向自动化办公、数字化转型靠拢。财务部门作为一个企业的重要部门&#xff0c;承担着管理和监控公司所有项目的重要职责&#xff0c;因而一直被视为企业数字化转型的重要突破口。 由于企业经营理念和…

LeetCode算法题解(动态规划)|LeetCode198. 打家劫舍、LeetCode213. 打家劫舍 II、LeetCode337. 打家劫舍 III

一、LeetCode198. 打家劫舍 题目链接&#xff1a;198. 打家劫舍 题目描述&#xff1a; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的…

基于Webserver的工业数据采集控制

http协议 http简介 HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写&#xff0c;是用于Web Browser&#xff08;浏览器&#xff09;到Web Server&#xff08;服务器&#xff09;进行数据交互的传输协议。 HTTP是应用层协议 HTTP是一个基于…

“AI+量子模拟”突破!英伟达与美国量子技术公司SandboxAQ合作

&#xff08;图片来源&#xff1a;网络&#xff09; 11月20日&#xff0c;美国量子技术公司SandboxAQ在美国加利福尼亚州帕洛阿尔托宣布与美国人工智能计算公司英伟达&#xff08;NVIDIA&#xff09;联手&#xff0c;双方将通过人工智能和量子模拟技术助力药物发现、电池设计、…

Echarts大屏可视化_01 初始化项目+基本布局

资源、源码来自于B站黑马pink老师 让我们一起来学习吧&#xff01;&#xff01;&#xff01; 链接&#xff1a;https://pan.baidu.com/s/1B7jS-8ZWdYabA9JKqFPpRw 提取码&#xff1a;6666 项目演示视频 1.初始化项目 我们的适配方案选择用flex布局rem单位来做。使用flexible…

汽车电子 -- 车载ADAS之RCW(后碰撞预警系统)

国际标准: RCW&#xff1a; GB 4785-2019 汽车及挂车外部照明和光信号装置的安装规定 一、后方碰撞预警系统 RCW&#xff08; Rear Collision Warning &#xff09; 参看&#xff1a;功能定义-后方碰撞预警 RCW 功能可以对自车行驶过程中对后方车辆进行监测&#xff0c;当…

数据结构校招知识点总结

文章目录 前言1. 数据结构概论、算法设计与分析1.1 数据结构三要素&#xff1f;1.2 算法的基本概念&#xff1f;1.3 什么是时间复杂度&#xff1f; 2. 线性表2.1 链表结构和顺序存储结构的区别&#xff1f;2.2 单链表和双链表的区别&#xff1f;2.3 头指针和头结点的区别&#…

日期对象与节点操作

1.日期对象 1.1实例化 // 实例化const date new Date()console.log(date);// 返回指定时间const date1 new Date(2022-5-1 08:30:00)console.log(date1);1.2日期对象方法 1.3时间戳 三种获取时间戳的方法 const date new Date()console.log(date.getTime());console.log(ne…