美文网首页
全服邮件

全服邮件

作者: 张广旭 | 来源:发表于2021-03-26 21:00 被阅读0次

    创建全服邮件

    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通知客户端有新邮件(需要修改协议)

    相关文章

      网友评论

          本文标题:全服邮件

          本文链接:https://www.haomeiwen.com/subject/dgyshltx.html