c#一种存储结构解决动态平衡问题
不說其他了,最近為了實現這么一個場景了而提取的一種結構。我們把一種數據緩存,比如開辟的存儲Buffer,或者連接池。放置在一個結構中。很多時候這有一個共同的特點,我們的業務在一段時間會急劇增長,我們開辟的緩存也需要增長,或者說有一個峰值,但是過了一段時間后就不需要了。我假設峰值100個buffer,但是大部分80.這樣一直保持的沒有任何意義,浪費資源,尤其是我們的buffer存儲的類似數據庫連接(數據庫連接池),需要動態判斷和移除釋放。
? ? ?這里首先考慮的是stack,為什么呢?我們把stack看做一個桶,總是在頂上操作。如果有多余沒有使用的,你們它一直在桶底保留著,很久都不會使用,所以stack是很方便做這類事情的,一般情況可以直接使用stack來操作,然后每隔一段時間去檢查stack內部數據(尤其是底部的數據),看看是否是很久都沒有使用了,可以釋放。但是stack沒有提供直接對底部數據的操作訪問,不是很方便,所以最好的辦法是桶結構的頂部經常操作數據(先進后出),在必要的時候(很少很少)也可以操作底部數據,只是用于檢測是否有多余的數據放置在桶底,很久沒有使用,需要釋放(很多時候我們實行的就是一個時間);
? 最后我根據自己的需要,采用linkedlist和monitor同步,來存儲數據,將尾部看做桶頂。也提供對頭的操作,這樣來實現這個結構。基本符合我的需要。另外我把存儲的使用也提取出來了。在里面存儲的結構的必須是接口實現。每個元素只提供一個狀態,刪除數據時,只是修改這個元素的狀態,并不是真正的移除,只有在取出數據時,才驗證這個數據元素是否已經被移除,這樣來提高效率,減少線程競爭,同時把移除的數據放在結構的一個集合中,成批量的由事件推送,這樣提高移除數據的操作,而移除數據是否需要就看業務需要了,比如我存儲的數據庫連接池,那么就需要,移除的連接并沒有真實釋放,業務需要真實的釋放就需要處理這些移除。
我把實現的結構,以及提取的存儲帶狀態的模型都抽離出來,做了一個demo,供有相關需要的參考,項目已經上傳GIT.
項目地址:
https://github.com/jinyuttt/ConcurrentBucket.git?
轉載于:https://www.cnblogs.com/jinyu20180311/p/10312353.html
總結
以上是生活随笔為你收集整理的c#一种存储结构解决动态平衡问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python进阶-----propert
- 下一篇: DbSetT().Where(e = t