zoukankan      html  css  js  c++  java
  • GS(道具,帮会)定时存储

    //最近数据库存储做了重大改变,数据库内部的回头再说,先看看GS这边的
    1.现在感觉数据库的状态将请求包放入命令队列中,以前是全部放进去,这样让其他的数据库操作不会随着数据库定时器而变慢,GS线程去驱动,一分钟不太可能还存不完
    2.差异更新,GS只获取更改了的记录,这样不用每次都把全部的记录都放进去,这个过程是数据库改观不少
    外面搞个mgr,内部使用可以重用的模板类,感觉是比之前封装的要好,但复杂度也上去了
    m_spSaveOptMgr.reset(new SaveOptMgr(m_spAsynDBC.get(), m_spPropManager.get(), m_spGuildOpt.get()));
            m_spSaveOptMgr->Init();
    //reset:重置管理的指针
    //new():根绝传递的参数调用不同的构造函数
    //get():返回原始的指针
    SaveOptMgr::SaveOptMgr(I_asynDBCenter* pAsyDB,
                               I_PropManager* pPropMgr,
                               I_GuildOpt* pGuildOpt) : 
        m_pAsyDBCenter(pAsyDB),
        m_pPropManager(pPropMgr),
        m_pGuildOpt(pGuildOpt),
        m_nStartRef(2)
    {
        //m_cSaveProp是由模板实例化出来的类,
        m_cSaveProp.m_fnGetSaveObjs        = std::bind(&SaveOptMgr::GetSaveProps,    this,
            ph::_1);//成员绑定外层的函数,是可以的,感觉啊只要是本进程的都可以绑定,对于成员函数的内存空间不是太懂啊
        m_cSaveGuild.m_fnGetSaveObjs    = std::bind(&SaveOptMgr::GetSaveGuilds, this,
            ph::_1);
        m_cSaveProp.m_fnSaveObjs        = std::bind(&SaveOptMgr::SaveProps,        this,
            ph::_1, ph::_2, ph::_3);
        m_cSaveGuild.m_fnSaveObjs        = std::bind(&SaveOptMgr::SaveGuilds,    this,
            ph::_1, ph::_2, ph::_3);
    }
    
    //初始化
    void SaveOptMgr::Init()
    {
        m_spTimer.reset(GetPlug(TimerFactory)->createTimer());
        m_spTimer->regTimer(std::bind(&SaveOptMgr::operator(), this));//重写了类的()操作符
        m_spTimer->setInterval(60 * 1000);
    }
    //定时获取
    void SaveOptMgr::operator()()
    {
        TimedSaveAll();//这个主要是定时器时间到了把要存储的全部放到数据库的请求队列中
        m_cSaveGuild.LoadSaveObjs();//经过这两个操作,相应要保存的数据都m_vecSaveObj中
        m_cSaveProp.LoadSaveObjs();
    }
    
    template<typename SaveObjType>
    void SaveOptMgr::SaveOpt<SaveObjType>::TimeSaveAll()
    {
        int nAllSize = m_vecSaveObj.size();
        if (m_nSaveFlag >= 0 && m_nSaveFlag < nAllSize)
        {
            m_fnSaveObjs(m_vecSaveObj, m_nSaveFlag, m_vecSaveObj.size());//m_fnSaveObjs绑定的是mgr里面的函数
        }
    }
    //其实就是通过那个function去调用Mgr里面的函数,这样只有mgr这层去跟别的模块打交道
    void SaveOptMgr::SaveProps(const std::vector<PropModifyItem>& vecSaveObjs,
                                 int nBeginIndex,
                                 int nEndIndex)
    {
        m_pAsyDBCenter->SetPropInfos(vecSaveObjs, nBeginIndex, nEndIndex);
    }
    
    template<typename SaveObjType>
    void SaveOptMgr::SaveOpt<SaveObjType>::LoadSaveObjs()
    {        
        m_fnGetSaveObjs(m_vecSaveObj);//通过function去调用mgr里面的函数到相应的管理器里面获取数据,但真正的数据还是存在m_vecSaveObj里面
        if (m_vecSaveObj.empty())
            return;
        SetCanSave();    //设置一个标记
    }
    
    void SaveOptMgr::Driver()
    {
        if (IsBusyOfDB())//判断数据库是否忙,忙就是看起请求包是否大于100
            return;
        m_cSaveGuild.Save();
        m_cSaveProp.Save();
    }
    //定时保存
    template<typename SaveObjType>
    void SaveOptMgr::SaveOpt<SaveObjType>::Save()
    {
        if (!CanSave())//看是否能存储
            return;
    
        int nSaveSize = m_vecSaveObj.size();
        if (m_nSaveFlag < nSaveSize)
        {
            int nEndIndex = m_nSaveFlag + eMaxSaveCount;
            if (nEndIndex > nSaveSize)
                nEndIndex = nSaveSize;
            m_fnSaveObjs(m_vecSaveObj, m_nSaveFlag, nEndIndex);
    
            m_nSaveFlag = nEndIndex;
        }
        else
        {
            SetNoneSave();//存储完了就设置成没有存储的
        }
    }
    
    //GS关闭强制保存所有未保存的道具,帮会
    void SaveOptMgr::Stop()
    {
        operator()();//从相应的管理器里面获取未保存的
        m_cSaveProp.ForceSaveAll();//强制放到请求队列中
        m_cSaveGuild.ForceSaveAll();
        m_spTimer->stop();//关闭定时器
    }
  • 相关阅读:
    剑指offer51-正则表达式匹配
    剑指offer50-构建乘积数组
    剑指offer49-数组中的重复
    PHP系列笔记——Zend_Controller工作流程
    多态与重载
    读取文件数据的大概流程
    基于HTTP协议下载文件的实现
    C++中的面向对象笔记
    firebreath注册接口
    python读取excelxlsx,写入excel
  • 原文地址:https://www.cnblogs.com/zzyoucan/p/4136317.html
Copyright © 2011-2022 走看看