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