3.邮件系统邮件数据结构设计
3.1 设计思路
邮件系统中数据结构承担着“存储、索引、过期与回收”四大核心职能:
- 存储实体:
Mail
与MailBox
分别承载“邮件内容”与“投递载体”两部分职责。 - 索引组织:通过
OwnerId
、AccountId
、MailBoxType
等字段,将海量邮件按玩家、类型与时间高效检索。 - 生命周期管理:利用
CreateTime
/ExpireTime
驱动定时清理机制,自动回收失效数据。 - 领取记录:
Received
集合记录已领取玩家,保证“多目标一份”与“防重领”语义准确。
这种拆分让“邮件数据”既能灵活支持多场景分发,又能在高并发与海量存储下保持高效与可维护。
3.2 核心实体类图
classDiagram class Item { +string Name } class Mail { +long OwnerId +string Title +string Content +long CreateTime +long ExpireTime +int Money +MailState MailState +MailType MailType +List~Item~ Items } class MailBox { +Mail Mail +long CreateTime +long ExpireTime +MailBoxType MailBoxType +HashSet~long~ AccountId +HashSet~long~ Received +long SendAccountId } Item --> Mail : 包含 Mail --> MailBox : 嵌入
3.3 枚举定义
public enum MailType {
None = 0,
System = 1, // 系统邮件
Rewards = 2, // 活动/奖励邮件
User = 3 // 玩家互发
}
public enum MailState {
None = 0,
Unread = 1, // 未读
HaveRead = 2, // 已读
NotClaimed = 3,// 未领取
Received = 4 // 已领取
}
public enum MailBoxType {
None = 0,
Specify = 1, // 指定玩家
Online = 2, // 在线玩家
All = 3, // 全服玩家
AllToDate = 4 // 注册后玩家
}
public enum MailRemoveActionType {
None = 0,
Remove = 1, // 手动删除
ExpireTimeRemove = 2,// 过期清理
Overtop = 3 // 超量回收
}
3.4 实体字段说明
Item
- Name:物品名称,占位将来可扩展更多属性(ID、数量、稀有度等)。
- OwnerId:归属玩家的唯一标识(AccountId)。
- Title, Content:邮件标题与正文。
- CreateTime, ExpireTime:触发过期回收的时戳。
- Money:附带的金币数,可选。
- MailState:读/领状态,用以 UI 展示红点与可操作。
- MailType:区分系统、活动或玩家互发。
- Items:克隆后的
Item
列表,确保邮件内容不可篡改。
MailBox
- Mail:承载的
Mail
实例,负责内容和附件。 - CreateTime, ExpireTime:邮件箱生命周期,与
Mail
分离,便于统一清理过期箱。 - MailBoxType:决定分发策略:指定、在线、全服或限时。
- AccountId:待发送的玩家 ID 集合。
- Received:已领取玩家 ID 集合,防止重复领取。
- SendAccountId:发件人 ID,用于审计与日志。
3.5 设计目标
- 分层嵌套:将“内容”和“载体”拆为
Mail
&MailBox
,逻辑清晰易演化。 - 双时间字段:邮件与邮件箱各自维护过期时间,实现“先到先清理”与“内容与投递时效解耦”。
- 多目标投递:
AccountId
+Received
支持一对多发放与后期批量清理。 - 可扩展性:枚举和实体可无缝增补新类型(如基于等级、区域分发),无需改动存储模型。
3.6 优化思考
- 索引优化:为
ExpireTime
、AccountId
建立数据库二级索引,加速查询与清理。 - 分表分库:海量邮件可按时间或玩家 ID 分片,提升并发写入与读取吞吐。
- 二级缓存:热点玩家邮件可放入 Redis Cache,减少数据库压力。
- 回收策略:支持“超期不自动删”或“保留操作日志”两种模式,根据运营需求灵活配置。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com