redis队列处理文件并发(日志处理)
来源:互联网 发布:origin转换为矩阵 编辑:程序博客网 时间:2024/05/21 06:02
多线程操作同一个文件时会出现并发问题。解决的一个办法就是给文件加锁(lock),但是这样的话,一个线程操作文件时,其它的都得等待,这样的话性能非常差。
另外一个解决方案,就是先将数据放在队列中,然后开启一个线程,负责从队列中取出数据,再写到文件中。
using log4net;using RedisMvcApp.Models;using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using System.Threading;using System.Web;using System.Web.Http;using System.Web.Mvc;using System.Web.Optimization;using System.Web.Routing;namespace RedisMvcApp{ // 注意: 有关启用 IIS6 或 IIS7 经典模式的说明, // 请访问 http://go.microsoft.com/?LinkId=9394801 public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { log4net.Config.XmlConfigurator.Configure();//获取Log4Net配置信息(配置信息定义在Web.config文件中) AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); //通过线程开启一个线程,然后不停的从队列中或数据 string filePath = Server.MapPath("/Log/"); ThreadPool.QueueUserWorkItem(o => { while (true) { try { // if (MyExecptionAttribute.ExceptionQueue.Count > 0) if (MyExecptionAttribute.redisClent.GetListCount("errorException") > 0) { // Exception ex= MyExecptionAttribute.ExceptionQueue.Dequeue();//从队列中拿出数据 string errorMsg = MyExecptionAttribute.redisClent.DequeueItemFromList("errorException");//从Redis队列中取出异常数据 //if (ex != null) if(!string.IsNullOrEmpty(errorMsg)) { //构建成一个完整的路径 // string fileName = filePath + DateTime.Now.ToString("yyyy-MM-dd").ToString() + ".txt"; //string execptionMsg = ex.ToString(); // File.AppendAllText(fileName, errorMsg, Encoding.Default);//将异常写到文件中。 ILog logger = LogManager.GetLogger("czbkError"); logger.Error(errorMsg);//将异常信息写到Log4Net中. } else { Thread.Sleep(30); } } else { Thread.Sleep(30);//避免了CPU空转。 } } catch (Exception ex) { //MyExecptionAttribute.ExceptionQueue.Enqueue(ex); MyExecptionAttribute.redisClent.EnqueueItemOnList("errorException", ex.ToString()); } } }, filePath); } }}
本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1685342
0 0
- redis队列处理文件并发(日志处理)
- 文件并发(日志处理)--队列--Redis+Log4Net
- MVC 4中使用ServiceStack.Redis实现Redis队列【错误日志并发处理】
- redis并发处理慢
- redis 秒杀多并发处理
- redis处理消息队列
- C# 队列处理日志
- 并发队列处理 之 MSMQ
- 消息队列处理高并发
- php+redis+TP处理并发
- -------日志文件的处理---------
- 日志文件的处理
- PHP中利用redis实现消息队列处理高并发请求--简洁代码实现效果
- PHP中利用redis实现消息队列处理高并发请求
- PHP中利用redis实现消息队列处理高并发请求
- 处理高并发高性能队列-Disruptor
- 用redis处理并发问题的代码
- 高并发处理,CDN,redis---31
- jedis连接池详解(Redis)
- Nginx安装详解
- nginx反向代理入门
- ckeditor手动同步textarea
- ckeditor换kama皮肤
- redis队列处理文件并发(日志处理)
- ActiveMQ消息中间件Producer和Consumer
- 用户浏览器禁用了cookie,SessionID如何传递
- java和javascript双引号嵌套的问题
- LLD3学习笔记(2) hello world
- Java Socket和ServerSocket编程 NIO
- anroid sqlite数据库操作框架
- Callable与Runable接口 submit与execute区别
- java concurrent包自带线程池和队列详细讲解