游戲服務器之數據緩存


在游戲服務器中,一般相同用戶的操作都會在一個指定的線程中操作,而一個線程中又會有多個用戶的使用。如果對用戶數據的操作進入直接入庫操作,那么就會產生io操作,主要有網絡io和磁盤io。所以一般我們都是采用內存緩存的方式。內存緩存數據庫的方式有很多種,網上也有很多,這里只是介紹一下我的思路和實現。

 

首先確定一下服務的定位,一,業務服務,負責處理業務邏輯的服務,叫logicServer吧,這個服務會對數據進行頻繁的修改,所以為了提高效率,這個服務會緩存角色的所有數據。二,是數據緩存更新服務,暫且叫dao層服務吧,它負責對角色數據的長期緩存,和更新數據到數據庫中。logicServer對數據的修改頻繁,如果每次修改都請求數據庫的話,就有點太頻繁了,有些數據被多次修改,只需要更新一次就可以了。所以這里緩存的數據采用定時更新到dao層的方式。比如60s更新一次。用戶下線之后,如果五分鍾還沒有再次上線,就判斷用戶不玩了,就把這個用戶的內存數據清理掉。但是dao層對數據的緩存時間要長一些,比如一天或一周如果沒有更新數據就清理掉。相當於redis做一下長時間的緩存,這樣用戶一天內或一周內登陸多次就會直接從緩存中獲取數據,而不用查數據庫了。dao層的數據也是定理更新到數據庫,比如每五分鍾更新一次。不過只更新產生變化的數據。

 

角色信息數據庫使用mongodb

  它是一個文檔類型的數據庫,在游戲中,一個角色的數據由多個對象組成,比如角色信息對象,背包對象,技能對象,關卡對象等等。我們把一個用戶的所有信息都放到一個大對象中,比如UserData中,UserData中包括了所有的數據對象。把它一次性存儲到mongodb中,用戶進入logicServer的時候,也一次性全部取出來了,可以減少查詢的次數。而且在保存數據到數據庫的時候,只需要調用mongo的save方法,如果更新的對象存在_id,就直接覆蓋掉老 數據,如果不存在_id,就插入一條新數據。很方便。如果角色的數據太多,可以把大表的數據單獨再存到一個collection中。

在用戶選擇角色,進入游戲時,User服務調用dao初始化數據,拿到初始化的數據,再調用logicServer的接口,把數據初始化到logic服務器中,這里需要注意的是,如果業務服務中已經有緩存了,就不做任何操作,防止由於定時更新數據導致的數據不一致笥,這樣就不會因為用戶第一次進入業務服務去dao層拉數據而卡線程了。

 

logicServer緩存的是數據對象,而dao中緩存的是對象的json數據。因為dao層的數據不做可視化調用,只是和業務服務之間傳輸,而且這樣做,在業務中增加數據時,不需要修改dao層的結構。業務服更新數據到dao采用消息隊列的方式,異步更新。

 

 


 

有問題可加QQ群:JAVA游戲服務器開發S   66728073交流或關注左上角微信公眾號。更多文章:http://www.coc88.com

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM