全服邮件

创建全服邮件

  1. 写入数据库
  2. 写入redis
  • string: 以某个前缀加id作为key,value是msgpack序列化的结果
  • zset 记录global_email_id ,member是id,score是id

创建缓存:
创建一个goroutine专门做这个任务

  • 实现上面的写入redis功能,上面创建全服邮件时也调用这里的函数
  • 实现下面删除redis的功能,下面删除全服邮件那里的
  • 定时检测,每20分钟一次
    • 具体操作
      • 遍历globalemail表一批一批地获取email, 按id从小到大顺序获取
        • 对未删除的
          • 如果email对应的key没有,就插入
          • 如果zset中没有,就插入

删除全服邮件

  1. 数据库记录,设置deleted_at
  2. 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记录

通过心跳包实现软实时通知:

  1. email
  • 新email
    • 如果redis里有新邮件记录,那么就在心跳包resp通知客户端有新邮件(需要修改协议)

你可能感兴趣的:(全服邮件)