业务、数据记录——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前面。

原文地址:https://www.cnblogs.com/moshanghuakai/p/9627064.html