//最近数据库存储做了重大改变,数据库内部的回头再说,先看看GS这边的
.现在感觉数据库的状态将请求包放入命令队列中,以前是全部放进去,这样让其他的数据库操作不会随着数据库定时器而变慢,GS线程去驱动,一分钟不太可能还存不完
.差异更新,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()
{
//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( * );
}
//定时获取
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 >= && 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();//关闭定时器
}

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

  1. Cookie的临时存储和定时存储

    Cookie解决了不同请求的数据共享问题.是由服务器保存在客户端的小文本文件,包含了用户的信息,可以避免用户重复输入用户名和密码进行登录.浏览器请求Cookie,服务器响应时返回Cookie,浏览器存 ...

  2. iNeuOS工业互联网操作系统,发布实时存储方式:实时存储、变化存储、定时存储,增加设备振动状态和电能状态监测驱动,v3.6.2

    目       录 1.      概述... 1 2.      平台演示... 2 3.      存储方式... 2 4.      设备状态和用电状态监控驱动... 3 1.   概述 本次升 ...

  3. GS初始化

    开启GameServer模式 init函数,现在看看这个大函数干什么的 //这个init也是GameServerUI里面调的,这个线程其实就做了一些初始化的工作,其实这里面没有什么主不主线程,都是在一 ...

  4. 再看GS线程

    再看GS线程 void GameServer::ProcessThreadTry() { ; packet rcvPkt; rcvPkt.data = * ]; //该事件工厂主要创建了两个定时器1. ...

  5. Qt编写安防视频监控系统13-视频存储

    一.前言 一般视频监控行业都会选择把视频存储在本地NVR或者服务器上,而不是存储在客户端电脑,只有当用户经费预算有限的时候,或者用户特殊需求要求存储在本地客户端电脑的时候才会开启存储到本地,正常来说视 ...

  6. 我是如何在SQLServer中处理每天四亿三千万记录的

    首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...

  7. 【转】我是如何在SQLServer中处理每天四亿三千万记录的

    原文转自:http://blog.jobbole.com/80395/ 首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文 ...

  8. redis学习教程之一基本命令

    参阅redis中文的 互动教程(interactive tutorial)来学习的. 目录: 全局操作 get  get incr  自增 del 删除 expire 定时 list  队列 set ...

  9. 如何在SQLServer中处理每天四亿三千万记录

    首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...

随机推荐

  1. 记录: 百度webuploader 分片文件上传java服务器端(spring mvc)示例的优化

    最近项目上用到文件分片上传,于是找到了百度的一个开源前端控件webuploader. 于是尝试使用. 下载下来后,它提供的服务器端示例代码是php版的,那么Java版的呢? 其实,上传文件都是按照rf ...

  2. A Wasserstein Distance[贪心/模拟]

    链接:https://www.nowcoder.com/acm/contest/91/A来源:牛客网 最近对抗生成网络(GAN)很火,其中有一种变体WGAN,引入了一种新的距离来提高生成图片的质量.这 ...

  3. memcached的内存管理与删除机制

    memcached的内存管理与删除机制 简介 注意:Memcache最大的value也只能是1M的空间,超过1M的数据无法保存(修改memcache源代码).   注意:内存碎片化永远都存在,只是哪一 ...

  4. luogu P3376 【模板】网络最大流(no)ek

    题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行 ...

  5. [TJOI2014] 上升子序列

    刚刚做的时候一看:这不是个傻逼题吗hhhhh....然后发现写完了过不了样例,仔细一看题:同构的算一种. 这可咋办啊? 其实很简单,设f[i] 为 以a[i] 结尾的上升子序列个数,我们考虑当前如果算 ...

  6. 2016北京集训测试赛(十)Problem A: azelso

    Solution 我们把遇到一个旗子或者是遇到一个敌人称为一个事件. 这一题思路的巧妙之处在于我们要用\(f[i]\)表示从\(i\)这个事件一直走到终点这段路程中, \(i\)到\(i + 1\)这 ...

  7. Java中的文件上传(原始Servlet实现)

    从原始的Servlet来实现文件的上传,代码如下: 参考:https://my.oschina.net/Barudisshu/blog/150026 采用的是Multipart/form-data的方 ...

  8. Python模拟浏览器上传文件脚本(Multipart/form-data格式)

    http协议本身的原始方法不支持multipart/form-data请求,这个请求由原始方法演变而来的. multipart/form-data的基础方法是post,也就是说是由post方法来组合实 ...

  9. AngularJS中Route例子

    代码:https://files.cnblogs.com/files/xiandedanteng/angularJSRouteSample.rar 点击‘首页’后: 点击‘电脑’后: <!DOC ...

  10. 解释一下Windows dos中的符号

    容许我放一段Windows的批处理: sc <server> [command] [service name] <option1> <option2>... < ...