Redis在游戲服務器中的應用
Agent`K 最近在使用Redis,忽然發現以前很多費神的事情都迎刃而解了,又應了經典:我們要做的99%的事情,別人都早已做過了!
(掃盲:Redis是內存型、鍵值對型數據庫,獨立運行,不是第三方庫)
排行榜
游戲服務器中涉及到很多排行信息,比如玩家等級排名、金錢排名、戰斗力排名等。
一般情況下僅需要取排名的前N名就可以了,這時可以利用數據庫的排序功能,或者自己維護一個元素數量有限的top集合。
但是有時候我們需要每一個玩家的排名,玩家的數量太多,不能利用數據庫(全表排序壓力太大),自己維護也會比較麻煩。
使用Redis可以很好的解決這個問題。它提供的有序Set,支持每個鍵值(比如玩家id)擁有一個分數(score),每次往這個set里添加元素,
Redis會對其進行排序,修改某一元素的score后,也會更新排序,在獲取數據時,可以指定排序范圍。
更重要的是,這個排序結果會被保存起來,不用在服務器啟動時重新計算。
通過它,排行榜的實時刷新、全服排行都不再成為麻煩事。
消息隊列(可跨服)
Redis提供的List數據類型,可以用來實現一個消息隊列。
由於它是獨立於游戲服務器的,所以多個游戲服務器可以通過它來交換數據、發送事件。
Redis還提供了發布、訂閱的事件模型。
利用這些,我們就不必自己去實現一套服務器間的通信框架,方便地實現服務器組。
數據庫緩存
Redis提供了較為豐富數據類型,使我們可以更為容易地將數據對象緩存起來(序列化、protobuffer)。
當需要請求某一數據時,先從Redis中查找,如果沒有再查數據庫,同時交給Redis緩存起來。
當對數據進行修改時,則先將修改后的數據保存到Redis,然后保存至數據庫(2)。
第2步可以有另外的思路:
A不實時保存到數據庫,而是交由另外的線程(甚至是專門的程序)去保存,以提高邏輯層的響應速度。
B部分數據交給Redis保存(Reids自身有持久化功能),像玩家已經完成過的任務ID集合,利用Redis的Set類型保存更為合適。
C玩家瞬時變化的數據不見得每次修改都需要保存(比如金錢、經驗),但如果游戲服務器自己維護在內存中,出現宕機就會導致回檔。
Redis是獨立於游戲服務器的,交由它來保存,可以防止宕機回檔的問題,也可以減少游戲服務器自己維護數據所占用的內存。
Agent`K 轉載請注明