游戏邮件系统
2016-03-16 20:21
399 查看
今天改了一下电子邮件的实现,个人觉得比之前的稍微好了一点,特此记录。
邮件按不同的分法可以分为很多类,根据策划的要求,我把邮件分为了两种,一种是下发的所有用户的,一种是发给某几个人的。
之前实现的比较简单,也是很容易想的的思路,那就是当需要下发一封邮件时,先判断用户是否在线,若在线则直接先发到在线用户内存中维护的“邮箱中”,然后在插到数据库,若用户不在线则直接插入到数据库,下次用户上线时便可直接得到。
这样做对于向某几个用户发送来说可能不会有问题,因为人数少。但是若对于向所有用户发送类型的邮件而言,就会有一个弊端。
一般情况下,线下的人数是远多于线上的人数的,这样的话,在线用户发送完之后,对于那些不在线的玩家,每个玩家都会向数据库中插入一。倘若注册的玩家用户很多,那么就会瞬间造成大量的数据插入操作,这是其一;其二,对于一般游戏而言,
往往是玩家注册一个账号尝尝鲜,便很少玩,或着干脆不回再玩这个游戏。但是每当下发一封给每个玩家的邮件,便会向这类玩家的数据库中插入一条数据。纵使单开一个线程或协程来做这件事,也是很不划算的。
于是 , 今天更改了下发给所有玩家邮件的实现方式。
思路是这样的 : 将下发给所有玩家的邮件单独处理。新建一个公共邮件数据表用来存放发给所有玩家的邮件, 同时内存中有对应的数据。也就是,当收到这样一封邮件后,内存中创建一封邮件,并且按收到的顺序存放,没收到一封,id增加一。 然后将这封邮件插入到公共邮件的数据表中。
若玩家在线,则直接推送过去,若玩家不在线,不做任何操作,而是等用户下次再上线的时候,首先获取属于自己私有的邮件,然后到发给所有用户的邮件中去根据id来判断是否有这种类型的邮件需要获取。例如,上次上线领取到id为3的,
但是此时这种类型的邮件已经下发了7封,那么该用户再次领取时,只会领取4到7的邮件,放到自己的邮件列表,并插入到数据库。这样一来,是玩家上线后主动去获取这种类型的邮件,以后不会再玩的玩家永远也不会获取到。既节省了
数据库中的空间,又避免了同一时间大量进行插入操作。
目前是沿用的这种实现方式,具体表现还要等大量测试后知道。
lua代码是根据skynet中提供的各种操作实现的没有通用性,但是感觉思路还是具备一定的通用性的。若有更好的思路,希望指点。。
邮件按不同的分法可以分为很多类,根据策划的要求,我把邮件分为了两种,一种是下发的所有用户的,一种是发给某几个人的。
之前实现的比较简单,也是很容易想的的思路,那就是当需要下发一封邮件时,先判断用户是否在线,若在线则直接先发到在线用户内存中维护的“邮箱中”,然后在插到数据库,若用户不在线则直接插入到数据库,下次用户上线时便可直接得到。
这样做对于向某几个用户发送来说可能不会有问题,因为人数少。但是若对于向所有用户发送类型的邮件而言,就会有一个弊端。
一般情况下,线下的人数是远多于线上的人数的,这样的话,在线用户发送完之后,对于那些不在线的玩家,每个玩家都会向数据库中插入一。倘若注册的玩家用户很多,那么就会瞬间造成大量的数据插入操作,这是其一;其二,对于一般游戏而言,
往往是玩家注册一个账号尝尝鲜,便很少玩,或着干脆不回再玩这个游戏。但是每当下发一封给每个玩家的邮件,便会向这类玩家的数据库中插入一条数据。纵使单开一个线程或协程来做这件事,也是很不划算的。
于是 , 今天更改了下发给所有玩家邮件的实现方式。
思路是这样的 : 将下发给所有玩家的邮件单独处理。新建一个公共邮件数据表用来存放发给所有玩家的邮件, 同时内存中有对应的数据。也就是,当收到这样一封邮件后,内存中创建一封邮件,并且按收到的顺序存放,没收到一封,id增加一。 然后将这封邮件插入到公共邮件的数据表中。
若玩家在线,则直接推送过去,若玩家不在线,不做任何操作,而是等用户下次再上线的时候,首先获取属于自己私有的邮件,然后到发给所有用户的邮件中去根据id来判断是否有这种类型的邮件需要获取。例如,上次上线领取到id为3的,
但是此时这种类型的邮件已经下发了7封,那么该用户再次领取时,只会领取4到7的邮件,放到自己的邮件列表,并插入到数据库。这样一来,是玩家上线后主动去获取这种类型的邮件,以后不会再玩的玩家永远也不会获取到。既节省了
数据库中的空间,又避免了同一时间大量进行插入操作。
目前是沿用的这种实现方式,具体表现还要等大量测试后知道。
lua代码是根据skynet中提供的各种操作实现的没有通用性,但是感觉思路还是具备一定的通用性的。若有更好的思路,希望指点。。
相关文章推荐
- ARM中MMU地址转换理解
- Lowest Common Ancestor of a Binary Search Tree
- 细谈CSS布局方式
- bzoj1303[CQOI2009]中位数图
- eclipse最有用快捷键整理
- poj 1979 Red and Black (简单裸搜索)
- linux 安装nginx
- Cogs 12 运输问题2 (有上下界网络流)
- Delphi 编译/链接过程
- Fibonacci 数列第 N项 O(logN)算法
- 1170: 非常男女(XCOJ 前缀和)
- CAS代理配置
- 白板编程浅谈——Why, What, How
- visual stdio 2010 安装包制作
- struct和typedef struct
- python show-me-the-code 第0011题
- java使用JexcelApi和POI两种方法操作excel
- HDU-5615-Jam's math problem
- lspci 安装
- 用Matlab批量生成图片