用redis實現的小遊戲設計

前段時間接了一個H5遊戲的後端開發任務,需求比較簡單,就是在大會場裏,幾百、上千人分成若干組,在一段時間裏同時搖手機,實時顯示當前排名,最後看哪個組搖的最快,哪個人搖的最快。
由於是所有用戶同時搖手機,而且一秒鐘之內要搖5-10下,假設一千人同時搖,可能在一秒鐘內會有5000至10000次的寫入請求,而且在寫入後還要同時計算當前各組的排名和個人裏前N名的排名,如果用關係數據庫,可能會由於瞬間大量插入而導致性能下降,造成遊戲前端響應慢並且無法實時顯示成績排名。考慮到該遊戲的實時性要求和遊戲數據的低價值性(遊戲結束後數據基本上就沒用了),選擇了redis作爲後端存儲。

該文章主要介紹redis的5種數據類型在本遊戲中的使用,關於該遊戲的架構設計,不過多說明,總體上就是前端使用websocket接入到後端,後端用netty開發,接收到前端的遊戲數據後,將後續處理置入線程池,由線程池負責數據存入redis,並從redis中獲取當前最新成績排名。

在redis中,主要存儲了以下內容:
1. 團隊、玩家信息
2. 遊戲狀態、目標得分信息
3. 遊戲得分、排名

1. 團隊、玩家信息是典型的鍵值對類型,如團隊名稱、團隊介紹;玩家名稱、玩家頭像,所以使用Hash類型存儲,redis key的命名如:team:teamId、player:playerId。
2. 團隊與玩家關係是典型的無需集合,並且一個團隊中的玩家信息是不可重複的,所以使用集合(Set)類型存儲,redis key的命名如:team.player:teamId
3. 遊戲狀態、目標得分均只有一個取值,所以用字符串類型存儲,redis key的命名如:game.status,target.score
4. 遊戲得分包括個人遊戲得分和團隊遊戲得分,是典型的需要排序的數據集合,所以採用了有序集合類型(sorted set),數據被更新後會自動排序,方便支取得到遊戲排名數據。redis key的命名如下player.score:playerId、team.score:teamId。

以上只是該遊戲中一小部分數據存儲的設計,通過這些設計,可以解決遊戲中大部分數據的存儲,並且可以快速得到個人與團隊成績排名,當然在實際應用中,還需要結合事務、管道等功能,提高數據的一致性和數據存取的快速處理,提高應用的處理性能。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章