创建全服邮件
- 写入数据库
- 写入redis
- string: 以某个前缀加id作为key,value是msgpack序列化的结果
- zset 记录global_email_id ,member是id,score是id
创建缓存:
创建一个goroutine专门做这个任务
- 实现上面的写入redis功能,上面创建全服邮件时也调用这里的函数
- 实现下面删除redis的功能,下面删除全服邮件那里的
- 定时检测,每20分钟一次
- 具体操作
- 遍历globalemail表一批一批地获取email, 按id从小到大顺序获取
- 对未删除的
- 如果email对应的key没有,就插入
- 如果zset中没有,就插入
- 对未删除的
- 遍历globalemail表一批一批地获取email, 按id从小到大顺序获取
- 具体操作
删除全服邮件
- 数据库记录,设置deleted_at
- redis操作
- 删除zset中的元素
- 设置email对应的key的过期时间为30分钟
分发全服邮件:
- 通过login触发, 在一个zset中记录uid(ZAddNX), member是uid,score是时间戳
- 一个goroutine处理分发
- BZPOPMIN 弹出uid
- 通过GlobalEmailDist获取分发过的最大id
- 从zset按批获取大于前面id的记录
- 根据一组id获取redis的emailContent
- 如果邮件创建时间大于user创建时间,就分发给user
- 并修改GlobalEmailDist
- 如果玩家online,就写入redis记录,记录user当前最大emailId(不是global email id) 过期时间:24小时
login:
把uid添加到上面的zset中
GetEmail:
- 要处理全服邮件的情况(如果是全服邮件分发出来的,去redis获取全服邮件的相关信息)
- 写一个lua脚本,如果从数据库获取到的email的最大id大于等于redis里面记录的emailid,就删除redis记录
通过心跳包实现软实时通知:
- 新email
- 如果redis里有新邮件记录,那么就在心跳包resp通知客户端有新邮件(需要修改协议)