2013年12月26日 星期四

Redis在Game Server的圖鑑功能應用

在遊戲的設計中,有一些類型的遊戲會有收集圖鑑的功能,但一般是以以下幾個方法解決:

  1. 在Client端做記錄,找時間與Server同步圖鑑的部份。缺點是若在同步前資料移失則會損失部份的資料。(PSN的獎杯是使用這種做法。)
  2. 在Server端記錄,當觸發拿到物品時記錄圖鑑。
我們目前是採取2這種做法,但在實作上的code大約會如下:
if not Album.objects.filter(item_id=item_id).exists():
    Album.objects.create(player=player, item_id=item_id)

這樣的做法,但這樣每次拿到物品時就要access db一次,若物品不存在則會access db兩次。後來嘗試把這樣的功能搬到Redis中,可以利用Redis的set就可以很容易解決這樣的問題。

我們把item_id當成塞進set中的value,不管有沒有這個物品,因為set有Unordered Collections of Objects的特性,所以重覆的資料會自動被過濾掉,取圖鑑時也把整個set拿出來就可以了。

沒有留言:

張貼留言