文章目錄
  1. 1. 全体邮件
  2. 2. 多人邮件
  3. 3. 个人邮件
  4. 4. 其他
  5. 5. 一些优化

在游戏中邮件系统是少不了的,它可以用来给用户发补偿啊奖励啊通知啊什么的,其他项目很多也都有邮件系统,做法应该大同小异,这里主要讲一下设计思路。
当然最简单的做法就是给每个用户都建立一块区域来存储邮件,当有邮件时直接把邮件添加到该区域,读取是也是直接从这块区域获取就行了。这样做的问题在于当要给全体用户发放邮件的时候服务器压力会很大,邮件都只是在内存还好,如果要操作数据库的话肯定是不行的。
所以最好对于不同的情况采用不同的方法来,这里我按目标用户的不同把邮件大体分为三类:全体邮件、多人邮件、个人邮件,下面分别讲讲他们不同的实现方式。

全体邮件

全体邮件是指给所有用户发放的一种邮件,内容大家都一样,一般是一些通知和补偿什么的。
对于这种邮件我们专门使用一片区域来存储,当有全体邮件时只需要存储到这片区域即可,这样就把数万个区域的操作降低到了一个区域的操作。
但是邮件总是要发给个人的,什么时候发放到个人呢,也很容易,当用户要查看邮件列表的时候我们先在全体邮件区检查一下有没有这个人没有领取的邮件,如果有的话直接把邮件发到这个人的个人区域即可。这样就把全局邮件的发放时间给均摊了,服务器肯定没压力。
要怎么知道某个人有木有领取过全体邮件呢,也简单,在个人区域记录一个该用户领取到的全局邮件的最大邮件id,就表明了该id之前的所以邮件已经发给他了(所以全体邮件都有一个id,而且是应该自增长的)。

多人邮件

多人邮件是指给多个同时发放的一种邮件,它有多个目标用户,如果少量还好,但是目标较多的话还是应该考虑下服务器压力问题。
其实这种邮件的处理方式和全体邮件差不多,同样是开辟个独立的区域来存放该类邮件,该邮件里要记录目标用户有哪些,当用户获取邮件列表的时候在该区域查找有没有此用户的邮件,如果有直接把邮件发给用户,并在列表中把该用户删除。

个人邮件

这种邮件不用多说,就是单独发给某个用户的邮件了。
做法和刚开始说的方式一样,给每个用户分配一片区域来存放邮件(其实大多时候就是数据库中的一条记录),当有新邮件或者邮件状态改变时直接操作该区域即可。

其他

上面的实现方式虽然涵盖了大部分情况,但是依然有些特例不好处理。例如,当我要通过邮件给用户发放排行榜奖励的时候,这种量级也不少,而且每个人的邮件内容又不一样,通过个人邮件发压力太大,通过多人邮件发内容又要不相同。所以这时要考虑其他解决方案(好比我之前博客里写的排行榜奖励发放)。
其实这里也可以通过多人邮件发放,只是在邮件里除了要记录目标用户以为还要记录每个用户的排行名次,这样当他们查看邮件的时候再生成新的邮件发给个人。

一些优化

上面的方案里一些细节可以自己细化,好比新用户就不给他发之前的全局邮件了,好比多人邮件的目标用户少于5人的话直接按照个人邮件来发,好比定时把全局邮件和多人邮件转化为个人邮件等等。
邮件也不能做的那么死板,要根据具体项目的需求进行优化。例如在我们项目里30天之前的邮件可以直接丢弃,用户邮箱最多只能有30封邮件,用户邮件如果已经被阅读过而且附近已经领过则至多保存7天等等。

文章目錄
  1. 1. 全体邮件
  2. 2. 多人邮件
  3. 3. 个人邮件
  4. 4. 其他
  5. 5. 一些优化