高并发效率极其低下,5分钟客户端所有接受反馈,数据库插入还没有执行完毕。数据库
for (; i < 10000; i++) { Thread thread = new Thread(threadStart); thread.Start(); }
系统每6秒执行如下操做,作持久化。数组
// 做者: 不要理我 // 邮件: 869722304@qq.com(仅仅支持商业合做洽谈) // 建立时间: 2012-08-8 // 最后修改时间: 2012-08-11 // // 未经修改的文件版权属于原做者全部,可是你能够阅读,修改,调试。本项目不建议商用,不能确保稳定性。 // 同时因为项目Bug引发的一切问题,原做者概不负责。 // // 本项目所引用的全部类库,仍然遵循其本来的协议,不得侵害其版权。 // // 您一旦下载就视为您已经阅读此声明。 // // 您不能够移除项目中任何声明。 using CJCMS.Contracts.DTO.Vote; using CJCMS.Domain.Entity; using CJCMS.Domain.Service; using CJCMS.Framework.Logging; using CJCMS.Framework.Task; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; namespace CJCMS.Application { public class VoteTask : IBackgroundTask { public bool IsWorking { get; set; } //缓存投票数组 static Dictionary<string, VoteValueDTO> voteList = new Dictionary<string,VoteValueDTO>(); public VoteTask(bool workFlg) { IsWorking = true; } //加入新投票 public static void Add(string key, VoteValueDTO vote) { //加互斥锁 高并发效率不佳 此处犯愁 lock (voteList) { //判断是否重复投票 if (voteList.ContainsKey(key)) { throw new Exception("Do not re-vote."); } voteList.Add(key, vote); } } //投票持久化数据库,则内存中删除 public static void Remove(string key) { lock (voteList) { voteList.Remove(key); } } //守护函数 每6秒运行一次 public void DoWork() { try { VoteService service = new VoteService(); foreach (KeyValuePair<string, VoteValueDTO> voteValue in voteList) { try { //插入一张投票到数据库 表一行 无其余操做 service.DoVote1(AutoMapper.Mapper.Map<VoteValueDTO, VoteValue>(voteValue.Value)); //删除内存此投票 Remove(voteValue.Value.VoteItemId + voteValue.Value.Ip); } catch (Exception ee) { LogHelper.WriteLog(ee.Message); } } } catch (Exception ee) { LogHelper.WriteLog(ee.Message); } } } }
客户端投票执行的接口以下:缓存
//vote public void DoVote(VoteValueDTO voteValue) { try { VoteService service = new VoteService(); //查询数据库此ip是否有过投票 if (!service.ExistVoteByIp(voteValue.VoteItemId, voteValue.Ip)) { //投票 VoteTask.Add(voteValue.VoteItemId + voteValue.Ip, voteValue); } else { throw new Exception("Do not re-vote."); } //service.DoVote(AutoMapper.Mapper.Map<VoteValueDTO, VoteValue>(voteValue)); } catch (Exception ee) { LogHelper.WriteLog(ee.Message); //throw new Exception("service bussy"); } }
目前因为数据库插入操做比较费时,队列入内存,每6秒将内存数据持久化。然并发入队列操做,和6秒的持久化操做会同时使用队列,则队列需互斥锁。效率低下。因此想问问你们策略,望你们赐教。并发