GS(道具,帮会)定时存储
//最近数据库存储做了重大改变,数据库内部的回头再说,先看看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(道具,帮会)定时存储的更多相关文章
- Cookie的临时存储和定时存储
Cookie解决了不同请求的数据共享问题.是由服务器保存在客户端的小文本文件,包含了用户的信息,可以避免用户重复输入用户名和密码进行登录.浏览器请求Cookie,服务器响应时返回Cookie,浏览器存 ...
- iNeuOS工业互联网操作系统,发布实时存储方式:实时存储、变化存储、定时存储,增加设备振动状态和电能状态监测驱动,v3.6.2
目 录 1. 概述... 1 2. 平台演示... 2 3. 存储方式... 2 4. 设备状态和用电状态监控驱动... 3 1. 概述 本次升 ...
- GS初始化
开启GameServer模式 init函数,现在看看这个大函数干什么的 //这个init也是GameServerUI里面调的,这个线程其实就做了一些初始化的工作,其实这里面没有什么主不主线程,都是在一 ...
- 再看GS线程
再看GS线程 void GameServer::ProcessThreadTry() { ; packet rcvPkt; rcvPkt.data = * ]; //该事件工厂主要创建了两个定时器1. ...
- Qt编写安防视频监控系统13-视频存储
一.前言 一般视频监控行业都会选择把视频存储在本地NVR或者服务器上,而不是存储在客户端电脑,只有当用户经费预算有限的时候,或者用户特殊需求要求存储在本地客户端电脑的时候才会开启存储到本地,正常来说视 ...
- 我是如何在SQLServer中处理每天四亿三千万记录的
首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...
- 【转】我是如何在SQLServer中处理每天四亿三千万记录的
原文转自:http://blog.jobbole.com/80395/ 首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文 ...
- redis学习教程之一基本命令
参阅redis中文的 互动教程(interactive tutorial)来学习的. 目录: 全局操作 get get incr 自增 del 删除 expire 定时 list 队列 set ...
- 如何在SQLServer中处理每天四亿三千万记录
首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...
随机推荐
- Cryptography I 学习笔记 --- 分组密码
1. 伪随机置换(PRF,Rseudo Random Permutaion)3DES/AES,K*X -> X(a. 可以高效计算,b. PRF函数是一个一一映射的函数,c. 存在有效的逆向算法 ...
- slam学习足迹
1.slam入门介绍 2.齐次坐标系 3.贝叶斯滤波 均值:平均值 标准差:样本的集中程度/分散度 方差:标准差的平方 协方差:不同维度之间的关系(相关度) 协方差矩阵:多维度之间的关系(相关度) 4 ...
- 解决: g++: internal compiler error: Killed (program cc1plus)
现象描述:在树莓派上用qt编译二维码显示相关的UI程序时,经常报以上错误,有时候断电重启首次编译不会报错(估计是刚上电系统占用的内存比较少) g++: internal compiler error: ...
- Spring Cloud学习总结(非原创)
文章大纲 一.课程内容总结二.课程学习地址三.学习资料下载四.参考文章 一.课程内容总结 二.课程学习地址 第一天:https://www.jianshu.com/p/a086421f4bfd第二 ...
- kafka消费者客户端
Kafka消费者 1.1 消费者与消费者组 消费者与消费者组之间的关系 每一个消费者都隶属于某一个消费者组,一个消费者组可以包含一个或多个消费者,每一条消息只会被消费者组中的某一个消费者所消费.不 ...
- CTAS都能带走源表的哪些属性
CREATE TABLE ... AS SELECT statement(CTAS):用CTAS语句可以根据一个存在的表创建一个新的表,而且能够根据对应的过滤条件将源表部分或者全部数据插入到新表当中. ...
- An error occurred uploading to the iTunes Store - Please upgrade Java
Yesterday there were an update to Jave (1.6.0_31) in the "Software update", but now when I ...
- 【mob】Android短信验证+源码
在很多的应用当中,都涉及到了短信验证的功能,比如在注册或者找回密码的时候,那么我们如何通过第三方的平台来完成这个功能呢? 本面博文就实现短信验证,来做一个小的栗子. 第一步-下载开发包 第二步-将SD ...
- hdu1420(C++)
数论中模的运算: a*b%n=(a%n)*(b%n)%c; (a+b)%n=(a%n+b%n)%n; 幂的模:A^n%c=r 于是A^(n+1)%c=A*r%c; #include<ios ...
- 课程设计之"网络考试系统"(php、Extjs)
1.TestSystem大概结构框图 2.数据库设计(11张表) 数据库名称:db_testsystem 数据库表: tb_admin 记录题库管理员帐户信息 代码 tb_allcontent 记录随 ...