前段時間接了乙個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。
以上只是該遊戲中一小部分資料儲存的設計,通過這些設計,可以解決遊戲中大部分資料的儲存,並且可以快速得到個人與團隊成績排名,當然在實際應用中,還需要結合事務、管道等功能,提高資料的一致性和資料訪問的快速處理,提高應用的處理效能。
用redis實現的小遊戲設計
前段時間接了乙個h5遊戲的後端開發任務,需求比較簡單,就是在大會場裡,幾百 上千人分成若干組,在一段時間裡同時搖手機,實時顯示當前排名,最後看哪個組搖的最快,哪個人搖的最快。由於是所有使用者同時搖手機,而且一秒鐘之內要搖5 10下,假設一千人同時搖,可能在一秒鐘內會有5000至10000次的寫入請求...
用js實現2048小遊戲
筆記倉庫 2048是一款休閒益智類的數字疊加小遊戲。文末給出源 和演示位址 在 4 4 的16宮格中,您可以選擇上 下 左 右四個方向進行操作,數字會按方向移動,相鄰的兩個數字相同就會合併,組成更大的數字,每次移動或合併後會自動增加乙個數字。當16宮格中沒有空格子,且四個方向都無法操作時,遊戲結束。...
用html css js實現2048小遊戲
最近在學習h5的相關知識,為了檢驗下學習效果,嘗試著對小遊戲2048進行了實現,本來還覺得學的已經不錯了,但是真是做的時候真是應了那句話 書到用時方恨少,絕知此事要躬行!為了測試下對基礎知識的掌握程度,沒有使用現成的框架,如jquery等,這個小遊戲只用了基礎的html css和js。實現該遊戲的思...