前言
前段開發(fā)項目試就發(fā)現(xiàn),一部分的代碼實現(xiàn)存在著一些性能上的隱患。但當(dāng)時忙于趕進(jìn)度和由于卡發(fā)中的不穩(wěn)定因素,想了許多解決方案也沒有機(jī)會實施。最近,正好趁個機(jī)會進(jìn)行一系列的改進(jìn)。
我在團(tuán)隊開發(fā)中負(fù)責(zé)開發(fā)服務(wù)器端。所以在編寫業(yè)務(wù)邏輯層時,常常遇到以下這樣的業(yè)務(wù)邏輯:
1. 判斷一個用戶是否為在自己的好友列表中
2. 判斷一條動態(tài)是否已被用戶翻閱
3. 判斷兩個用戶的標(biāo)簽的匹配度
4. .....等等
這些情況,我之前的方案是采用數(shù)據(jù)庫來解決,為每條記錄添加標(biāo)記,需要查詢時則遍歷返回相應(yīng)的集合。
但是隨著用戶量的不斷增多、各個用戶之間的關(guān)系不斷地增加、以及用戶使用軟件的一系列行為中這些情況是非常頻繁的,這樣頻繁遍歷大量的記錄的讀操作會給數(shù)據(jù)庫帶來難以承受的壓力。
那么如何需找一種更好的解決方案?
既能減少數(shù)據(jù)庫需要遍歷的記錄數(shù)量且快速索引,又能用少量的內(nèi)存表示大量的數(shù)據(jù)。
其實如果我們對這一類型的業(yè)務(wù)邏輯進(jìn)行抽象,可以得到:本質(zhì)上就是判斷一個元素是否存在于集合中
所以我們可以采用位數(shù)組,通過數(shù)組的下標(biāo)能快速地定位某個元素,用bit表示相應(yīng)的內(nèi)容能夠節(jié)省大量的空間。
但是這樣結(jié)構(gòu)依舊不夠完美,如果數(shù)據(jù)量相對較少,數(shù)組中會存在大量的無用數(shù)據(jù)