亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

如何簡易的提高吞吐量

2019-11-14 13:51:11
字體:
來源:轉載
供稿:網友

    性能提升還是那幾個要素,就像我在之前的博文里面提到的一樣,這一篇只是更加簡單一點而已。

    因為硬件配置是固定的,那我們只是簡單說一說在使用C#進行開發的項目中,如何使用一些簡單的小招數讓性能有一個比較大幅度的顯著提升。

    一、繞開那些煩人卻又不可避免的DB操作。

    DB操作是不可避免卻又是項目重中之中的所在,那我們可以做哪些優化呢?

    首先,根據業務將DB操作分為需要即時和非即時的兩塊,關于非即時的我們可以將其單獨的交給某一個線程來單獨慢慢處理。代碼如下:

public class DbActionQueue : IDisposable    {        public Queue<Action> _transQueue;        PRivate Thread _thread;        private bool _isDispose = false;        private static readonly object _syncObject = new object();        private readonly object _syncQueueObject = new object();        private static DbActionQueue _instance;        public static DbActionQueue Instance        {            get            {                if (_instance == null)                {                    lock (_syncObject)                    {                        if (_instance == null)                        {                            _instance = new DbActionQueue();                        }                    }                }                return _instance;            }        }        private DbActionQueue()        {            if (_transQueue == null)            {                _transQueue = new Queue<Action>();            }            if (_thread == null)            {                _thread = new Thread(Thread_Work)                {                    IsBackground = true                };            }            _thread.Start();        }        public void Push(Action action)        {            if (_transQueue == null) throw new ArgumentNullException("dbActionQueue is not init");            lock (_syncQueueObject)            {                _transQueue.Enqueue(action);            }        }        public void Thread_Work()        {            while (!_isDispose)            {                Action[] items = null;                if (_transQueue != null && _transQueue.Count > 0)                {                    lock (_syncQueueObject)                    {                        items = new Action[_transQueue.Count];                        _transQueue.CopyTo(items, 0);                        _transQueue.Clear();                    }                }                if (items != null && items.Length > 0)                {                    foreach (var item in items)                    {                        try                        {                            item.Invoke();                        }                        catch (Exception ex)                        {                            LogHelper.Write(string.Format("DbActionQueue error. | Exception.StackTrace:{0}", ex.StackTrace), ex);                        }                    }                }                Thread.Sleep(1);            }        }        public void Dispose()        {            _isDispose = true;            _thread.Join();        }    }
View Code

    通過代碼可以看到,我們在實例化的時候,單獨創建了一個線程,用來做處理。

    那對于一些像日志之類的操作,則可以通過以下代碼進行操作:

DbActionQueue.Instance.Push(() =>{    LogBLL.Instance.Add(new Log                        {                            action_time = DateTime.Now;                        });});            
View Code

    到這里不難免要問了,如果數據量過大,單個隊列已經無法滿足的時候,怎么做處理。關于隊列的監控,優化不在該文討論,通俗一點的做法可以引入一些第三方的隊列。另外在項目中,其實我們更多的時候,實際上并不是在Insert,Update,Delete等操作,而是Select的操作,那關于Select的一些緩存處理,也不在該文的討論范疇,因為關于Cache的各種中間件實在太多,而且篇幅太大。

    可能在某些時候,我們還是覺得單個線程處理太慢,希望多開幾個線程來處理對于DB的請求,則我們可以根據實際業務情況和機器配置,初始化任意個線程來處理,則以上代碼需要稍稍改裝一下,將單例的換成可自由實例化的,代碼如下:

 public class DbQueue    {        public Queue<Action> _transQueue;        private Thread _thread;        private bool _isDispose = false;        private readonly object _syncQueueObject = new object();        public DbQueue()        {            if (_transQueue == null)            {                _transQueue = new Queue<Action>();            }            if (_thread == null)            {                _thread = new Thread(Thread_Work)                {                    IsBackground = true                };            }            _thread.Start();        }        public void Thread_Work()        {            while (!_isDispose)            {                Action[] items = null;                if (_transQueue != null && _transQueue.Count > 0)                {                    lock (_syncQueueObject)                    {                        items = new Action[_transQueue.Count];                        _transQueue.CopyTo(items, 0);                        _transQueue.Clear();                    }                }                if (items != null && items.Length > 0)                {                    foreach (var item in items)                    {                        try                        {                            item.Invoke();                        }                        catch (Exception ex)                        {                            LogHelper.Write(string.Format("DbActionQueue error. | Exception.StackTrace:{0}", ex.StackTrace), ex);                        }                    }                }                Thread.Sleep(1);            }        }        public void Push(Action action)        {            if (_transQueue == null) throw new ArgumentNullException("dbActionQueue is not init");            lock (_syncQueueObject)            {                _transQueue.Enqueue(action);            }        }        public void Dispose()        {            _isDispose = true;            _thread.Join();        }    }
View Code

 那多個線程之間的處理,代碼則如下:

 public class DbQueueManage    {         private int _threadNumber = 2;        private DbQueue[] _dbQueues;        private Random random = new Random();        private DbQueueManage()        {                    }        static DbQueueManage()        {        }        private static readonly object _syncObject = new object();        private static DbQueueManage _instance;        public static DbQueueManage Instance        {            get            {                if (_instance == null)                {                    lock (_syncObject)                    {                        if (_instance == null)                        {                            _instance = new DbQueueManage();                        }                    }                }                return _instance;            }        }        public void Init(Action action, int threadNum = 2)        {            if (_dbQueues == null)            {                this._threadNumber = threadNum;                _dbQueues = new DbQueue[threadNum];                for (var i = 0; i < threadNum; i++)                {                    _dbQueues[i] = new DbQueue();                }            }        }        public void Push(Action action)        {            var index = GetRandomThreadIndex();            if (_dbQueues != null && _dbQueues.Length > index)            {                _dbQueues[index].Push(action);            }        }        public int GetRandomThreadIndex()        {            return random.Next(0, this._threadNumber);        }    }
View Code

另外關于為什么不選用Task來做處理,雖然Task關于線程的處理還是很優秀的,這里請各位同僚自行定奪。關于即時性的DB操作,則可以以Redis,MongoDb,或者自行編寫的緩存來作為中間件,然后再講具體入庫的操作,放入之前編寫好的隊列處理里面。

    


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕亚洲激情| 日本aⅴ大伊香蕉精品视频| 欧美在线观看视频| 欧美亚洲另类在线| 亚洲人高潮女人毛茸茸| 97成人在线视频| 精品国产999| 亚洲人成电影网站| 日韩成人免费视频| 97国产一区二区精品久久呦| 亚洲第一视频网站| 国产成人91久久精品| 亚洲一二在线观看| 性色av香蕉一区二区| 久久亚洲精品一区| 91高清免费在线观看| 永久555www成人免费| 精品国产91乱高清在线观看| 成人淫片在线看| 国产69精品久久久久久| 成人97在线观看视频| 久久精品色欧美aⅴ一区二区| 午夜精品国产精品大乳美女| 成人免费网站在线观看| 免费不卡欧美自拍视频| 午夜精品在线观看| 日韩在线一区二区三区免费视频| 欧美在线亚洲一区| 日本在线精品视频| 欧美性xxxx极品高清hd直播| 日本久久久久久久久久久| 亚洲精品国产精品久久清纯直播| 国产精品久久国产精品99gif| 欧美精品一区三区| 欧美成人久久久| 国产激情综合五月久久| 这里只有精品在线观看| 久久精品福利视频| 久久99亚洲精品| 亚洲精品xxx| 亚洲一区二区日本| 久热在线中文字幕色999舞| 精品久久久久久中文字幕一区奶水| 国产精品影片在线观看| 欧美黑人狂野猛交老妇| 96精品视频在线| 亚洲人成电影在线观看天堂色| 伊人久久五月天| 97欧美精品一区二区三区| 久久国产精品电影| 久久久久久国产| 国产69精品久久久久99| 欧美国产中文字幕| 亚洲视频在线免费观看| 欧美激情精品久久久久久久变态| 日韩免费观看视频| 国产成人精品久久| 91在线观看免费高清完整版在线观看| 成人国产精品日本在线| 57pao国产精品一区| 17婷婷久久www| 久久精品国产精品亚洲| 国内精品400部情侣激情| 国产丝袜精品视频| 欧美精品在线免费| 欧美福利在线观看| 精品国内产的精品视频在线观看| 日韩免费av在线| 色综久久综合桃花网| 主播福利视频一区| 中文字幕精品网| 亚洲成人性视频| 伊人伊成久久人综合网站| 亚洲一区二区三区乱码aⅴ蜜桃女| 久久人91精品久久久久久不卡| 在线免费观看羞羞视频一区二区| 伊是香蕉大人久久| 色久欧美在线视频观看| 国产精品海角社区在线观看| 亚洲人成绝费网站色www| 日韩中文字幕免费| 91在线视频成人| 91久久久久久久一区二区| 一区二区三区在线播放欧美| 午夜精品久久久久久99热软件| 欧美激情在线播放| 国产va免费精品高清在线| 一区二区三区高清国产| 欧美大片va欧美在线播放| 欧美尺度大的性做爰视频| 亚洲久久久久久久久久久| 国产日韩av在线播放| 日韩电影免费观看中文字幕| 欧美亚洲国产精品| 欧美在线视频一二三| 有码中文亚洲精品| 亚洲国产精品系列| 亚洲成人网在线| 亚洲成人在线视频播放| 色琪琪综合男人的天堂aⅴ视频| 91黑丝高跟在线| 国产亚洲美女久久| 欧美精品videosex性欧美| 最新的欧美黄色| 国产精品吴梦梦| 国产91精品最新在线播放| 亚洲九九九在线观看| 国产亚洲在线播放| 久久97精品久久久久久久不卡| 最近2019中文免费高清视频观看www99| 91av在线影院| 国产在线观看91精品一区| 亚洲爱爱爱爱爱| 亚洲男人第一av网站| 丝袜亚洲另类欧美重口| 中文字幕日韩综合av| 欧美激情视频在线免费观看 欧美视频免费一| 日韩在线观看免费全集电视剧网站| 自拍偷拍亚洲精品| 激情亚洲一区二区三区四区| 亚洲福利视频免费观看| 欧美日韩国产成人高清视频| 亚洲欧美日韩在线高清直播| 久久国产精品久久久久久久久久| 91高清视频免费观看| 日本精品性网站在线观看| 国产成人啪精品视频免费网| 这里只有精品在线播放| 精品夜色国产国偷在线| 国自在线精品视频| 亚洲国产另类 国产精品国产免费| 亚洲国产精品推荐| 欧美另类极品videosbest最新版本| 在线看国产精品| 日韩av片永久免费网站| 欧美国产日韩xxxxx| 亚洲第一视频在线观看| 国产99久久精品一区二区永久免费| 亚洲国产福利在线| 超碰日本道色综合久久综合| 精品国产一区二区三区在线观看| 国产精品久久久久久久av电影| 日韩美女在线看| 欧美性视频网站| 久久久久久久亚洲精品| 国产成人久久久精品一区| 色噜噜狠狠色综合网图区| 国产福利视频一区二区| 亚洲成年人在线| 成人激情视频网| 亚洲人成网站色ww在线| 国产成人精品在线观看| 欧美洲成人男女午夜视频| 亚洲国产成人久久综合| 欧美成人精品一区| 欧美成人中文字幕| 国产午夜精品全部视频播放| 啊v视频在线一区二区三区| 欧美日韩国产中文精品字幕自在自线| 日韩欧美视频一区二区三区| 日韩av在线精品| 伊人久久大香线蕉av一区二区| 国产免费久久av| 欧美日韩免费一区|