遊戲服排行榜實現(面試被問到)
最近面試連續被問到遊戲服排行榜如何實現,因為以前一直不覺得是個事,所以突然問到一臉懵逼,現在我自己總結一下。
目前工作中KE排行榜的實現
1.單服排行榜,直接用ruby on rails封裝的查詢語句實現(這個效率其實非常低,可以優化為redis排序)。
2.跨服排行榜-名人堂,設定了redis的快取,24小時更新一次,從中心服拉資料,由於資料量小中心服介面內也是用的ruby on rails封裝的查詢語句實現。
3.跨服排行榜-異族,遊戲服定期分批上報本服資料到中心服,存在redis中,設定了redis的快取,超過50秒可以請求一次中心服,拉取最新排名,中心服介面使用redis來排名,使用了redis的zrevrange(從大到小)排序函式來實現。
公司新專案例如303(erlang寫的)遊戲排行榜實現
1.有一個單獨的的排行榜伺服器,內部使用redis實現排序(使用redis的排序集Sorted sets,這個的資料結構是雜湊表),單服,全服都在這個服上實現排序,遊戲服有資料變動就上傳排序服,這個伺服器對外提供http服務,其他遊戲服通過http請求來set或get分數,一般是玩家在看排行榜的時候才請求更新,平時不請求。
2.當然單服也可以直接在遊戲服上實現,用redis排序,或者自己寫個排序資料結構,絕對杜絕直接用資料庫來排序。
朋友公司,golang遊戲排行榜實現
1.單服的話用redis排序,或者找個庫用skiplist(跳躍表)實現就行,不要用資料庫排(這個效率太低)。
2.全服排行榜的話,建一個單獨的排行榜伺服器,用這個伺服器對外提供http服務,其他遊戲服通過http請求來set或get分數,排行榜伺服器底層也是用的redis或者找個庫用skiplist(跳躍表)實現。
3.排行榜一般會做個快取,多久更新一次,這是優化範疇。比如是更新的話,可以實時更新,但是外面包一個nginx,然後在nginx上做一個靜態的快取,每一小時過期。