mysql遊戲伺服器快取 遊戲伺服器快取策略

2021-10-17 22:26:48 字數 1832 閱讀 1895

1:什麼是快取

在資料庫與伺服器邏輯之間加入的資料層

2:作用

減少資料庫操作

伺服器使用mysql作為資料庫,mysql每秒鐘併發數量有限,所以我們要減少mysql的操作。

3:erlang的快取

erlang 在記憶體中可用 程序字典/ gen state / ets 儲存變數,理論上三種方式都可以作為快取

4:快取實現方案

方案 1

原理讀資料時從快取內讀取,如果快取不存在則從資料庫中篩選,並放入快取內

資料變更時直接運算元據庫,並清除快取

實現方式

啟動乙個gen_server程序將所有 ets建立起來,ets會分為 ets_player,ets_bag 等將資料分開儲存到ets表中,一般以玩家id作為ets的key,讀取某個資料會優先訪問ets表中資料,再從資料庫篩選

這是我們最初的方案,缺點十分明顯,只能減少部分讀取操作,在頻繁更改資料的情況下,快取幾乎沒有作用,快取在不停的被清理,當需要讀取資料時又需要重新從資料庫中拉取。

方案2原理

讀取策略與方案1一致

資料變更時變更快取內資料,不算子據庫,當玩家下線時再將快取資料同步到資料庫中

實現方式

同樣會啟動乙個gen_server程序將所有 ets建立起來,不同的是ets中的每一行多了乙個是否修改的標識位,玩家讀取資料依然優先訪問ets表中資料

當玩家修改資料,例如公升級後,修改ets_player中對應的資料,並將ets中修改標識設為已修改

玩家下線後,順序檢查各個ets中的資料,將標識為已修改的資料同步到資料庫中

方案2與方案1相比,最大的變更在於資料更改時不清理快取,而是修改快取,這就避免了頻繁的從資料庫中篩選資料。

將資料庫同步操作積累到玩家下線而不是立即寫庫,可以減少許多sql語句,例如玩家在上線期間由 1級公升到5級,下線寫庫只會執行一條sql,而即時寫庫則需要4條,對2,3,4,5分別執行update

最初我們以為這套方案已經可以滿足遊戲線上執行需求,直到我們做了乙個壓力測試(膝蓋中了一箭?),例如你有10多個系統,玩家,競技場,揹包,**,等等等等那麼在玩家下線時會出現資料庫操作高峰。在壓力測試時峰值十分明顯,尤其是開服初期導量十分多的情況。

方案3原理

由於玩家下線時間可能會出現峰值,所以我們想到了使用定時寫庫這種方式,將寫庫時間設定為我們認為合適的間隔

實現方式

每一張資料表都啟動乙個對應的gen_server來管理資料,程序內部會建立乙個ets表,玩家讀取/修改資料時都會訪問對應的gen_server

當玩家修改資訊後,gen_server內部會記錄修改的資訊。

gen_server內部啟動乙個定時器,每隔一段時間將修改的資料同步到資料庫中

與方案2相比,方案3將寫庫時間控制在自己手裡,在遊戲開新服導量期間,可能設定數小時同步一次資料,可以很大程度減少sql壓力

但這套方案也有缺陷,由於玩家查詢/修改資料都需要訪問同乙個gen_server,部分gen_server 如玩家資訊,就會出現瓶頸,出現超時現象

方案4原理

為了解決方案3中gen_server訪問的瓶頸問題,我們在gen_server外層又新增了一層快取

實現方式

在方案3的基礎上,又將方案1,2中的cache_process新增回來,玩家讀取資料會先訪問cache_proces中的資料,如果其中沒有再訪問對應的gen_server程序

最終 讀取資料流程       玩家獲取資料 -> cache_process中查詢 -> gen_server 中查詢 -> 資料庫中查詢

玩家更改資料 -> 更改cache_process

-> 更改 gen_server 中資料 -> 一定時間後 gen_server將資料寫回資料庫

mysql 做遊戲伺服器配置 遊戲伺服器部署

bin bash 小菜鳥 掛機 版本 1.0 遊戲伺服器部署 基礎環境 mysql資料庫svn客戶端需部署才能執行此指令碼 if uid 0 then echo game server install else exit 1 firead p please create the storage ga...

遊戲伺服器架構

登陸伺服器判斷賬戶合法性,如果合法的話,把session資訊寫入memcache,閘道器伺服器收到玩家連線請求後,在memcache裡查詢是否合法玩家,防止非法連線。閘道器伺服器要管理玩家連線,需要高併發,可以開多個 scene mgr純粹的 訊息功能 資料庫伺服器純粹的查詢修改資料功能,如果成為瓶...

遊戲伺服器程式設計

參考書籍 linux 多執行緒伺服器端程式設計 網路遊戲伺服器程式設計 unix網路程式設計 鳥哥的linux私房菜 unix環境高階程式設計 developing online games cnv1 cnv2 ice我參與專案已經用了ice,比ace corba這樣的中介軟體簡單。1 linux系...