打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
redis队列处理文件并发(日志处理)

    多线程操作同一个文件时会出现并发问题。解决的一个办法就是给文件加锁(lock),但是这样的话,一个线程操作文件时,其它的都得等待,这样的话性能非常差。


另外一个解决方案,就是先将数据放在队列中,然后开启一个线程,负责从队列中取出数据,再写到文件中。

  1. using log4net;  
  2. using RedisMvcApp.Models;  
  3. using System;  
  4. using System.Collections.Generic;  
  5. using System.IO;  
  6. using System.Linq;  
  7. using System.Text;  
  8. using System.Threading;  
  9. using System.Web;  
  10. using System.Web.Http;  
  11. using System.Web.Mvc;  
  12. using System.Web.Optimization;  
  13. using System.Web.Routing;  
  14. namespace RedisMvcApp  
  15. {  
  16.     // 注意: 有关启用 IIS6 或 IIS7 经典模式的说明,  
  17.     // 请访问 http://go.microsoft.com/?LinkId=9394801  
  18.     public class MvcApplication : System.Web.HttpApplication  
  19.     {  
  20.         protected void Application_Start()  
  21.         {  
  22.             log4net.Config.XmlConfigurator.Configure();//获取Log4Net配置信息(配置信息定义在Web.config文件中)  
  23.             AreaRegistration.RegisterAllAreas();  
  24.             WebApiConfig.Register(GlobalConfiguration.Configuration);  
  25.             FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);  
  26.             RouteConfig.RegisterRoutes(RouteTable.Routes);  
  27.             BundleConfig.RegisterBundles(BundleTable.Bundles);  
  28.             //通过线程开启一个线程,然后不停的从队列中或数据  
  29.             string filePath = Server.MapPath("/Log/");  
  30.             ThreadPool.QueueUserWorkItem(o =>  
  31.             {  
  32.                 while (true)  
  33.                 {  
  34.                     try  
  35.                     {  
  36.                       //  if (MyExecptionAttribute.ExceptionQueue.Count > 0)  
  37.                         if (MyExecptionAttribute.redisClent.GetListCount("errorException") > 0)  
  38.                         {  
  39.                           //  Exception  ex= MyExecptionAttribute.ExceptionQueue.Dequeue();//从队列中拿出数据  
  40.                             string errorMsg = MyExecptionAttribute.redisClent.DequeueItemFromList("errorException");//从Redis队列中取出异常数据  
  41.                             //if (ex != null)  
  42.                             if(!string.IsNullOrEmpty(errorMsg))  
  43.                             {  
  44.                                 //构建成一个完整的路径  
  45.                               //  string fileName = filePath + DateTime.Now.ToString("yyyy-MM-dd").ToString() + ".txt";  
  46.                                 //string execptionMsg = ex.ToString();  
  47.                              //   File.AppendAllText(fileName, errorMsg, Encoding.Default);//将异常写到文件中。  
  48.                                 ILog logger = LogManager.GetLogger("czbkError");  
  49.                                 logger.Error(errorMsg);//将异常信息写到Log4Net中.  
  50.                             }  
  51.                             else  
  52.                             {  
  53.                                 Thread.Sleep(30);  
  54.                             }  
  55.                         }  
  56.                         else  
  57.                         {  
  58.                             Thread.Sleep(30);//避免了CPU空转。  
  59.                         }  
  60.                     }  
  61.                     catch (Exception ex)  
  62.                     {  
  63.                         //MyExecptionAttribute.ExceptionQueue.Enqueue(ex);  
  64.                         MyExecptionAttribute.redisClent.EnqueueItemOnList("errorException", ex.ToString());  
  65.                     }  
  66.                 }  
  67.             }, filePath);  
  68.         }  
  69.     }  
  70. }  


本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1685342

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例
文件并发(日志处理)--队列--Redis Log4Net - 邹琼俊 - 博客园
最全技术面试180题:阿里11面试 网易 百度 美团!含答案大赠送!
告别 Redis!
面渣逆袭:Redis连环五十二问!三万字+八十图详解!
Java非线程延时
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服