队列+多线程+couchbase缓存 ,解决高并发问题。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;
using GStreamCloud.Common;
using MyGStreamcloud.Common.Utils;namespace RedPacketWebAPI.Models
{[Serializable]public class Queueparam {public int uId { get; set; }public string Name { get; set; }}[Serializable]public class TestResponse{public int Code{get;set;}public string Message{get;set;}}[Serializable]public class TestQueue{public static Dictionary<string, TestResponse> output = new Dictionary<string, TestResponse>();public static Thread t;public TestQueue(){t = new Thread(new DoQueueProcess().ThreadDo);}public static Queue<Queueparam> queuelist = new Queue<Queueparam>();public static object lockqueue;public static void Enqueue(Queueparam p){lock (lockqueue){queuelist.Enqueue(p);}}public static Queueparam Dequeue(){lock (lockqueue){if (queuelist.Count > 0){return queuelist.Dequeue();}else{return null;}}}public static TestResponse popValue(string key){lock (lockqueue){if (output.ContainsKey(key)){TestResponse resp = output[key];output.Remove(key);return resp;}else{return null; }}}}public class DoQueueProcess{public bool stop = false;public void ThreadDo(){while (!stop){try{Queueparam param=TestQueue.Dequeue();if (param != null){DoManageSomething todo = new DoManageSomething();TestResponse resp= todo.Manage(param.Name);TestQueue.output.Add(param.uId.ToString(), resp);}}catch{ }try{Thread.Sleep(10);}catch{ }}}}public class DoManageSomething{public TestResponse Manage(Queueparam cpara){//TODO 具体处理业务TestResponse resp = new TestResponse();resp.Code = 0;resp.Message = cpara.Name + "处理成功";disposeCoucheBase(cpara);return resp;}public void disposeCoucheBase(Queueparam cpara){ulong num = CouchBaseProvider.Decrement(Constants.TAG_CLAIMCOUNT, cpara.uId.ToString());ulong userNum = CouchBaseProvider.Decrement(Constants.TAG_CLAIMCOUNT_USER,  cpara.uId.ToString());}}public class MonitorThread{public static async Task<TestResponse> WaitForReslut(string UID, int timeOut){return await Task<TestResponse>.Run(() =>{TestResponse resp = new TestResponse();Stopwatch sw = new Stopwatch();sw.Start();while (sw.ElapsedMilliseconds > timeOut){try{if (TestQueue.output[UID] != null){return TestQueue.popValue(UID);}else{Thread.Sleep(10);}}catch{Thread.Sleep(10);}}sw.Stop();sw = null;return resp;});}}
}

调用处:

                                ulong c = CouchBaseProvider.Increment("TAG_CLAIMCOUNT_USER",userId.ToString(), 1, 1, new TimeSpan(2, 0, 0));//couchbase自增函数if (c > 1)//couchebase判断是否领取过
                                 {resp.Code = -1010;resp.Message = "您已在队列里面";}else //couchebase判断是否领完
                                 {int nums = Convert.ToInt32(CouchBaseProvider.Increment(Constants.TAG_CLAIMCOUNT, userId.ToString()));if (nums > Allnums){resp.Code = -1011;resp.Message = "人数已满";}else{//TODO 进入队列Queueparam p= new Queueparam();p.Name= userName;p.UID = System.Guid.NewGuid().ToString();p.redOrder = redOrder;TestQueue.Enqueue(p);int maxWait = 30000;TestQueue queue = new TestQueue();resp = await MonitorThread.WaitForReslut(p.UID, maxWait);}}

转载于:https://www.cnblogs.com/MissQing/p/6425498.html

asp.net怎样解决高并发问题相关推荐

  1. 乐观锁 -业务判断 解决高并发问题

    在解决高并发问题时,如果是分布式系统显然我们只能够使用数据库端加锁机制来解决这个问题,但是这种同步机制或者数据库物理锁机制会牺牲一部分的性能,所以常常以另外一种方式来解决这个问题 就是乐观锁模式 银行 ...

  2. PHP使用文件锁解决高并发问题示例

    PHP使用文件锁解决高并发问题示例 参考文章: (1)PHP使用文件锁解决高并发问题示例 (2)https://www.cnblogs.com/lxwphp/p/8949518.html (3)htt ...

  3. php解决高并发问题

    php解决高并发问题 参考文章: (1)php解决高并发问题 (2)https://www.cnblogs.com/jcydd/p/10632526.html (3)https://www.javaz ...

  4. Nginx与Redis解决高并发问题

    Nginx与Redis解决高并发问题 参考文章: (1)Nginx与Redis解决高并发问题 (2)https://www.cnblogs.com/nucdy/p/5516511.html 备忘一下.

  5. python如何解决高并发_Flask 处理高并发、多线程

    前言: 使用flask做服务时,可以使用python run.py的方式运行,但是这样不能用于生产环境,可能会出现连接无响应的情况.后来通过查找资料,发现flask服务处理多线程.高并发的一下方法,主 ...

  6. 每一个程序员都应该知道的高并发处理技巧、创业公司如何解决高并发问题、互联网高并发问题解决思路、caoz大神多年经验总结分享...

    本文来源于caoz梦呓公众号高并发专辑,以图形化.松耦合的方式,对互联网高并发问题做了详细解读与分析,"技术在短期内被高估,而在长期中又被低估",而不同的场景和人员成本又导致了巨头 ...

  7. 转发:php解决高并发

    php解决高并发(转发:https://www.cnblogs.com/walblog/articles/8476579.html) 我们通常衡量一个Web系统的吞吐率的指标是QPS(Query Pe ...

  8. PHP中如何解决高并发

    PHP中如何解决高并发 1:硬件方面 普通的一个p4的服务器每天最多能支持大约10万左右的IP,如果访问量超过10W那么需要专用的服务器才能解决,如果硬件不给力 软件怎么优化都是于事无补的.主要影响服 ...

  9. PHP利用Mysql锁解决高并发

    前面写过利用文件锁来处理高并发的问题的,现在我们说另外一个处理方式,利用Mysql的锁来解决高并发的问题 先看没有利用事务的时候并发的后果 创建库存管理表 CREATE TABLE `storage` ...

最新文章

  1. Linux 基础学习
  2. centos7 安装telnet服务
  3. 分布式理论(一)CAP 理论
  4. 装箱问题C语言报告,装包装箱问题 (C语言代码)
  5. linux 文件处理命令
  6. 深度学习auc_机器学习集成学习与模型融合!
  7. 高级应用-路由协议配置
  8. 排序-概述,插入排序(180602更新完毕)
  9. linux某个目录下特定文件名,用脚本实现移动某目录下文件名符合指定规则的文件到另一个目录的功能...
  10. java 调用wget_通过命令行执行WGET下载会更快,而通过Java代码执行时会更慢
  11. 未能启用约束。一行或多行中包含违反非空、唯一或外键约束的值。
  12. python做性能测试_Python做性能测试-1、Locust基础篇
  13. wps表格怎么添加附页_关于WPS里面页码的问题
  14. OpenGL学习整理------着色器
  15. 小学计算机教育计划,2021年小学信息技术教学计划
  16. Java中将List分组到Map中算法(可用于android联系人拼音分组)
  17. maven-replacer-plugin 静态资源打包方案js css
  18. echarts 正负条形图
  19. 代码解读一 文件名“ANO_Imu.c”
  20. Linux驱动01 - Timer

热门文章

  1. Docker入门与七牛kirk工具
  2. Redis-stat的安装与使用
  3. GUI(概述和布局)
  4. 存储IOPS参数结合实例详解
  5. LINUX内核经典面试题
  6. English debate for sports motion with notes from PM (feedback included)
  7. Cambridge career service
  8. Maven学习总结(5)——聚合与继承
  9. es6新语法Object.assign()
  10. 私有云存储搭建(owncloud)