队列+多线程+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 > )
{
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();
}
catch
{ }
}
} } public class DoManageSomething
{
public TestResponse Manage(Queueparam cpara)
{
//TODO 具体处理业务
TestResponse resp = new TestResponse();
resp.Code = ;
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();
}
}
catch
{
Thread.Sleep();
}
}
sw.Stop();
sw = null;
return resp;
});
}
}
}

调用处:

                                ulong c = CouchBaseProvider.Increment("TAG_CLAIMCOUNT_USER",userId.ToString(), , , new TimeSpan(, , ));//couchbase自增函数if (c > )//couchebase判断是否领取过
{
resp.Code = -;
resp.Message = "您已在队列里面"; }
else //couchebase判断是否领完
{
int nums = Convert.ToInt32(CouchBaseProvider.Increment(Constants.TAG_CLAIMCOUNT, userId.ToString()));
if (nums > Allnums)
{
resp.Code = -;
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 = ;
TestQueue queue = new TestQueue();
resp = await MonitorThread.WaitForReslut(p.UID, maxWait);
}
}

asp.net怎样解决高并发问题的更多相关文章

  1. asp.net解决高并发的方案.

    asp.net解决高并发的方案. Posted on 2012-11-27 22:31 75077027 阅读(3964) 评论(1) 编辑 收藏 最近几天一直在读代震军的博客,他是 Discuz!N ...

  2. Nginx和Tengine解决高并发和高可用,而非推荐Apache

    什么是Nginx  什么是Tengine 看看国内大公司在用Nginx和Tengine吗? 步骤一:进入 https://www.taobao.com/,按F12.可看到 有很多APP对淘宝进行请求. ...

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

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

  4. 用CAS方案解决高并发一致性问题

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt395 缘起:在高并发的分布式环境下,对于数据的查询与修改容易引发一致性问题, ...

  5. 使用数据库乐观锁解决高并发秒杀问题,以及如何模拟高并发的场景,CyclicBarrier和CountDownLatch类的用法

    数据库:mysql 数据库的乐观锁:一般通过数据表加version来实现,相对于悲观锁的话,更能省数据库性能,废话不多说,直接看代码 第一步: 建立数据库表: CREATE TABLE `skill_ ...

  6. 高并发场景系列(一) 利用redis实现分布式事务锁,解决高并发环境下减库存

    原文:http://blog.csdn.net/heyewu4107/article/details/71009712 高并发场景系列(一) 利用redis实现分布式事务锁,解决高并发环境下减库存 问 ...

  7. 转发:php解决高并发

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

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

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

  9. php面试题二--解决网站大流量高并发方案(从url到硬盘来解决高并发方案总结)

    php面试题二--解决网站大流量高并发方案(从url到硬盘来解决高并发方案总结) 一.总结 从外到内解决网站大流量高并发问题---从提交一个url开始(从用户按下搜索栏回车键开始) url最开始会到d ...

随机推荐

  1. Jetty,Tomcat对MIME协议的配置参数说明

      此处做一下小的汇总,针对Jetty容器内,存在excel的xlsx文件直接通过链接的方式下载的时候,如果是在Chrome浏览器时,则直接触发浏览器的下载行为,但是在IE11的浏览器上,则浏览器会直 ...

  2. java面向对象之关键字,权限修饰符

    1.关键字:this,static,package,importthis:1.表示对当前对象的引用!2.表示用类的成员变量,而非函数参数,注意在函数参数和成员变量同名是进行区分!其实这是第一种用法的特 ...

  3. Wordpress Uncaught TypeError: b(...).not(...).filter(...).mediaelementplayer is not a function

    Wordpress 插件页面报错如下图: 原因及解决方法: 引入了两次 jquery.js 或 jquery.js 定义的变量导致报错,删除在插件页面自己引入的 jquery,js 即可解决报错. 大 ...

  4. Halcon18 Linux For Armv7a 下载

    Halcon18 Linux For Armv7a 下载地址:http://www.211xun.com/download_page_16.html HALCON 18 是一套机器视觉图像处理库,由一 ...

  5. 聊聊、RabbitMQ 第一篇

    (一)windows 下安装配置 开源的消息中间件有很多,各有各的优缺点,适合自己项目的才是最好的.首先下载 rabbitMQ 安装版本,因为 rabbitMQ 底层语言是 erlang,所以首先要先 ...

  6. JavaScript: 理解对象

    ECMA-262 把对象定义为:“无序属性的集合,其属性可以包含基本值.对象或者函数.” 严格来讲,这就相当于说对象是一组没有特定顺序的值.对象的每个属性或者方法都有一个名字,而每个名字都映射到一个值 ...

  7. mysql数据库二进制初始化出现:170425 17:47:04 [ERROR] /application/mysql//bin/mysqld: unknown option '--skip-locking' 170425 17:47:04 [ERROR] Aborting 解决办法

    [root@localhost mysql]# ./scripts/mysql_install_db --user=mysql --basedir=/application/mysql/ --data ...

  8. cf 843 B Interactive LowerBound [随机化]

    题面: 传送门 思路: 这是一道交互题 比赛的时候我看到了直接跳过了...... 后来后面的题目卡住了就回来看这道题,发现其实比较水 实际上,从整个序列里面随机选1000个数出来询问,然后从里面找出比 ...

  9. BZOJ 4561 [JLoi2016]圆的异或并 ——扫描线

    扫描线的应用. 扫描线就是用数据结构维护一个相对的顺序不变,带修改的东西. 通常只用于一次询问的情况. 抽象的看做一条垂直于x轴直线从左向右扫过去. 这道题目要求求出所有圆的异或并. 所以我们可以求出 ...

  10. Ubuntu安装opencv with cuda

    Ubuntu安装opencv with cuda 为了运行dense flow真是折腾啊,下面网址是教程 http://blog.aicry.com/ubuntu-14-04-install-open ...