Redis分布式队列解决文件并发的问题

Posted 善良的小赵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis分布式队列解决文件并发的问题相关的知识,希望对你有一定的参考价值。

1.首先将捕获的异常写到Redis的队列中

 1  public class MyExceptionAttribute : HandleErrorAttribute
 2     {
 3         public static IRedisClientsManager clientManager = new PooledRedisClientManager(new string[] { "127.0.0.1:6379", "192.168.1.2:6379" });
 4         public static IRedisClient redisClent = clientManager.GetClient();
 5         public override void  OnException(ExceptionContext filterContext)
 6         {
 7             base.OnException(filterContext);
 8             Exception ex = filterContext.Exception;
 9             //接下来就是得加入到队列中进行处理
10             redisClent.EnqueueItemOnList("errorMsg", ex.ToString());
11             //跳转到错误页面
12             filterContext.HttpContext.Response.Redirect("/Error.html");
13         }
14     }

2.然后单独开启一个线程对捕获的数据写到文件中去

  public void StartDealLog()
        {
            string filePath = Server.MapPath("/Log/");
            ThreadPool.QueueUserWorkItem((a) =>
            {
                while (true)
                {
                    if (MyExceptionAttribute.redisClent.GetListCount("errorMsg")>0)
                    {
                       // Exception ex = MyExceptionAttribute.MyExceptionQueue.Dequeue();
                        string ex=MyExceptionAttribute .redisClent.DequeueItemFromList("errorMsg");
                        if (ex != null)
                        { 
                           //将错误写到日志中取
                            ILog logger = LogManager.GetLogger("errorMsg");
                            logger.Error(ex);
                        }
                        else
                        {
                            Thread.Sleep(3000);
                        }
                    }
                    else
                    {//将当前线程挂起(就近)
                        Thread.Sleep(3000);
                    }
                }
            },filePath);
        }

3.关于上面的代码的思考

对于每一个错误,IIS所在的服务器都会启动一个线程,这对程序服务器压力还是很大的,所以可以考虑使用Redis的分布式,将上面的处理代码单独放到一台异常处理服务器上,可以是一个控制台程序或者网站程序,只要把上面的代码复制过去就可以了

以上是关于Redis分布式队列解决文件并发的问题的主要内容,如果未能解决你的问题,请参考以下文章

高并发场景之RabbitMQ篇

Redis实现分布式锁与任务队列的思路

如何解决redis的并发竞争key问题?附答案

Redis高并发场景下秒杀超卖解决

基于Redis实现分布式锁以及任务队列

这样的Dubbo + Redis千万级分布式超高并发秒杀案例,有点厉害!