C#队列Queue实现一个简单的电商网站秒杀程序

news/2024/5/13 22:04:02/文章来源:https://blog.csdn.net/weixin_33704591/article/details/85983858

电商的秒杀和抢购,对程序员来说,都不是一个陌生的东西。然而,从技术的角度来说,这对于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();}elseConsole.WriteLine(uid + ":" + x.Msg + "还剩下:" + x.Cnt + "件");});

处理中,由于数据太多看不到谁抢到了商品,后面注释了抢不到的输出

用户0、1、75000、50000、50001、50002 、50003 、50004、25000、75001 这10位抢到了商品,其他人都没有抢到,

全部代码示例:

    public class ThreadPar{private static int cnt =10;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 = -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());}}}
View Code
    class Program{static void Main(){ThreadBuy();Console.WriteLine("----------操作完成----------");Console.ReadKey();}//秒杀static void ThreadBuy(){System.Threading.Thread.Sleep(10000);var tt = new ThreadPar();Parallel.For(0, 1000000, (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 + "");}});}}
控制台程序

 

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

千万pv网站架构之RabbitMQ

千万pv网站架构之RabbitMQ 简介 什么是RabbitMQ&#xff1f; MQ全称为Message Queue, 消息队列&#xff08;MQ&#xff09;是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息&#xff08;针对应用程序的数据&#xff09;来通信&#xff0c;而无需专用链接来…

ssm重新开发计科院新闻网站

本次的开发主要是套入SSM框架&#xff0c;并在前面的新闻网站的开发的基础上套入easyui的前段框架对新闻后台的增删改查的一个管理 但是实验完成过程中还有几个问题尚未解决 其一是上传新闻时&#xff0c;不能上传图片&#xff0c;这一问题在ueditor中可以进一步完善 其二在查看…

.NET使用ServerManager获取网站物理路径

最近因为工作需要&#xff0c;用wpf做了一个辅助小工具&#xff0c;如下图 为了获取网站的物理路径&#xff0c;我分析了通过ServerManager获取到的变量&#xff0c;也通过百度搜索了很多&#xff0c;但仍然没有找到方法。 后来使用必应&#xff0c;在国外网站找到了&#xff0…

Linux系统定时备份网站文件到七牛云存储脚本

1、七牛云账号注册。 有些朋友可能会问为什么要备份到七牛云&#xff1f;很简单&#xff0c;七牛云免费注册就能获取1G的存储空间&#xff0c;只要简单几步操作完成实名认证即可获取10G的存储空间&#xff0c;对于一般个人站点来说已经足够备份使用了。如果还没有七牛云存储空间…

WP的SEO工具汇总

Baidu Sitemap Generator 百度站点地图生成工具 https://wordpress.org/plugins/baidu-sitemap-generator/ This pulgin generates a Baidu XML-Sitemap for WordPress Blog. Also Build a real Static Sitemap-Page for all Search Engine. | 生成百度 Sitemap XML 文件。就相…

Mozilla Firefox 在用户访问被黑客攻击的网站时发出警告

开发四年只会写业务代码&#xff0c;分布式高并发都不会还做程序员&#xff1f; >>> Mozilla 正致力于 优化 Firefox Monitor 功能&#xff0c;该功能推出于 2018 年&#xff0c;目的是让用户确认他们的账户信息是否泄漏。目前&#xff0c;Mozilla 已经为 Firefox 用…

大数据教程(14.2)网站数据分析(二)

2019独角兽企业重金招聘Python工程师标准>>> 上一篇文章介绍了网站点击流数据分析项目业务背景&#xff1b;本篇博客博主将继续分享网站分析的相关知识。 一、整体技术流程及架构 1.1.数据处理流程 该项目是一个纯粹的数据分析项目&#xff0c;其整体流程基本上就是…

Java 爬虫遇到需要登录的网站,该怎么办?

在做爬虫时&#xff0c;遇到需要登陆的问题也比较常见&#xff0c;比如写脚本抢票之类的&#xff0c;但凡需要个人信息的都需要登陆&#xff0c;对于这类问题主要有两种解决方式&#xff1a;一种方式是手动设置 cookie &#xff0c;就是先在网站上面登录&#xff0c;复制登陆后…

网站部署到Linux服务器上并添加https证书

用的是Nginx服务器 一、部署 将网站打包成war包 放到Linux的data/wwwroot/default目录 解压&#xff1a;jar -xvf novel.war 删除war包&#xff1a;rm novel.war 删除文件夹 &#xff1a;rm -rf novel 二、申请SSL证书 网站 &#xff1a;https://www.pianyissl.com/ 三、…

当网站遭遇DDOS攻击的解决方案及展望

当网站遭遇DDOS攻击的解决方案及展望一、事件发生春节长假刚过完&#xff0c;WEB就出现故障&#xff0c;下午1点吃完回来&#xff0c;立即将桌面解锁并习惯性的检查了Web服务器。通过Web服务器性能监视软件图像显示的向下滑行的红色曲线看到WEB出现问题了。根据上述的问题&…

基于WebSphere与Domino的电子商务网站构架分析

本文出自 “李晨光原创技术博客” 博客&#xff0c;谢绝转载&#xff01; 转载于:https://www.cnblogs.com/chenguang/p/3742340.html

随时查看源码的网站---http://www.sooset.com/

由于工作需要经常要在Windows平台下参阅linux源码&#xff0c;以前都用http://lxr.linux.no/来浏览源码&#xff08;如下图所示&#xff09;,最近发现sooset来浏览更方便&#xff0c;所以介绍给大家分享。导航栏用起来很方便&#xff0c;不是吗&#xff1f;呵呵更多详情请参考&…

大型网站架构之百万PV

一&#xff1a;百万PV架构概述PV(page view&#xff0c;页面浏览量)即点击量&#xff0c;通常是衡量一个网站受欢迎程度的主要指标。本案例采用四层模式实现&#xff0c;主要分为前端反向代理层、web层、数据库缓存层和数据库层。前端反向代理层采用主备模式&#xff0c;web层采…

网站及监控利器 Pandora FMS使用体验

Pandora FMS 是一个 开源的应用程序 &#xff0c;用来监测网站的各种活动,它可以收到实时的监测报告&#xff0c;并发送到你指定的邮箱&#xff0c;也可以通过e-mail&#xff0c; SMS 发送。 更多Linux下的监控软件请关注《Linux企业应用案例精解》一书本文出自 “李晨光原创技…

layui导入模板数据_大气漂亮美观的三个网站后台数据管理模板 大大提升你的开发效率...

今天整理了三个我做项目经常使用的三个网站后台模板&#xff0c;这三个模板都是开源的&#xff0c;可以下载商用&#xff0c;可基于它们开发任何网站&#xff0c;做为后台管理数据。这样能为你开发后台功能节约大量的时间。一.ok-admin 一个很赞的&#xff0c;扁平化风格的&…

Silverlight SEO(搜索引擎优化)白皮书

概要这份文档描述了一些Silverlight程序的搜索引擎优化&#xff08;SEO&#xff09;技巧。这些技巧是用来帮助开发人员使得Silverlight内容能够在搜索引擎的结果页被发现&#xff0c;并为没有激活Silverlight的用户提供合意的体验。这份文档将包括以下的章节&#xff1a;*介绍 …

21绝对优秀的网站推荐,激发创意寻找灵感的好去处

世界上总有这么一些人乐于分享&#xff0c;下面挑出21个在设计方面绝对优秀的网站&#xff0c;里面有超酷的设计&#xff0c;时尚的咨询&#xff0c;成功的经验&#xff0c;uleadesign的很多内容就来自于这些网站&#xff0c;希望大家喜欢. 1. Deviantart 2. Behance 3. Abduze…

注册地址从零开始学建站-域名篇

今天朋友几篇文章分析了改注册地址的文章. 关联文章的地址 从零开始学建站-域名篇 域名的基础知识 域名俗称网址&#xff0c;很多人对于一个网站的最初印象可能恰是从这些字符串开始的。为了给拜访者留下一个深刻的第一印象&#xff0c;域名的选择在网站建立过程中有着很大的作…

eclipse for java linux_Eclipse的安装 - Ubuntu 14.04下Java开发环境的搭建_Linux教程_Linux公社-Linux系统门户网站...

下面我们来安装Eclipse&#xff01;安装Eclipse 的前提是&#xff0c;你的JDK已经安装成功好了 开始安装。首先在合适的地方解压eclipse-jee-kepler-SR2-linux-gtk-x86_64.tar.gzcd /opt/DevelopTools/ide/sudo cp/home/home/下载/eclipse-jee-kepler-SR2-linux-gtk-x86_64.tar…

php自动识别pc和手机端并跳转,JS如何实现网站中PC端和手机端自动识别并跳转对应的代码...

1. 代码场景&#xff1a;描述&#xff1a;在项目中&#xff0c;一般我们会使用响应式布局的方式或者借助bootstrap等插件来做响应式的网站。但是根据业务的需求&#xff0c;手机端可能会在功能上精简很多&#xff0c;我们也会写两套代码&#xff0c;分别用来实现PC端和手机端的…