開頭
排行榜幾乎是每個網絡遊戲都有的系統,以下用Erlang以例,分享一種排行榜實現方式。
結構
每個排行榜對應一個actor,State使用如下結構:
%% 通用排行榜結構
-record(rank_list, {
key = undefined, %% 排行榜的唯一key
sort_list = [], %% [one_rank{}] 已經排好序的列表
ready_list = [], %% [one_rank{}] 待排序的列表
sort_time = 0 %% 排行榜的刷新間隔
}).
-record(one_rank, {
user = 0, %% 玩家id
num = 0, %% 用於排行榜排序的字段
rank = 0 %% 排名
}).
排序時間間隔
排序是一種消耗性能的操作,因此服務端要儘量避免實時刷新的排行榜。最好是定下每種排行榜的刷新間隔,再用定時器實現定時排序。
實現
- 有數據插入排行榜時,插入or更新ready_list裏的數據
- 執行排序時,對ready_list裏的數據進行排序,同時賦值給sort_list
性能提升
- 限制排行榜的長度,也是就限制sort_list的長度,提高查找sort_list的性能
- 增加1個標誌位,記錄在刷新間隔時間內,ready_list是否發生過改變,若沒有改變,即使到達排序時間也不進行排序
- 每次執行排序後,同時產生兩個map, 一個以user(玩家id)爲key,#one_rank{}爲value;另一個以rank(排名)爲key,#one_rank{}爲value; 以空間換時間,提高查找速度