游戏服务器中的数据库异步操作技术和游戏数据的保存机制

   在游戏服务器中,处理玩家登陆需要向数据库查询玩家的账号和密码,玩家上线和下线需要对玩家的角色数据从数据库中读取和保存。可以说,相对于游戏逻辑处理来说,数据库操作是一种相对很慢的操作,即便你通过使用多个线程多个数据库连接来提高数据库操作的处理能力,但是,在高并发高负载的服务器应用中,这样仍然会是相当的负载瓶颈。设想这样一种设计方案,见下图:

    在大量玩家登陆游戏服务器时,由于有大量的数据库访问请求,即便是有自己实现的CACHE机制,还是会导致服务器耗尽所有的逻辑线程资源,服务器的处理能力将降低成DBMS的处理能力。
    
     为了不阻塞逻辑线程,可以采用异步数据库访问的方式,即数据库操作请求提交给专门的数据库处理线程池,然后逻辑线程不再等待数据库处理结果,继续处理其他,不再阻塞在这里。
     抽象的来看,对于一个需要持久化的游戏对象来说,可以考虑它有2个方法,读取和保存。那么我们抽象一个DBO接口:
   

struct  IDbo
{
    
virtual bool SaveToDB(DB*)=0;
    
virtual bool LoadFromDB(DB*)=0;
}
;

   
     然后把设计方案改成下面这种:

 

     改成数据库异步处理后,在想想现在的游戏数据的保存机制应该是怎样改进的,为了保障数据安全,我们希望不只是玩家下线的时候才会保存玩家数据,而是希望每隔一段时间统一保存所有在线玩家的数据,那么,可以考虑这样的思路:假设我们有一个GAMEDB服务器,GAMEDB缓存了所有在线玩家的角色数据,每到保存时间,GAMEDB就将所有在线玩家的数据(DBO)的副本都统一提交给DB线程池,让它保存数据,提交的过程很快,提交完后,GAMEDB的逻辑线程仍能继续处理游戏服务器的更新和读取CACHE的请求。为什么要保存副本呢,DB线程的执行保存队列的过程也许很耗时,但是队列中的数据都是GAMEDB提交DBO那个时刻的数据,这样就能保证玩家的游戏数据的完整性。
      当然,我这里提的这只是个思路,这里面还有很多细节没有讨论,例如如果DB线程池正在保存九点钟时刻保存的数据,到了十点钟新的保存时刻时,DB线程池还没保存完九点钟时刻的DBO副本队列,这时应该怎么处理;DBO对象的划分粒度的问题;DBO队列的优先级的问题等等。

     PS:这篇文章里的架构其实就是一个GAMEDB服务器,里面的逻辑处理就是GAMEDB的逻辑处理。你可以把这篇文章理解成:一个GAMEDB服务器 的实现思路。。。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一些常见的 MySQL 和 Redis 面试题及其答案: MySQL 面试题: 1. 什么是索引?它有什么作用? 答:索引是一种数据结构,它可以加快查询速度。它通过将数据的某些列或表达式的值存储在一个单独的数据结构,使得查询能够更快地定位到所需的数据。 2. 什么是事务? 答:事务是一个操作序列,它将数据库从一个一致的状态变为另一个一致的状态。事务必须满足 ACID 属性:原子性、一致性、隔离性和持久性。 3. 什么是视图? 答:视图是一个虚拟表,它是从一个或多个表选择出来的一些列。视图的目的是简化复杂的查询,并提供更简单、更清晰的数据访问方式。 4. 什么是主键和外键? 答:主键是用于唯一标识表每个行的一列或一组列。外键是一个表的列,它与另一个表的主键列相关联。外键用于保持两个表之间的关联性。 Redis 面试题: 1. Redis 支持哪些数据结构? 答:Redis 支持字符串、哈希、列表、集合和有序集合这五种数据结构。 2. Redis 的持久化机制有哪些? 答:Redis 支持两种持久化机制:RDB 和 AOF。RDB 机制将 Redis 数据库的快照保存到磁盘上,而 AOF 机制则将 Redis 操作日志保存到磁盘上。 3. Redis 支持的数据类型,哪些数据类型是支持过期时间的? 答:Redis 的 key-value 对可以设置过期时间,其字符串和哈希支持过期时间设置。 4. Redis 的主从复制机制是什么? 答:Redis 的主从复制机制是指将一个 Redis 服务器数据复制到另一个 Redis 服务器上。主服务器数据同步到从服务器,并在后者上创建一个与前者相同的数据副本。主服务器和从服务器之间的通信是异步的,即主服务器不会等待从服务器执行操作的响应。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值