zoukankan      html  css  js  c++  java
  • 业务、数据记录——ThreadPool.QueueUserWorkItem及Redis的实现

    业务描述

      当用户执行完业务操作,或者数据操作后,讲业务记录/数据追踪插入到Redis中。ThreadPool.QueueUserWorkItem定时检查队列并将上述数据插入到数据库中持久化。

    实现流程

      1、RedisHelp的实现

      

     /// <summary>
        /// Redison帮助类
        /// </summary>
        public  class RedisCacheHelper
        {
    
            private static IDatabase databse
            {
                get
                {
                    return ConnectionMultiplexer.Connect("127.0.0.1").GetDatabase();
                }
            }
    
            /// <summary>
            /// 业务日志入队
            /// </summary>
            /// <param name="mess"></param>
            public static void EnqueueOperate(string mess)
            {
                databse.ListRightPush("OperateQueue", mess);
            }
            /// <summary>
            /// 业务日志出队
            /// </summary>
            /// <param name="mess"></param>
            public static string DequeueOperate()
            {
                return  databse.ListRightPop("OperateQueue").ToString();
            }
    
            /// <summary>
            ///数据追踪入队
            /// </summary>
            /// <param name="mess"></param>
            public static void EnqueueDataTrack(string mess)
            {
                databse.ListRightPush("DataTrackQueue", mess);
            }
            /// <summary>
            /// 数据追踪出队
            /// </summary>
            /// <param name="mess"></param>
            public static string DequeueDataTrack()
            {
                return databse.ListRightPop("DataTrackQueue").ToString();
            }
        }

    其中,Redsion是用StackExchange.Redis来实现的。主要就是list对象的出队入队操作。

    然后就是ThreadPool.QueueUserWorkItem定时出队

    public static class OperationLogConfig
        {
            public static void OperationLogStart()
            {
                ThreadPool.QueueUserWorkItem(x =>
                {
                    while (true)
                    {
                        try
                        {
                            var Operate = RedisCacheHelper.DequeueOperate();
                            var DataTrack = RedisCacheHelper.DequeueDataTrack();
                            if (!string.IsNullOrEmpty(Operate))
                            {
                                //do something
                            }
                            if (!string.IsNullOrEmpty(DataTrack))
                            {
                                //do something
                            }
                            if (string.IsNullOrEmpty(Operate) && string.IsNullOrEmpty(DataTrack))
                            {
                                Thread.Sleep(60000);
                            }
                        }
                        catch (Exception ex)
                        {
                            Thread.Sleep(60000);
                        }
                        
                    }
                });
            }
        }

    其中需要注意的是和asp.net不同,这个OperationLogConfig.OperationLogStart();的调用必须在Main函数的Run前面。

  • 相关阅读:
    核心思想:台积电目前的硬体核心技术/制造人力估计不到1,000人
    忽然懂了:云就是互联网
    Qt https 用户认证authenticationRequired()
    TDD和BDD
    MEF实现设计上的“松耦合”
    跨域调用webapi
    复杂度
    react
    Angularjs里面跨作用域
    Spring.NET程序
  • 原文地址:https://www.cnblogs.com/moshanghuakai/p/9627064.html
Copyright © 2011-2022 走看看