Redis处理文件日志并发(二)

多线程操作同一个文件时会出现并发问题。解决的一个办法就是给文件加锁(lock),但是这样的话,一个线程操作文件时,其它的都得等待,这样的话性能非常差。另外一个解决方案,就是先将数据放在队列中,然后开启一个线程,负责从队列中取出数据,再写到文件中。

 public class MyExceptionAttribute : HandleErrorAttribute
    {
        public static IRedisClientsManager ClientManager = new PooledRedisClientManager(new string[] {"127.0.0.1:6379"});
        public static IRedisClient RedisClient = ClientManager.GetClient();
        public override void OnException(ExceptionContext filterContext)
        {
            RedisClient.EnqueueItemOnList("errorException", filterContext.Exception.ToString());//将异常信息存储到Redis队列中了。
            filterContext.HttpContext.Response.Redirect("/error.html");
            base.OnException(filterContext);
        }
    }
 [MyException]
    public class HomeController : Controller
    {
        //
        // GET: /Default1/

        public ActionResult Index()
        {
            int a = 2;
            int b = 0;
            int c = a / b;
            return View();
        }

    }

Global文件

 protected void Application_Start()
        {
            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(x =>
            {
                while (true)
                {
                    try
                    {

                        if (MyExceptionAttribute.RedisClient.GetListCount("errorException") > 0)
                        {
                            string errorMsg = MyExceptionAttribute.RedisClient.DequeueItemFromList("errorException");//从Redis队列中取出异常数据
                            if(!string.IsNullOrEmpty(errorMsg))
                            {
                                //构建成一个完整的路径
                                string fileName = filePath + DateTime.Now.ToString("yyyy-MM-dd").ToString() + ".txt";
                                File.AppendAllText(fileName, errorMsg, Encoding.Default);//将异常写到文件中。
                            }
                            else
                            {
                                Thread.Sleep(30);
                            }
                        }
                        else
                        {
                            Thread.Sleep(30);//避免了CPU空转。
                        }
                    }
                    catch (Exception ex)
                    {

                        MyExceptionAttribute.RedisClient.EnqueueItemOnList("errorException", ex.ToString());
                    }
                }
            });
        }

Redis处理文件日志并发(二)

时间: 2024-10-08 16:34:13

Redis处理文件日志并发(二)的相关文章

redis学习(二)redis.conf文件配置

取自: https://www.cnblogs.com/pqchao/p/6558688.html 为了更好的使用redis,我们需要详细的了解redis配置文件及相关参数作用. bind 127.0.0.1 bind 192.168.1.100 绑定redis服务器网卡IP,默认为127.0.0.1,即本地回环地址.这样的话,访问redis服务只能通过本机的客户端连接,而无法通过远程连接.如果bind选项为空的话,那会接受所有来自于可用网络接口的连接.如上配置,绑定一个127.0.0.1的本机

winform学习日志(二十三)---------------socket(TCP)发送文件

一:由于在上一个随笔的基础之上拓展的所以直接上代码,客户端: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net.Sockets; using Sys

【分享】我们用了不到200行代码实现的文件日志系统,极佳的IO性能和高并发支持,附压力测试数据

很多项目都配置了日志记录的功能,但是,却只有很少的项目组会经常去看日志.原因就是日志文件生成规则设置不合理,将严重的错误日志跟普通的错误日志混在一起,分析起来很麻烦. 其实,我们想要的一个日志系统核心就这2个要求: 日志文件能够按照 /_logs/{group}/yyyy-MM/yyyy-MM-dd-{sequnce}.log 这样的规则生成: 调用写日志的方法能够带 group 这个字符串参数,差不多是这样:LogHelper.TryLog(string group, string messa

Redis源码阅读(二)高可用设计——复制

Redis源码阅读(二)高可用设计-复制 复制的概念:Redis的复制简单理解就是一个Redis服务器从另一台Redis服务器复制所有的Redis数据库数据,能保持两台Redis服务器的数据库数据一致. 使用场景:复制机制很实用,在客户端并发访问量很大,单台Redis扛不住的情况下,可以部署多台Redis复制相同的数据,共同对外提供服务,提高Redis并发访问处理能力.当然这种通过复制方式部署多台Redis以提高并发处理能力的方式只适用于客户端大部分访问为读数据请求的场景.此外,Redis从2.

redis的redis.conf文件详解

是2.6.12版本的 1 redis.conf配置文件 2 3 # Redis configuration file example 4 5 # Note on units: when memory size is needed, it is possible to specifiy 6 # it in the usual form of 1k 5GB 4M and so forth: 7 # 8 # 1k => 1000 bytes 9 # 1kb => 1024 bytes 10 # 1m

参数文件 控制文件 日志文件 归档文件

参数文件 Database Administration----Reference----Part I Initialization Parameters pfile和spfile区别 文件名不同 文本参数文件pfile:命令规则init+sid.ora 例如:initorcl.ora 服务器参数文件spfile:命名规则spfile+sid.ora 例如:spfileorcl.ora 类型不同 pfile:文本文件 spfile:二进制文件 使用顺序不同 spfile优先使用,如果找不到spf

PHP中Redis替代文件存储Session语句

php默认使用文件存储session,如果并发量大,效率非常低.而Redis对高并发的支持非常好,所以,可以使用redis替代文件存储session. 这里,介绍下php的 session_set_save_handler 函数的作用和使用方法.该函数定义用户级session保存函数(如打开.关闭.写入等).原型如下: bool session_set_save_hanler(callback open,callback close,callback read,callback write,ca

redis慢查询日志

运维需要记录一下主redis中那些“慢操作”的命令,然后找到相关的业务方,不然的话,阻塞 就不好玩了.然后就直接在redis手册中就找到了相关的命令. SLOWLOG subcommand [argument] 什么是 SLOWLOG Slow log 是 Redis 用来记录查询执行时间的日志系统. 查询执行时间指的是不包括像客户端响应(talking).发送回复等 IO 操作,而单单是执行一个查询命令所耗费的时间. 另外,slow log 保存在内存里面,读写速度非常快,因此你可以放心地使用

python的logging日志模块(二)

晚上比较懒,直接搬砖了. 1.简单的将日志打印到屏幕 import logging logging.debug('This is debug message') logging.info('This is info message') logging.warning('This is warning message') 屏幕上打印:WARNING:root:This is warning message 默认情况下,logging将日志打印到屏幕,日志级别为WARNING: 日志级别大小关系为: