游戏服务器简单的邮箱设计

服务器的邮件功能目前其实已经可以满足时下需求,redis做缓存,mysql做持久化数据库,邮件数据在mysql和redis中都是用一个字段表示,以Json编码后字符串为值,取值做更改操作时需先进行Json解码。

因为具体的邮件业务简单,所以这样实现也能满足时下需求,但是,个人觉得这样的设计虽然易实现,但是程序的易读性较差。

其实,最主要的原因是,邮件数据持久化采用的是mysql关系型数据库,然而,这样的设计却有悖关系模型的逻辑结构。

我想创建独立的表充分利用关系模型的行列结构来设计邮件。

下面,先把后续准备改进的思想屡清楚。

根据需求,邮件共分两类,即个人和系统,个人类型邮件是面向个人的,而系统类型邮件向所有玩家投递的。个人类型的邮件信息单一,每一封邮件的接收者都需要做一条完整的数据记录,而系统类型的邮件信息的内容一致,如果像处理个人类型邮件一样,那就会出现大量数据冗余,从而造成数据库容量浪费,从这点角度出发,我准备对mysql数据库里的邮件做以下设计。

创建两个表,一个是个人类型表person_mail,另一个系统类型表system_mail,person_mail表用来存储所有玩家的个人邮件记录,system_mail表用来存储系统邮件记录,然后在玩家基本信息表(比如取名user_baseinfo)里再加一个字段"sysmail_receiveidx",用来表示系统类型邮件的历史领取索引标记,该值初始为0,表示没有领取过系统类型邮件。

模拟个示例场景:

游戏刚开服,服务器的添加了10封新的系统邮件,玩家登入服务器,拉取邮件列表数据时,都会拿sysmail_receiveidx的值和system_mail表里的邮件索引(即id,id设定的是增量值)做比较,把大于该值索引的系统类型邮件挑出来,然后把插入到person_mail表里,且将sysmail_receiveidx字段值设置为当前system_mail表里邮件索引的最大值。

考虑系统类型邮件数据的可共用性,所以执行这类插入操作时,从system_mail表筛选出来的每条邮件记录只做轻量拷贝,比如类型、创建时间和邮件发送者,然后把邮件接收者填充为本次操作的玩家用户ID,邮件索引用原始值与用户id通过算法生成一个新的唯一值。至于标题、内容和相关奖励数据因占用容量较大我们不进行拷贝,而是等客户端请求个人邮件列表数据时,如果是系统类型邮件,就需要去system_mail表里把对应的记录行取出来,根据记录,把邮件的标题,内容和相关奖励数据填充完整,这样就有效节约了不必要的冗余容量消耗。

好了,mysql数据库里的设计思路确定,接下来讲讲关于邮件的redis缓存。

邮件做redis缓存我主要考虑的是内存这一块,邮件数据到底要不要常驻内存?如果常驻内存,假设每封邮件占用1kb内存,然后每个玩家最多可以保存30封邮件,相当于每个玩家的就占30kb内存,如果内存是2G的,顶多也就能撑几万人的同时在线,当然,这是从成本上考虑的。如果不常驻内存,缓存未命中就需要从数据库去拉,想想邮件操作增、删、查、改,增删改都是数据库和缓存都要同步操作的。查操作时,redis缓存里有就直接返回缓存数据,没有就去数据库查询,但是邮件数据不常驻内存将大大提升缓存命中失败率,加上邮件操作也不是特别密集,个人觉得不如直接砍掉这个缓存,邮件只做mysql数据库存储,这样既节约成本,又减轻实现的复杂度。

 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值