电商秒杀功能实现
知乎:
开源社区:
1) 客户端通过算法进行过滤
2) 负载均衡分配
3) 队列计数
4) 秒杀完成,更新数据库
他人代码参考:
public ActionResult SecKill() { //双十一那天的秒杀活动, //早上11点钟的有611个名额,下午三点钟的有500个名额 int totalPlaces = 0; //名额 DateTime time11 = new DateTime(2015, 11, 11, 11, 0, 0); DateTime time15 = new DateTime(2015, 11, 11, 18, 0, 0); //根据时间获取队列的最大的容量 if (time11<DateTime.Now&&DateTime.Now<time15) { totalPlaces = 611; } else if (DateTime.Now>time15) { totalPlaces = 500; } SecKillQueue q = new SecKillQueue(totalPlaces); //创建队列 //入队 while (!q.IsFull()) { q.In(SessionContext.User.UserId); int count = totalPlaces - q.GetQueueLength(); return Json( new { leftCount=count }); //返回剩下的名额 } //根据队列中保存的用户ID,异步往Consume表插入记录 Task.Run(() => InsertToConsume(q)); return Json( new { ret = 1, msg = "秒杀结束" }); } |
public static void InsertToConsume(SecKillQueue q) { //出列 while (!q.IsEmpty()) { int userId = ( int )q.Out(); User user = UserServices.GetItemById(userId); //这里还要判断当前出列的用户是否已经参与参与过秒杀活动了, //如果有的话就忽略,并且还要把名额重新添加到队列 Consume consume = new Consume() { WorkShopID = user.IsWorkShop == 2 ? ( int )user.WorkShopID : user.Id, SerialNumber = PromotionHelper.getOrderCode() + "-" + new Random().Next(100000, 999999), Amount = 110, ConsumeType = 1, //本金预存 PayStatus = 0 //未支付 }; ConsumeServices.Insert(consume); } } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)