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();//关闭定时器
}
时间: 2024-11-08 23:20:20

GS(道具,帮会)定时存储的相关文章

mysql创建定时存储任务

通过mysql的事件定时执行来实现数据库的调度任务 创建mysql的定时事件语法是 CREATE EVENT `test_event` ON SCHEDULE EVERY 5 SECOND STARTS now() ON COMPLETION NOT PRESERVE ENABLE DO CALL `myProcedure` on schedule every 5 second 表示每5秒钟执行一次 starts now()  表示从现在开始 on completion not preserve

Infortrend新一代GS存储系统性能全面提升

Infortrend推出两款全新一代的存储解决方案:统一存储EonStor GS Gen2和全闪存EonStor GSa Gen2,NAS性能提高60%以上.性能上的提高,让新的存储系统能够适应更为严苛的应用环境,尤其更有能力应对数据密集型应用.更重要的是,GS Gen2综合实力全面提升,同等价位上使用价值更高,给予用户更多的竞争优势.GS/GSa Gen2 升级的方面包括: ?新一代 Intel处理器推动性能高达 11,000MBps的带宽和900k IOPS?每个控制器板载四个 10 GbE

再看GS线程

再看GS线程 void GameServer::ProcessThreadTry() { int nCount = 0; packet rcvPkt; rcvPkt.data = new char[1024 * 100]; //该事件工厂主要创建了两个定时器1.livemgr的检测(即是否是有效的连接)2.道具帮会差异更新数据的获取即定时从道具帮会容器中获取差异需要保存到数据库的这个数据 //3.释放队列的处理,现在玩家下线不是直接把channel删除掉而是放到释放队列中等没有数据库访问时在删除

GS初始化

开启GameServer模式 init函数,现在看看这个大函数干什么的 //这个init也是GameServerUI里面调的,这个线程其实就做了一些初始化的工作,其实这里面没有什么主不主线程,都是在一个进程里面的 void __stdcall GameServer::init() { ///设置最大连接数,现在还不知这个到底干啥的 Share::SetMaxGcNumb(12000); //指定本GS支持的最大数量 ///log日志,现在服务器写日志,在服务器报错的时候可以查看日志,还有报错时生

Infortrend存储 高性价比统一存储GS1016在公共服务领域的应用

随着我国城镇化建设的脚步越来越快,二三线城市公共服务部门的日常数据处理所面临的业务压力日益增大,但是受预算有限等因素的影响,现有的存储设备无论从性能还是容量上,往往跟不上业务扩展的速度,严重影响公共服务部门的办事效率,这个时候Infortrend存储产品的价值就凸显出来.日前东部地区一座省会级城市的公安部门为了升级户籍管理系统,就引进了Infortrend统一云存储EonStor GS产品线中的GS 1016,更换老旧的后端存储设备.GS 1016上线后,凭借出色IOPS性能,用户的户籍系统不仅

推广项目之接口文件存储

1.背景: 数据方请求后台数据存储项目(xx-cookie-catchs)上传文件,后台接收原始加密文件后存储到指定路径(存储不同数据方的加密文件),定时解密文件到指定路径(存储不同数据方的解密文件),再定时存储加密文件到数据库(存储不同数据的数据). 2.问题: 数据方上传的文件个数不匹配,例如某天上传96个后台接收存储只有92个 3.分析: 后台接收文件后生成的新的文件名(原始文件名+当前时间yyyyMMddHHmmss),数据方上传的文件有4个节点组成,节点与节点之间的文件名有相同,4个节

统一存储成就制造业,一步解决业务的存储障碍

项目背景:远纺织染(苏州)有限公司是台湾远东集团的子公司,以生产高档织物面料为主营业务,主要合作者为国内外知名品牌,如adidas.NIKE.PUMA.李宁.安踏.乔丹等.现有员工600多人. 面临的挑战:1.客户需要在新的厂区备份原来厂区的业务.2.由于是生产型企业,需要与现有IT环境无缝对接,控制IT部署维护的投入.3存储设备需要高性价比.Infortrend优势:1.GS统一存储集成NAS和SAN.2.集成Rsync功能.3.EonOne人性化界面操作简单,极容易上手. GS一机多用成就大

五星好评!Infortrend统一存储获得权威杂志大力推荐

日前业界Infortrend普安科技的统一存储EonStor GS 3000 Gen2获得英国权威杂志<IT Pro>五星级好评.IT Pro对GS 3000 Gen2给出了"性能出众,价格合理"的评语.GS Gen2是Infortrend新一代的统一存储,在存储系统中同时整合SAN.NAS与云存储. 与上一代的解决方案相比,GS Gen2系列的性能提高60%以上. 当今企业的不同类型的业务往往混合在一起,例如员工使用VDI虚拟桌面和邮箱系统,业务核心数据库和远端文件共享,

项目数据库逻辑

项目数据库逻辑 数据库主要逻辑模块分为asynDBCenter,DBNet,DBSvr asynDBCenter与DBNet之间通过共享内存通信(缓存进程为了防止GS崩溃导致玩家数据丢失,并且在DBNet里面可以做定时存储) 这里的共享内存有点复杂 1.发包类型的,就是跟GS与Net之间的相似带回收类型的 2.不带回收的,每个玩家独占一个小块,只有玩家独占,当服务器蹦了玩家数据可以存储数据库 3.对于道具由于玩家身上的道具数量众多,不可能有那么多内存分给,当玩家装备属性发生变化时将其放到共享内存