游戏服务器之基于文件数据库和mysql数据库的db服务器设计
2014-06-19 00:01
453 查看
设计上:
(1)文件数据库是用于处理游戏逻辑业务请求。
(2)mysql数据库是用于处理运营后台查询请求。
(3)备份业务是用于定时备份文件数据库文件。
总体设计图如 http://blog.csdn.net/chenjiayi_yun/article/details/11913207
文件数据库业务设计 可查看 http://blog.csdn.net/chenjiayi_yun/article/details/17880275
本文目录:
1、角色数据更新请求
2、mysql业务线程循环处理更新请求
3、文件数据库业务线程循环处理更新请求
4、备份业务线程循环处理备份业务
本文内容:
1、角色数据更新请求
保存角色数据请求,提交到业务线程队列
保存角色描述数据,提交到文件数据库角色描述数据更新列表和mysql角色描述数据更新列表。
保存角色具体数据,提交到文件数据库角色数据更新列表和mysql角色数据更新列表。
VOID CDBDataClient::CatchSaveCharData(CDataPacketReader &inPacket)
{
INT64 nCharId;
DWORD dwDataSize;
inPacket >> nCharId;
inPacket >> dwDataSize;
CGameDataBuffer *pBuffer = m_pDataServer->AllocGameDataBuffer();
pBuffer->AddRef();
pBuffer->SetData(nCharId, inPacket.getOffsetPtr(), dwDataSize);
CharDesc *pCharDesc = m_pLocalDB->GetCharDesc(nCharId);
if (pCharDesc)
{
//跳过角色基本数据头结构
common::DBType::PlayerBasicData *pBaseData =(common::DBType::PlayerBasicData *)\
pBuffer->getPositionPtr(sizeof(common::DBType::DataSectionHeader));
//发起对角色描述数据的更新
pCharDesc->wLevel = pBaseData->wLevel;
pCharDesc->btGender = pBaseData->btGender;
pCharDesc->nUpdateTime = CMiniDateTime::now();
m_pLocalDB->PostUpdateCharDesc(pCharDesc);
m_pSQLDB->PostUpdateCharDesc(pCharDesc);
}
else logError( _T("试图更新在本地角色描述数据中找不到的角色数据(%lld)"), nCharId);
m_pLocalDB->PostUpdateCharData(pBuffer);
m_pSQLDB->PostUpdateCharData(pBuffer);
pBuffer->Release();
CDataPacket &pack = AllocProtoPacket(DBType::dsSaveCharData);
pack << (int)0;//SUCCESS
pack << nCharId;
FlushProtoPacket(pack);
}
2、mysql业务线程循环处理更新请求
mysql线程处理循环,处理数据写入mysql请求
VOID CSQLDB::OnRountine()
{
TICKCOUNT dwStartTick;
while (!terminated())
{
if (!m_boStarted)
{
moon::OS::osSleep(16);
continue;
}
//连接SQL数据库
if (!ConnectSQLDB())
{
moon::OS::osSleep(16);
continue;
}
dwStartTick = _getTickCount();
//处理角色描述更新请求
m_NewCharList.flush();
if (m_NewCharList.count() > 0)
{
ProcessAddNewChars(4);
}
m_UpdateCharDescList.flush();
if (m_UpdateCharDescList.count() > 0)
{
ProcessUpdateCharDescs(4);
}
//处理角色数据更新请求
m_CharDataUpdateList.flush();
if (m_CharDataUpdateList.count() > 0)
{
ProcessCharDataUpdate(4);
}
//处理帮会数据更新请求
m_GuildDataUpdateList.flush();
if (m_GuildDataUpdateList.count() > 0)
{
ProcessGuildDataUpdate(4);
}
moon::OS::osSleep(4);
}
}
3、文件数据库业务线程循环处理更新请求
VOID CLocalDB::OnRountine()
{
TICKCOUNT dwStartTick;
TICKCOUNT dwBackupTick = 0;
while (!terminated())
{
if (!m_boOpened)
{
osSleep(16);
continue;
}
dwStartTick = _getTickCount();
if ((m_nBackupInterval) && (0 == dwBackupTick))
dwBackupTick = _getTickCount();
//处理角色描述更新请求
m_CharDescUpdateList.flush();
if (m_CharDescUpdateList.count() > 0)
{
ProcessCharDescUpdate(4);
}
//处理角色数据更新请求
m_CharDataUpdateList.flush();
if (m_CharDataUpdateList.count() > 0)
{
ProcessCharDataUpdate(4);
}
//处理帮会数据更新请求
m_GuildDataUpdateList.flush();
if (m_GuildDataUpdateList.count() > 0)
{
ProcessGuildDataUpdate(4);
}
if ((m_nBackupInterval) && ((INT)(_getTickCount() - dwBackupTick) >= m_nBackupInterval))//每隔一段时间(目前48小时)
{
BackupFDBFiles();
m_ZipBackup.StartZipBackup();//发送信号通知备份业务线程处理备份业务
dwBackupTick = 0;
}
osSleep(4);
}
}
4、备份业务线程循环处理备份业务
备份业务线程阻塞等待通知来处理文件数据库的文件的备份业务。
VOID CZipBackup::OnRountine()
{
#ifdef WINDOWS
m_hZipBackupEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL);
#else
pthread_cond_init(&m_hZipBackupEvent, NULL);
#endif
while (!terminated())
{
#ifdef WINDOWS
::WaitForSingleObject(m_hZipBackupEvent, INFINITE);
#else
pthread_mutex_lock( &m_tx );
pthread_cond_wait( &m_hZipBackupEvent , &m_tx );
pthread_mutex_unlock( &m_tx );
#endif
if (terminated())
break;
DoZipBackup();
CleanBackupFiles();
osSleep(10);
}
#ifdef WINDOWS
::CloseHandle(m_hZipBackupEvent);
m_hZipBackupEvent = NULL;
#else
pthread_cond_destroy(&m_hZipBackupEvent);
#endif
}
(1)文件数据库是用于处理游戏逻辑业务请求。
(2)mysql数据库是用于处理运营后台查询请求。
(3)备份业务是用于定时备份文件数据库文件。
总体设计图如 http://blog.csdn.net/chenjiayi_yun/article/details/11913207
文件数据库业务设计 可查看 http://blog.csdn.net/chenjiayi_yun/article/details/17880275
本文目录:
1、角色数据更新请求
2、mysql业务线程循环处理更新请求
3、文件数据库业务线程循环处理更新请求
4、备份业务线程循环处理备份业务
本文内容:
1、角色数据更新请求
保存角色数据请求,提交到业务线程队列
保存角色描述数据,提交到文件数据库角色描述数据更新列表和mysql角色描述数据更新列表。
保存角色具体数据,提交到文件数据库角色数据更新列表和mysql角色数据更新列表。
VOID CDBDataClient::CatchSaveCharData(CDataPacketReader &inPacket)
{
INT64 nCharId;
DWORD dwDataSize;
inPacket >> nCharId;
inPacket >> dwDataSize;
CGameDataBuffer *pBuffer = m_pDataServer->AllocGameDataBuffer();
pBuffer->AddRef();
pBuffer->SetData(nCharId, inPacket.getOffsetPtr(), dwDataSize);
CharDesc *pCharDesc = m_pLocalDB->GetCharDesc(nCharId);
if (pCharDesc)
{
//跳过角色基本数据头结构
common::DBType::PlayerBasicData *pBaseData =(common::DBType::PlayerBasicData *)\
pBuffer->getPositionPtr(sizeof(common::DBType::DataSectionHeader));
//发起对角色描述数据的更新
pCharDesc->wLevel = pBaseData->wLevel;
pCharDesc->btGender = pBaseData->btGender;
pCharDesc->nUpdateTime = CMiniDateTime::now();
m_pLocalDB->PostUpdateCharDesc(pCharDesc);
m_pSQLDB->PostUpdateCharDesc(pCharDesc);
}
else logError( _T("试图更新在本地角色描述数据中找不到的角色数据(%lld)"), nCharId);
m_pLocalDB->PostUpdateCharData(pBuffer);
m_pSQLDB->PostUpdateCharData(pBuffer);
pBuffer->Release();
CDataPacket &pack = AllocProtoPacket(DBType::dsSaveCharData);
pack << (int)0;//SUCCESS
pack << nCharId;
FlushProtoPacket(pack);
}
2、mysql业务线程循环处理更新请求
mysql线程处理循环,处理数据写入mysql请求
VOID CSQLDB::OnRountine()
{
TICKCOUNT dwStartTick;
while (!terminated())
{
if (!m_boStarted)
{
moon::OS::osSleep(16);
continue;
}
//连接SQL数据库
if (!ConnectSQLDB())
{
moon::OS::osSleep(16);
continue;
}
dwStartTick = _getTickCount();
//处理角色描述更新请求
m_NewCharList.flush();
if (m_NewCharList.count() > 0)
{
ProcessAddNewChars(4);
}
m_UpdateCharDescList.flush();
if (m_UpdateCharDescList.count() > 0)
{
ProcessUpdateCharDescs(4);
}
//处理角色数据更新请求
m_CharDataUpdateList.flush();
if (m_CharDataUpdateList.count() > 0)
{
ProcessCharDataUpdate(4);
}
//处理帮会数据更新请求
m_GuildDataUpdateList.flush();
if (m_GuildDataUpdateList.count() > 0)
{
ProcessGuildDataUpdate(4);
}
moon::OS::osSleep(4);
}
}
3、文件数据库业务线程循环处理更新请求
VOID CLocalDB::OnRountine()
{
TICKCOUNT dwStartTick;
TICKCOUNT dwBackupTick = 0;
while (!terminated())
{
if (!m_boOpened)
{
osSleep(16);
continue;
}
dwStartTick = _getTickCount();
if ((m_nBackupInterval) && (0 == dwBackupTick))
dwBackupTick = _getTickCount();
//处理角色描述更新请求
m_CharDescUpdateList.flush();
if (m_CharDescUpdateList.count() > 0)
{
ProcessCharDescUpdate(4);
}
//处理角色数据更新请求
m_CharDataUpdateList.flush();
if (m_CharDataUpdateList.count() > 0)
{
ProcessCharDataUpdate(4);
}
//处理帮会数据更新请求
m_GuildDataUpdateList.flush();
if (m_GuildDataUpdateList.count() > 0)
{
ProcessGuildDataUpdate(4);
}
if ((m_nBackupInterval) && ((INT)(_getTickCount() - dwBackupTick) >= m_nBackupInterval))//每隔一段时间(目前48小时)
{
BackupFDBFiles();
m_ZipBackup.StartZipBackup();//发送信号通知备份业务线程处理备份业务
dwBackupTick = 0;
}
osSleep(4);
}
}
4、备份业务线程循环处理备份业务
备份业务线程阻塞等待通知来处理文件数据库的文件的备份业务。
VOID CZipBackup::OnRountine()
{
#ifdef WINDOWS
m_hZipBackupEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL);
#else
pthread_cond_init(&m_hZipBackupEvent, NULL);
#endif
while (!terminated())
{
#ifdef WINDOWS
::WaitForSingleObject(m_hZipBackupEvent, INFINITE);
#else
pthread_mutex_lock( &m_tx );
pthread_cond_wait( &m_hZipBackupEvent , &m_tx );
pthread_mutex_unlock( &m_tx );
#endif
if (terminated())
break;
DoZipBackup();
CleanBackupFiles();
osSleep(10);
}
#ifdef WINDOWS
::CloseHandle(m_hZipBackupEvent);
m_hZipBackupEvent = NULL;
#else
pthread_cond_destroy(&m_hZipBackupEvent);
#endif
}
相关文章推荐
- 游戏服务器之基于文件数据库和mysql数据库的db服务器设计
- 基于MYSQL的 网络游戏 多线程 数据库 服务器 设计与实现
- 游戏任务成就体系的实现(附七):成就系统基于Redis的数据库访问设计实现
- 游戏任务成就体系的实现(附三):成就系统基于Mysql+Cache的数据库访问设计实现
- 基于图片分离的文件系统设计(基于fastdfs) - 数据库存储部分
- 游戏服务器之文件数据库
- 基于codeigniter框架写的网站日志系统适配器(支持写入本地文件、数据库、远程服务器)
- 基于内存,redis,mysql的高速游戏数据服务器设计架构
- 基于内存,redis,mysql的高速游戏数据服务器设计架构
- 基于ACE设计一个c++网络游戏服务器框架引擎
- 棋牌游戏服务器架构: 详细设计(三) 数据库设计
- 有关游戏服务器设计的系列文件(转自GAMERES)
- 基于win平台的高性能服务器底层通信模型设计(1)
- 基于uC/OS-II的文件系统设计
- 基于嵌入式WEB的视频服务器的设计
- 基于MPEG-4的嵌入式网络视频服务器的设计方案
- 网络游戏 贸易时代的总结(一)--总体设计和登陆服务器
- 基于JDBC的数据库连接池技术研究与设计(转)
- 多服务器游戏单点登陆设计思路
- 闲着没事从别的服务器上备份过的数据库文件出现的问题