//最近数据库存储做了重大改变,数据库内部的回头再说,先看看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. LeetCode OJ-- Distinct Subsequences ** 递推

    https://oj.leetcode.com/problems/distinct-subsequences/ 对于string S 和 T求,T 是 S的几种子串. 首先想到了递归方法,列出递归公式 ...

  2. 使用UICollectionView遇到的各种坑

    1)头视图和尾部视图的添加 UICollectionReusableView *headerView = [collectionView dequeueReusableSupplementaryVie ...

  3. Codeforces 912E Prime Gift(预处理 + 双指针 + 二分答案)

    题目链接 Prime Gift 题意  给定一个素数集合,求第k小的数,满足这个数的所有质因子集合为给定的集合的子集. 保证答案不超过$10^{18}$ 考虑二分答案. 根据折半的思想,首先我们把这个 ...

  4. 10.1综合强化刷题 Day3 morning

    竞赛时间:????年??月??日??:??-??:?? 题目名称 a b c 名称 a b c 输入 a.in b.in c.in 输出 a.out b.out c.out 每个测试点时限 1s 1s ...

  5. springboot 2.0.8 跳转jsp页面

    springboot项目创建教程 https://blog.csdn.net/q18771811872/article/details/88126835 springboot 2.0跳转 html教程 ...

  6. Akka之Circuit Breaker

    这周在项目中遇到了一个错误,就是Circuit Breaker time out.以前没有接触过,因此学习了下akka的断路器. 一.为什么使用Circuit Breaker 断路器是为了防止分布式系 ...

  7. Artix : Arch拥抱OpenRC 使用笔记

    轻量桌面Archlinux用户逃离systemd,拥抱Gentoo的openrc. 镜像源:官方镜像源非常慢,曾经一度体验artix后就放弃了,后来发现了清华和腾讯云的镜像,速度非常快,现在又重新安装 ...

  8. Android 监听双卡信号强度(附完整代码)

    Android 监听双卡信号强度 监听单卡信号强度 监听单卡的信号强度非常简单直接用TelephonyManager.listen()去监听sim卡的信号强度. TelephonyManager = ...

  9. struts2中迭代的使用方法

    struts2  Html代码   <s:iterator value="resultList" id="user" status="st&qu ...

  10. nginx phase handler的原理和选择

    nginx phase handler的原理和选择 PHASE HANDLER的种类 nginx在接收并解析完请求行.请求头之后.就会依次调用各个phase handler. phase handle ...