游戲郵件系統


   今天改了一下電子郵件的實現,個人覺得比之前的稍微好了一點,特此記錄。

   郵件按不同的分法可以分為很多類,根據策划的要求,我把郵件分為了兩種,一種是下發的所有用戶的,一種是發給某幾個人的。

 之前實現的比較簡單,也是很容易想的的思路,那就是當需要下發一封郵件時,先判斷用戶是否在線,若在線則直接先發到在線用戶內存中維護的“郵箱中”,然后在插到數據庫,若用戶不在線則直接插入到數據庫,下次用戶上線時便可直接得到。

   這樣做對於向某幾個用戶發送來說可能不會有問題,因為人數少。但是若對於向所有用戶發送類型的郵件而言,就會有一個弊端。

 一般情況下,線下的人數是遠多於線上的人數的,這樣的話,在線用戶發送完之后,對於那些不在線的玩家,每個玩家都會向數據庫中插入一。倘若注冊的玩家用戶很多,那么就會瞬間造成大量的數據插入操作,這是其一;其二,對於一般游戲而言,

 往往是玩家注冊一個賬號嘗嘗鮮,便很少玩,或着干脆不回再玩這個游戲。但是每當下發一封給每個玩家的郵件,便會向這類玩家的數據庫中插入一條數據。縱使單開一個線程或協程來做這件事,也是很不划算的。

   於是 , 今天更改了下發給所有玩家郵件的實現方式。

   思路是這樣的 : 將下發給所有玩家的郵件單獨處理。新建一個公共郵件數據表用來存放發給所有玩家的郵件, 同時內存中有對應的數據。也就是,當收到這樣一封郵件后,內存中創建一封郵件,並且按收到的順序存放,沒收到一封,id增加一。                        然后將這封郵件插入到公共郵件的數據表中。

            若玩家在線,則直接推送過去,若玩家不在線,不做任何操作,而是等用戶下次再上線的時候,首先獲取屬於自己私有的郵件,然后到發給所有用戶的郵件中去根據id來判斷是否有這種類型的郵件需要獲取。例如,上次上線領取到id為3的,

            但是此時這種類型的郵件已經下發了7封,那么該用戶再次領取時,只會領取4到7的郵件,放到自己的郵件列表,並插入到數據庫。這樣一來,是玩家上線后主動去獲取這種類型的郵件,以后不會再玩的玩家永遠也不會獲取到。既節省了

            數據庫中的空間,又避免了同一時間大量進行插入操作。

  目前是沿用的這種實現方式,具體表現還要等大量測試后知道。

  lua代碼是根據skynet中提供的各種操作實現的沒有通用性,但是感覺思路還是具備一定的通用性的。若有更好的思路,希望指點。。

 

-------------------------------------------------------分割線------------------------------------------------------

  補充:上邊提到的id 玩家會拿出一個字段來記錄自己領取的公共郵件的id,公共郵件的id是一直增加的。玩家自己的郵件由兩部分組成,一是單獨發給自己的郵件,二是從公共郵件列表中獲取的郵件。而玩家除了記錄公共郵件id外,自己的私有郵件還會有自己的id,當獲取一封公共郵件時,插入數據褲時id要變成私有的郵件id,例如獲取了一封公共郵件id為5,但是玩家自己的私有郵件id為100,那么這封公共郵件存到數據庫后變為101,但是會記錄此時已領取得公共郵件id為5. ps:每個玩家自己維護從1開始遞增的郵件id。

           


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM