游戏邮件系统
今天改了一下电子邮件的实现,个人觉得比之前的稍微好了一点,特此记录。
邮件按不同的分法可以分为很多类,根据策划的要求,我把邮件分为了两种,一种是下发的所有用户的,一种是发给某几个人的。
之前实现的比较简单,也是很容易想的的思路,那就是当需要下发一封邮件时,先判断用户是否在线,若在线则直接先发到在线用户内存中维护的“邮箱中”,然后在插到数据库,若用户不在线则直接插入到数据库,下次用户上线时便可直接得到。
这样做对于向某几个用户发送来说可能不会有问题,因为人数少。但是若对于向所有用户发送类型的邮件而言,就会有一个弊端。
一般情况下,线下的人数是远多于线上的人数的,这样的话,在线用户发送完之后,对于那些不在线的玩家,每个玩家都会向数据库中插入一。倘若注册的玩家用户很多,那么就会瞬间造成大量的数据插入操作,这是其一;其二,对于一般游戏而言,
往往是玩家注册一个账号尝尝鲜,便很少玩,或着干脆不回再玩这个游戏。但是每当下发一封给每个玩家的邮件,便会向这类玩家的数据库中插入一条数据。纵使单开一个线程或协程来做这件事,也是很不划算的。
于是 , 今天更改了下发给所有玩家邮件的实现方式。
思路是这样的 : 将下发给所有玩家的邮件单独处理。新建一个公共邮件数据表用来存放发给所有玩家的邮件, 同时内存中有对应的数据。也就是,当收到这样一封邮件后,内存中创建一封邮件,并且按收到的顺序存放,没收到一封,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。