資料伺服器在設計上採用三個層次的資料同步,實現玩家資料的高速獲取和修改。
資料層次上分為:記憶體資料,redis
資料,mysql
資料設計目的:首先保證資料的可靠,防止資料丟失,保證資料完整。然後實現資料的高速訪問,減少由玩家數量增加對資料伺服器效能造成的影響。最後實現運維資料的入庫,以及資料持久化。
在這個基礎上資料伺服器不再是乙個單一伺服器,它涉及到與其他伺服器之間的互動。
資料伺服器的核心在於redis
資料層面。通過
redis
加快玩家資料的快速拉取。
記憶體資料是直接與邏輯伺服器進行互動的,因此記憶體資料劃分到邏輯伺服器進行管理,redis
資料劃分為資料伺服器管理,
mysql
資料是對
redis
資料庫的備份和同步。
主要流程,資料伺服器啟動時先從mysql
資料庫載入所有的活躍玩家相關資料到
redis
資料庫中,邏輯伺服器與資料伺服器之間的互動都是通過國過
redis
資料進行操作。
redis
資料庫回寫到
mysql
可以通過回寫程序實現。
圖 1 資料伺服器資料扭轉流程圖
資料伺服器主程序核心是對redis
的操作,通過
redis
資料庫實現資料的高速儲存。因此,資料伺服器的核心是保證在玩家數量大較大的情況下對玩家資料的增刪改都能維持在一定的時間效率內。
針對於redis
資料庫本身,可以考慮實現
redis
的主從庫搭建,保證
redis
的資料庫的備份和效率。
資料伺服器主程序的構成:
1、mysql資料同步到
redis
資料庫中。
2、邏輯伺服器和資料伺服器的網路庫
3、玩家賬戶修改快取
4、redis資料庫的回寫至
mysql
5、邏輯資料庫的請求處理
6、記憶體資料庫的組織結構
資料伺服器接收到邏輯伺服器的請求後,就資料庫操作請求進行操作的佇列緩衝,形成操作佇列。操作佇列同時提供了redis
資料庫的及時寫入和
mysql
資料庫的非同步寫入。
對於邏輯伺服器,資料伺服器應為其開放以下介面:
1、資料拉取介面,拉取對應玩家的所有資料,將資料儲存到記憶體資料中
2、修改玩家資料介面,提供玩家的部分或全部資訊修改命令
首先redis
是一種key-value
的記憶體資料庫,以
key和
value
的方式來儲存資料實現高速的訪問和操作。其次
mysql
是一種關係型資料庫,儲存的是結構化的資料。這種差異決定了在資料入庫
redis
的時候需要做相應的處理。
通過redis
的key-value
來儲存資料庫中的表名以及表的索引和
hashkey
,來實現構造二維的資料表。
針對於每張表,key
結構 [表名]
:[id值]
要求所有的資料庫表的第乙個欄位為id
,或者所有的表都為主鍵,並且不能重複,這樣保證了所有的
key都不重複
圖 2 資料入庫redis
後表現結構
入庫流程方法一:
先將redis
清空,再將
mysql
所有的額資料逐條入庫到
redis
。逐條入庫的好處是可以對玩家進行其他的操作處理,缺點是啟動伺服器速度慢。
方法二:
先將redis
資料庫清空,再將
mysql
讀取處理的資料快取成
redis
識別的事務,一次性進行
redis
入庫。實現高效的排序功能,可以使用redis
的zset
進行拍尋佇列構建,對於玩家等級或經驗改變時,對
redis
資料庫進行修改,當需要或獲取排序時直接獲取
zset
集合類已經拍好的順序就可以實現高效的排序功能
對redis
資料庫的操作需要回存到
mysql
資料庫中。
方案一:採用多執行緒非同步,通過多執行緒非同步實現mysql
修改回存同步。在資料伺服器多開乙個執行緒進行回存。
優點:設計結構相對簡單,不涉及到程序間通訊,但需要多執行緒開發支援
方案二:採用多程序方式,回存由專門的程序進行,沒有操作訊息redis
資料庫預設**程序**。
優點:簡單的單執行緒即可滿足需求,但需要程序間通訊。
伺服器之間的網路傳輸由統一的網路模組進行。序列化功能採用protobuf
的序列化功能。
資料伺服器設計到大多都是表和redis
資料操作,這些操作具有相似性。這樣的繁雜的操作不利於手動修改和書寫**。
因此在此處合理的運用生成器就會減少很大一部分工作量,通過生成器快速生成c++
**,並且靈活的應對資料庫結構的更改。
生成器使用了c#
語言快速編寫訪問資料庫結構,並生成類**。
生成物可以設計成各種語言的操作檔案,目前生成c++
檔案。資料回寫程序又乙個回寫訊息佇列和乙個回寫器組成,回寫訊息佇列快取所有要進行回寫操作,再有回寫器進行回寫。多執行緒回寫訊息佇列操作加鎖。
3.3 玩家登陸資訊查詢
玩家登陸時將拉取玩家資料到記憶體中。這個流程現在redis
資料庫中查詢玩家資料,如果存在,返回給邏輯伺服器玩家資料,如果
redis
資料庫中不存在玩家資料,將再次在
mysql
中進行查詢,如果存在返回給邏輯伺服器,如果不存在返回查詢失敗。具體流程看下圖
圖 3 玩家資料查詢流程
在修改玩家資料時,需要同步三層資料。資料首先是在記憶體中進行修改,然後發起修改命令給資料伺服器,資料伺服器將修改命令分別壓入redis
資料庫命令佇列和
mysql
命令佇列。再有兩個執行緒非同步對命令佇列中的命令執行,完成資料回寫。
圖 4 資料回寫命令執行流程
3.4 玩家活躍程度劃分
為了提高資料的訪問速度和效率,將玩家進行活躍度分級。正在遊戲玩家資料載入到記憶體,快速訪問。活躍玩家載入到redis
資料庫,實現快速拉取。不活躍玩家存放
mysql
,需要時訪問查詢。
優點:根據資料的訪問頻度對資料進行分級,使得高頻資料快速訪問,節約了記憶體空間。
缺點:不活躍玩家登陸時間相對較長,但不影響遊戲效率。登陸後,玩家又再次進入活躍玩家儲存方案。
Redis MySQL冷熱資料交換
場景 某 需要對其專案做乙個投票系統,投票專案上線後一小時之內預計有100萬使用者進行投票,希望使用者投票完就能看到實時的投票情況 這個場景可以使用redis mysql冷熱資料交換來解決。何為冷熱資料交換?冷資料 之前使用的資料,熱資料 當前使用的資料。交換 將redis中的資料週期的儲存到mys...
Redis Mysql資料不一致問題
目前各個大專案中多多少少用了寫redis快取技術,通過對redis中資料的讀取來減少對db的壓力。那麼在讀 寫兩個分離的技術中就容易造成,資料庫和快取不一致的問題 當使用者在更新資料時,在第二個步驟還未執行,但是此時又通過獲取資料介面,此時快取已經刪除,但是資料庫中還是老資料,那麼就會將老資料重新寫...
lol韓服遊戲內設定 LOL韓服韓文詞語
玩了三年韓服,因為lol而學的韓文,總結一下用詞。上單 top 中單 mid 打野 jungle adc 輔助 support 幫忙打野 leash 遊走 roaming 對線 line gank ganking 反蹲 逆 逆ganking 換線 swap 一級團 invade 5v5團戰 紅buf...