游戏服务器之数据存档(应用数据引擎redis)

本文探讨了一款游戏项目中逻辑服务器与数据服务器如何处理角色数据存档,涉及Redis和MySQL的使用。提出了启动时一次性读取所有在线角色数据的优化建议,以及改善数据服务器和逻辑服务器间通信的方案,强调了数据读写线程的重要性。
摘要由CSDN通过智能技术生成

游戏服务器之数据存档:把逻辑服务器的角色数据存档到mysql和redis,分析的是较早前的一个游戏项目的存档处理。有些设计缺点,会提出优化方式。


设计上:

逻辑服务器在其逻辑线程里读写数据,数据缓存在redis。数据服务器接收消息,并执行写sql和备份写sql和记录存档日志(分线程来写)。写sql的执行都有备份。


有些需要优化的点:

所有的在线角色的数据在游戏启动时就读到逻辑服务器。

所有的有关数据引擎(redis和mysql)的操作在数据服务器的逻辑线程里处理。

数据服务器和逻辑服务器使用自定义存档消息来存档。可考虑分标签的角色存档消息。


逻辑服务器

1、逻辑服务器连接数据服务器

2、数据读写

(1)保存玩家基本数据到数据库

(1-1)玩家基本数据放入到redis中

(1-2)写mysql,发送sql消息(和表名)到数据服务器

(2)加载玩家基本数据

(2-1)从redis加载

(2-2)在redis上没有,就从mysql上读取然后再存到redis上


数据服务器

1、sql备份文件

执行写sql并备份sql到文件

(1)加载sql备份文件 

(2)消息放到db处理线程的队列

2、处理网络消息(逻辑服务器发来的sql)

3、db线程的消息处理

(1)备份sql到文件

(2)执行sql

(3)写备份日志



逻辑服务器

1、逻辑服务器连接数据服务器

注册句柄到ace反应器
CDBMsgServer tmpDBMsgServer = CConfigManager::instance()->get_srv_config().get_dbmsg_server_conf();
string dbMsgServerIp = tmpDBMsgServer.get_ip();
int dbMsgServerPort = tmpDBMsgServer.get_port();
CConnectDBMsg* tmpConnectDBMsg = get_connect_dbmsg();
if(false == tmpConnectDBMsg->connect_server(dbMsgServerIp.c_str(),dbMsgServerPort))//连接对端地址
{
return false;
}
ACE_Reactor::instance()->register_handler(tmpConnectDBMsg,ACE_Event_Handler::READ_MASK);


2、数据读写

这里的数据的读写最好是需要在一个数据读写线程里的处理,可以实现异步。

(1)保存玩家基本数据到数据库
void CMsgProcessCenter::player_base_insert_db(CGamePlayer* player)
{
...
(1-1)玩家基本数据放入到redis中
CRWRedisClientOperator::instance()->player_base_insert_db_redis(player);

 ...
char tm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值