排行榜要解決的幾個(gè)問(wèn)題:
一捉蚤、 數(shù)據(jù)收集
首先談數(shù)據(jù)來(lái)源問(wèn)題布持,因?yàn)榕判邪裆婕暗剿杏脩舻臄?shù)據(jù),如果粗暴的周期性從數(shù)據(jù)庫(kù)中取陕悬,會(huì)對(duì)數(shù)據(jù)庫(kù)造成比較大的壓力胧卤。另外,排行榜算法只使用了用戶很小一部分?jǐn)?shù)據(jù)拼岳,在取排行榜所需用戶數(shù)據(jù)時(shí)枝誊,要避免將用戶的所有數(shù)據(jù)從數(shù)據(jù)庫(kù)中取出。目前我們采用的方式是專門存儲(chǔ)了一個(gè)表來(lái)存儲(chǔ)用戶排行榜用到的數(shù)據(jù)惜纸,在開(kāi)服時(shí)全部讀入(要考慮一次性讀出的數(shù)據(jù)大小是否超出了數(shù)據(jù)庫(kù)的限制)叶撒,在服務(wù)器運(yùn)行期間不再讀取數(shù)據(jù)庫(kù)绝骚,而是定時(shí)將在線用戶的信息刷新到排行榜所使用的信息中。通服架構(gòu)下祠够,需要由中心服務(wù)器做排行榜功能压汪,用戶的信息由各服務(wù)器收集并向中心服務(wù)器同步。
二古瓤、 排序算法
排序算法問(wèn)題蛾魄,首次排序是一個(gè)比較典型的top-k問(wèn)題,采用堆排序算法復(fù)雜度為O(k*lgn)湿滓,采用hash(sort-key)的方法算法復(fù)雜度為O(k)滴须。在后續(xù)排序時(shí),可以加入一些過(guò)濾優(yōu)化叽奥,快速排除不會(huì)出現(xiàn)在排行榜的用戶扔水,這個(gè)跟具體的排行規(guī)則有關(guān)系。
三朝氓、 周期
周期是指多久進(jìn)行一次排行榜排序魔市,不宜實(shí)時(shí)排序,目前采用10分鐘進(jìn)行一次排序赵哲。
misc
一個(gè)比較常見(jiàn)的第三方的解決方案是依賴redis排序功能做排行榜功能待德。這個(gè)方案我沒(méi)有測(cè)試過(guò),不知道在跨服環(huán)境海量數(shù)據(jù)下枫夺,會(huì)不會(huì)出現(xiàn)性能瓶頸将宪。