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

摘要:
1.首先将捕获的异常写入Redis队列1publicclassMyExceptionAttribute:HandleErrorAttribute2{3publicstaticIReditClientsManagerclientManager=newPooledRedisClientManager(newstring[]{“127.0.0.1:6379”,“192.168.1.2:6379”})

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

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

 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分布式队列解决文件并发的问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Redis的简单了解以及主从复制热词统计以及Quartz.net的简单使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Redis有效时间设置及时间过期处理

本文对redis的过期处理机制做个简单的概述,让大家有个基本的认识。Redis中有个设置时间过期的功能,即对存储在redis数据库中的值可以设置一个过期时间。作为一个缓存数据库,这是非常实用的。如我们一般项目中的token或者一些登录信息,尤其是短信验证码都是有时间限制的,按照传统的数据库处理方式,一般都是自己判断过期,这样无疑会严重影响项目性能。一、有效时...

Redis RDB和AOF

By default Redis asynchronously dumps the dataset on disk. This mode is good enough in many applications, but an issue with the Redis process or a power outage may result into a fe...

Redis-设置Key的过期时间及相关策略

Redis-设置Key的过期时间及相关策略 1、设置key的过期时间 1.1expire key second:设置key的过期时间(秒) 1.2ttl key:查看key的有效期 1.3persist key:清除key的过期时间。Key持久化 2、为key设置过期时间需要注意的事项 2.1DEL/SET/GETSET等命令会清除过期时间 2....

redis在.Net程序中使用

1.设置访问密码 config set requirepass 123456 2.连接redis服务器 private static string redisHost = ConfigHelper.GetAppSetting("redisHost"); private static int redisPort = ConfigHelper.G...

Redis存储系统(二)

4.Redis的配置以及持久化方案有几种? a、RDB方式b、AOF方式 5.Redis中的常用命令哪些? a、hset 存储一个哈希键值对的集合 b、hget获取一个哈希键的值c、hdel 删除一个或多个字段 d、hgetall 获取一个哈希是键值对的集合 e、lpush key value向链表左侧添加f、rpush key value向链表右侧添加g...

Linux安装redis,启动配置不生效(指定启动加载配置文件)

一、今天有个同学问我,为什么明明安装了redis,修改了配置,启动的时候,配置还是不生效。如下图是安装后的redis文件图。 二、想加载上图中的redis.conf,进入到src中寻找到启动文件redis-server 三、启动时指定加载的配置文件 四、如下图所示,加载的配置文件,你修改的信息均会生效。 个人公众号谢谢各位老铁支持...