C#队列Queue实现一个简单的电商网站秒杀程序
电商的秒杀和抢购,对程序员来说,都不是一个陌生的东西。然而,从技术的角度来说,这对于Web系统是一个巨大的考验。当一个Web系统,在一秒钟内收到数以万计甚至更多请求时,系统的优化和稳定至关重要。
我们直接将请求放入队列Queue中的,采用FIFO(First Input First Output,先进先出),这样的话,我们就不会导致某些请求永远获取不到锁。这里有点强行将多线程变成单线程的感觉。
秒杀看似简单,但是可能会存在两个问题:高并发和超卖
高并发:比较火秒杀活动同时参与秒杀人数都是10w+的,如此之高的秒杀人数对于网站架构从前到后都是一种考验。
超卖:秒杀商品都会有固定的数量,如何避免成功下订单买到商品的人数不超过商品数量的上限,这是每个抢购活动都要面临的一大难题。
此代码简单说明问题,例如有10万个人秒杀10个商品,我们定义队列queueAll 存放并发的10万人,queueCur存放已经抢到的10个人
private static int cnt =10;
private static Queue<string> queueAll = new Queue<string>();
private static Queue<string> queueCur = new Queue<string>();
购买代码
public RetData Buy(string uid)
{
queueAll.Enqueue(uid); if (queueAll.Count > cnt){
return new RetData {Code = -1, Msg = "商品抢光了", Cnt = 0};
}
queueCur.Enqueue(uid);
return new RetData { Code = 1, Msg = "恭喜已抢到", Cnt = cnt - queueAll.Count };
}
public class RetData
{
public int Code { get; set; }
public string Msg { get; set; }
public int Cnt { get; set; }
}
处理订单
public static void HandleQueue()
{
Task.Factory.StartNew(() =>
{
while (true) if (queueCur.Count > 0) HandleOrder();
});
} public static void HandleOrder()
{
while (queueCur.Count != 0)
{
Console.WriteLine("处理用户订单中:" + queueCur.Dequeue());
}
}
Parallel模拟10万用户并发请求
var tt = new ThreadPar();
Parallel.For(0, 100000, (t, state) =>
{
var uid = "用户" + t;
var x = tt.Buy(uid);
if (x.Code == -1)
{
Console.WriteLine(uid + ":" + x.Msg);
//state.Break();
}
else
Console.WriteLine(uid + ":" + x.Msg + "还剩下:" + x.Cnt + "件");
});
处理中,由于数据太多看不到谁抢到了商品,后面注释了抢不到的输出


用户0、1、75000、50000、50001、50002 、50003 、50004、25000、75001 这10位抢到了商品,其他人都没有抢到,
全部代码示例:
public class ThreadPar
{
private static int cnt =;
private static Queue<string> queueAll = new Queue<string>();
private static Queue<string> queueCur = new Queue<string>();
//private static object ol = new object(); static ThreadPar()
{
HandleQueue();
} public RetData Buy(string uid)
{
queueAll.Enqueue(uid); if (queueAll.Count > cnt){
return new RetData {Code = -, Msg = "商品抢光了", Cnt = };
}
queueCur.Enqueue(uid);
return new RetData { Code = , Msg = "恭喜已抢到", Cnt = cnt - queueAll.Count };
}
public class RetData
{
public int Code { get; set; }
public string Msg { get; set; }
public int Cnt { get; set; }
}
public static void HandleQueue()
{
Task.Factory.StartNew(() =>
{
while (true) if (queueCur.Count > ) HandleOrder();
});
} public static void HandleOrder()
{
while (queueCur.Count != )
{
Console.WriteLine("处理用户订单中:" + queueCur.Dequeue());
}
} }
class Program
{
static void Main()
{
ThreadBuy(); Console.WriteLine("----------操作完成----------");
Console.ReadKey();
} //秒杀
static void ThreadBuy()
{
System.Threading.Thread.Sleep();
var tt = new ThreadPar();
Parallel.For(, , (t, state) =>
{
var uid = "用户" + t;
var x = tt.Buy(uid);
if (x.Code == -)
{
Console.WriteLine(uid + ":" + x.Msg);
//state.Break();
}
else
{
Console.WriteLine(uid + ":" + x.Msg + "还剩下:" + x.Cnt + "件");
} }); } }
控制台程序
C#队列Queue实现一个简单的电商网站秒杀程序的更多相关文章
- 使用队列queue实现一个简单的生产者消费者模型
一.生产者消费者模型 我们去超市商店等地购买商品时,我们大部分人都会说自己是消费者,而超市的各大供货商.工厂等,自然而然地也就成了我们的生产者.如此一来,生产者有了,消费者也有了,那么将二者联系起来的 ...
- 用JS做一个简单的电商产品放大镜功能
使用js制作一个简单的产品放大图 购物网站的产品页经常会放有一个产品展示图区.该图区有一个功能就是产品图的放大功能,移动左侧的焦点区域,可以放大细节部分观看,详情如下图.实现该功能的方法也非常简单. ...
- PHP大型电商网站秒杀思路
秒杀/抢购 技术:高可用,高并发 市场:用户体验,曝光度,促销 秒杀放单独服务器,这样即使崩溃不影响网站其他功能. 高可用:双活. 高并发:负载均衡,安全过滤. 阿里云:云监控 分流,CDN加速 业务 ...
- [.NET] 一步步打造一个简单的 MVC 电商网站 - BooksStore(二)
一步步打造一个简单的 MVC 电商网站 - BooksStore(二) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore 前: ...
- [.NET] 一步步打造一个简单的 MVC 电商网站 - BooksStore(三)
一步步打造一个简单的 MVC 电商网站 - BooksStore(三) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore &l ...
- [.NET] 一步步打造一个简单的 MVC 电商网站 - BooksStore(四)
一步步打造一个简单的 MVC 电商网站 - BooksStore(四) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore &l ...
- [.NET] 一步步打造一个简单的 MVC 电商网站 - BooksStore(一)
一步步打造一个简单的 MVC 电商网站 - BooksStore(一) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore &l ...
- [.NET] 一步步打造一个简单的 MVC 电商网站 - BooksStore(一) (转)
http://www.cnblogs.com/liqingwen/p/6640861.html 一步步打造一个简单的 MVC 电商网站 - BooksStore(一) 本系列的 GitHub地址:ht ...
- 如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念
一.前言 DDD(领域驱动设计)的一些介绍网上资料很多,这里就不继续描述了.自己使用领域驱动设计摸滚打爬也有2年多的时间,出于对知识的总结和分享,也是对自我理解的一个公开检验,介于博客园这个平 ...
随机推荐
- Grok patterns 汇总
S3_REQUEST_LINE (?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawreques ...
- tk.mybatis通用插件updateByPrimaryKeySelective无法自动更新ON UPDATE CURRENT_TIMESTAMP列的解决办法
tk.mybatis是一个很好用的通用插件,把CRUD这些基本的数据操作全都用动态SQL语句自动生成了,mapper和xml里十分清爽,但是昨天发现有一个小坑,记录在此: 有一张表,结构如下(已经简化 ...
- 解决telnet无法连接 Connection refused
telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式.它为用户提供了在本地计算机上完成远程主机工作的能力.在终端使用者的电脑上使用telnet程序,用它连接 ...
- redis 简单使用总结
作者:王清培(Plen wang) 沪江Java资深架构师 最近一段时间与redis接触比较频繁.发现有些东西还是工作中经常会用到的,自己也花了点时间巩固下.本篇文章主要是以总结性的方式梳理,因为r ...
- svn文件夹解锁批处理
清除svn文件的bat脚本整理 从svn上检出的项目,不在myeclipse工具中脱离svn的管辖,怎么办呢,下面有我的方法,也是借鉴别人的,用了特别好使,故推荐给大家. 首先创建一个xxx.bat文 ...
- 单片机成长之路(51基础篇) - 002 STC单片机冷启动和复位有什么区别
STC单片机简介 STC单片机是一款增强型51单片机,完全兼容MCS-51,还增加了新的功能,比如新增两级中断优先级,多一个外中断,内置EEPROM,硬件看门狗,具有掉电模式,512B内存等.还支持I ...
- Oracle 18C DBCA建库报ora-01012错误
操作系统:rhel 7.2 解决方案: 1).设置/etc/systemd/logind.conf中RemoveIPC=no2).重启服务器或者重启systemd-logind重启systemd-lo ...
- 抓包神器 tcpdump 使用介绍
tcpdump 命令使用简介 简单介绍 tcpdump 是一款强大的网络抓包工具,运行在 linux 平台上.熟悉 tcpdump 的使用能够帮助你分析.调试网络数据. 要想使用很好地掌握 tcpdu ...
- CDC在sql server 2017中无法使用的问题
Symptom === sp_MScdc_capture_job in the CDC job raised error message Msg 217, Level 16, State 1, Pro ...
- odoo jQuery is not defined
The steps1.Query your db as this query.select id, create_date, store_fname, datas_fname from ir_atta ...