CN104601562B - 游戏服务器与数据库的交互方法和系统 - Google Patents
游戏服务器与数据库的交互方法和系统 Download PDFInfo
- Publication number
- CN104601562B CN104601562B CN201510001663.XA CN201510001663A CN104601562B CN 104601562 B CN104601562 B CN 104601562B CN 201510001663 A CN201510001663 A CN 201510001663A CN 104601562 B CN104601562 B CN 104601562B
- Authority
- CN
- China
- Prior art keywords
- data
- database
- game server
- user
- sub
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Information Transfer Between Computers (AREA)
Abstract
为提供一种高效安全的游戏服务器与数据库的交互方案,本发明披露了一种游戏服务器与数据库的交互方法,包括步骤:游戏服务器在内存中执行数据处理,并将处理结果保存于内存;游戏服务器通过多线程方式将所述处理结果同步于数据库。本发明还同时披露了实现上述方法的一种游戏服务器与数据库的交互系统。区别于现有技术,上述技术方案在网络游戏服务器程序中实现一个自动化的数据库缓存框架,让所有的数据操作都在内存中进行,之后,再通过多线程的方式,让内存数据自动地同步到数据库管理系统中,这样,就将网络游戏服务器程序对数据的操作和数据到数据库管理系统的同步操作分离,极大地提高了网络游戏服务器程序的运行效率。
Description
技术领域
本发明涉及网络游戏领域,特别涉及一种游戏服务器与数据库的交互方法和系统。
背景技术
网络游戏中包含了大量数据,这些数据主要可以分成两类:一类是动态的用户相关数据、一类是静态的系统配置数据,所有这些数据都存储在网络游戏服务器上的数据库管理系统(DBMS)中。网络游戏服务器程序在运行的过程中,需要加载、处理和保存所有这些数据,因此,网络游戏服务器程序需要频繁地和数据库管理系统进行交互。众所周知,对数据库管理系统的操作属于IO操作,相比于CPU的处理速度,IO操作所需要的处理周期是相当漫长的,因此,如何维护这些数据,便成了决定网络游戏服务器程序运行效率的一个最关键的因素。
在游戏服务器与数据库的交互中的用户数据维护和同步的过程中,需要达到两个要求上的平衡,如何在需要新的数据时,即能够保证安全性(先生成数据,后使用数据),又能够保证高效性(不需要同步操作)?目前已有的一些内存数据库方案中,都没有很好地解决这个问题。现有的方案要么是保证安全性,即在数据库管理系统中先生成这条数据,之后再在内存中加载并使用这条新数据,这样做必然导致游戏服务器进程等待,效率低;要么是保证高效性,先在内存中生成一条内存数据,然后直接使用,之后再在某个时机同步数据库管理系统,这样做效率很高,需要新数据时马上就可以取用,但是当游戏服务器进程出现异常时,有可能导致内存数据未被同步到数据库管理系统中,安全性较低。为了解决这个问题,需要提供一种既能保证安全性,又兼顾高效性的技术方案。
发明内容
为此,需要提供一种能同时兼顾安全性与高效性的游戏服务器与数据库的交互方法和系统。
为实现上述目的,发明人提供了一种游戏服务器与数据库的交互方法,包括步骤:
游戏服务器在内存中执行数据处理,并将处理结果保存于内存;
游戏服务器通过多线程方式将所述处理结果同步于数据库。
进一步地,所述的游戏服务器与数据库的交互方法中,所述数据处理包括生成用户数据;
步骤“游戏服务器在内存中执行数据处理,并将处理结果保存于内存”具体包括:
游戏服务器生成用户缓存数据记录并将其保存于内存中的缓存数据集,所述用户缓存数据记录包括一实质判别字段,所述实质判别字段的属性包括空数据或用户真实数据;
当游戏服务器判定需要生成新的用户真实数据时,在所述缓存数据集中查找是否有可用的缓存数据记录,若有则直接调取并将其中的空数据替换为所述用户真实数据,并分配同步数据修改结果任务于一第三子线程,所述第三子线程将所述处理结果同步于数据库。
进一步地,所述的游戏服务器与数据库的交互方法中,所述数据处理还包括删除用户数据;
步骤“游戏服务器在内存中执行数据处理,并将处理结果保存于内存”还包括:
游戏服务器需要删除用户真实数据时,将相应的缓存数据记录中的用户真实数据以空数据替换、修改其实质判别字段为空数据,并保存于内存中的缓存数据集;
然后分配同步数据修改结果任务于一第四子线程,所述第四子线程将所述处理结果同步于数据库。
进一步地,所述的游戏服务器与数据库的交互方法中,第三子线程或第四子线程将所述处理结果同步于数据库具体包括:
以预设频率监控用户数据修改处理;所述用户数据修改处理包括预设类别用户数据修改处理与非预设类别用户数据修改处理;
当子线程监测到预设类别用户数据发生修改处理时,以即时模式将修改处理结果同步于数据库;
当第三子线程监测到非预设类别用户数据发生修改处理时,以非即时模式将修改处理结果同步于数据库。
进一步地,所述的游戏服务器与数据库的交互方法中,所述第三子线程或第四子线程将修改处理结果同步于数据库具体包括:
以SQL合并算法对同一数据库表记录的修改SQL进行合并。
进一步地,所述的游戏服务器与数据库的交互方法中,还包括步骤:
游戏服务器开启一第五子线程,所述第五子线程用于监控缓存数据集并保证所述缓存数据集中的缓存数据记录数量处于一预设区间。
进一步地,所述的游戏服务器与数据库的交互方法中,在步骤“游戏服务器在内存中执行数据处理”之前还包括步骤:
游戏服务器从数据库中加载配置数据。
进一步地,所述的游戏服务器与数据库的交互方法中,所述配置数据包括程序数据或用户数据。
进一步地,所述的游戏服务器与数据库的交互方法中,游戏服务器从数据库中加载程序数据具体包括:
游戏服务器分配程序数据加载任务于一第一子线程,在所述第一子线程加载程序数据时,服务器主线程处于等待状态,并在收到所述第一子线程发送的程序数据加载完成通知信号后恢复运行。
进一步地,所述的游戏服务器与数据库的交互方法中,游戏服务器从数据库中加载用户数据具体包括:
服务器主线程接收用户操作请求,并将所述用户操作请求对应的用户数据加载任务分配于内存池中一第二子线程;
在所述第二子线程执行所述用户操作请求对应的用户数据加载任务时,服务器主线程不执行所述用户操作请求,并在收到所述第二子线程发送的用户数据加载任务完成通知信号后执行所述用户操作请求。
发明人同时还提供了一种游戏服务器与数据库的交互系统,包括游戏服务器与数据库;所述游戏服务器包括主处理单元、内存储单元和同步单元;
所述主处理单元用于在所述内存储单元中执行数据处理,并将处理结果保存于所述内存储单元;
所述同步单元用于通过多线程方式将所述处理结果同步于数据库。
进一步地,所述的游戏服务器与数据库的交互系统中,所述游戏服务器还包括判断单元;所述主处理单元包括数据生成模块;
所述数据生成模块用于生成用户缓存数据记录并将其保存于内存储单元中的缓存数据集,所述用户缓存数据记录包括一实质判别字段,所述实质判别字段的属性包括空数据或用户真实数据;
当判断单元判定需要生成新的用户真实数据时,数据生成模块在所述缓存数据集中查找是否有可用的缓存数据记录,若有则直接调取并将其中的空数据替换为所述用户真实数据;主处理单元分配同步数据修改结果任务于同步单元中的一第三子线程,所述第三子线程将所述处理结果同步于数据库。
进一步地,所述的游戏服务器与数据库的交互系统中,所述主处理单元还包括数据删除模块;
当判断单元判定需要删除用户真实数据时,所述数据删除模块将相应的缓存数据记录中的用户真实数据以空数据替换、修改其实质判别字段为空数据,并保存于内存储单元中的缓存数据集;
然后主处理单元分配同步数据修改结果任务于同步单元中的一第四子线程,所述第四子线程将所述处理结果同步于数据库。
进一步地,所述的游戏服务器与数据库的交互系统中,第三子线程或第四子线程将所述处理结果同步于数据库具体包括:
以预设频率监控用户数据修改处理;所述用户数据修改处理包括预设类别用户数据修改处理与非预设类别用户数据修改处理;
当第三子线程或第四子线程监测到预设类别用户数据发生修改处理时,以即时模式将修改处理结果同步于数据库;
当第三子线程或第四子线程监测到非预设类别用户数据发生修改处理时,以非即时模式将修改处理结果同步于数据库。
进一步地,所述的游戏服务器与数据库的交互系统中,所述第三子线程或第四子线程将修改处理结果同步于数据库具体包括:
以SQL合并算法对同一数据库表记录的修改SQL进行合并。
进一步地,所述的游戏服务器与数据库的交互系统中,所述同步单元还用于开启一第五子线程,所述第五子线程用于监控缓存数据集并保证所述缓存数据集中的缓存数据记录数量处于一预设区间。
进一步地,所述的游戏服务器与数据库的交互系统中,所述游戏服务器还包括配置加载单元,所述配置加载单元用于从数据库中加载配置数据。
进一步地,所述的游戏服务器与数据库的交互系统中,所述配置数据包括程序数据或用户数据。
进一步地,所述的游戏服务器与数据库的交互系统中,所述配置加载单元从数据库中加载程序数据具体包括:
配置加载单元分配程序数据加载任务于一第一子线程,在所述第一子线程加载程序数据时,所述主处理单元处于等待状态,并在收到所述第一子线程发送的程序数据加载完成通知信号后恢复运行。
进一步地,所述的游戏服务器与数据库的交互系统中,所述配置加载单元从数据库中加载用户数据具体包括:
主处理单元接收用户操作请求后,配置加载单元将所述用户操作请求对应的用户数据加载任务分配于一第二子线程;
在所述第二子线程执行所述用户操作请求对应的用户数据加载任务时,主处理单元不执行所述用户操作请求,并在收到所述第二子线程发送的用户数据加载任务完成通知信号后执行所述用户操作请求。
区别于现有技术,上述技术方案在网络游戏服务器程序中实现一个自动化的数据库缓存框架,让所有的数据操作都在内存中进行,之后,再通过多线程的方式,让内存数据自动地同步到数据库管理系统中,这样,就将网络游戏服务器程序对数据的操作(内存操作)和数据到数据库管理系统的同步(IO操作)分离,极大地提高了网络游戏服务器程序的运行效率,并由此大大提高了用户的娱乐体验。
附图说明
图1为本发明一实施方式中一种游戏服务器与数据库的交互方法的流程图;
图2为本发明一实施方式中一种游戏服务器与数据库的交互系统的结构示意图。
附图标记说明:
1-游戏服务器
2-数据库
11-主处理单元111-数据生成模块112-数据删除模块
12-内存储单元
13-同步单元
14-判断单元
15-配置加载单元
具体实施方式
为详细说明技术方案的技术内容、构造特征、所实现目的及效果,以下结合具体实施例并配合附图详予说明。
请参阅图1,为本发明一实施方式中一种游戏服务器与数据库的交互方法的流程图;所述方法包括如下步骤:
S0、游戏服务器从数据库中加载配置数据;
S1、游戏服务器在内存中执行数据处理,并将处理结果保存于内存;
S2、游戏服务器通过多线程方式将所述处理结果同步于数据库。
进一步地,步骤S0中,游戏服务器从数据库中加载的配置数据包括程序数据或用户数据。
游戏服务器从数据库中加载程序数据具体包括:
游戏服务器分配程序数据加载任务于一第一子线程,在所述第一子线程加载程序数据时,服务器主线程处于等待状态,并在收到所述第一子线程发送的程序数据加载完成通知信号后恢复运行。
游戏服务器从数据库中加载用户数据具体包括:
服务器主线程接收用户操作请求,并将所述用户操作请求对应的用户数据加载任务分配于内存池中一第二子线程;
在所述第二子线程执行所述用户操作请求对应的用户数据加载任务时,服务器主线程不执行所述用户操作请求,并在收到所述第二子线程发送的用户数据加载任务完成通知信号后执行所述用户操作请求。
进一步地,步骤S1中,所述数据处理包括生成用户数据;
步骤“游戏服务器在内存中执行数据处理,并将处理结果保存于内存”具体包括:
游戏服务器生成用户缓存数据记录并将其保存于内存中的缓存数据集,所述用户缓存数据记录包括一实质判别字段,所述实质判别字段的属性包括空数据或用户真实数据;
当游戏服务器判定需要生成新的用户真实数据时,在所述缓存数据集中查找是否有可用的缓存数据记录,若有则直接调取并将其中的空数据替换为所述用户真实数据,并分配同步数据修改结果任务于一第三子线程,所述第三子线程将所述处理结果同步于数据库。
同时,步骤S1中,所述数据处理还包括删除用户数据;
步骤“游戏服务器在内存中执行数据处理,并将处理结果保存于内存”还包括:
游戏服务器需要删除用户真实数据时,将相应的缓存数据记录中的用户真实数据以空数据替换、修改其实质判别字段为空数据,并保存于内存中的缓存数据集;
然后分配同步数据修改结果任务于一第四子线程,所述第四子线程将所述处理结果同步于数据库。
进一步地,第三子线程或第四子线程将所述处理结果同步于数据库具体包括:
以预设频率监控用户数据修改处理;所述用户数据修改处理包括预设类别用户数据修改处理与非预设类别用户数据修改处理;
当子线程监测到预设类别用户数据发生修改处理时,以即时模式将修改处理结果同步于数据库;
当子线程监测到非预设类别用户数据发生修改处理时,以非即时模式将修改处理结果同步于数据库。
进一步地,所述第三子线程或第四子线程将修改处理结果同步于数据库具体包括:
以SQL合并算法对同一数据库表记录的修改SQL进行合并。
进一步地,游戏服务器开启一第五子线程,所述第五子线程用于监控缓存数据集并保证所述缓存数据集中的缓存数据记录数量处于一预设区间。
本实施方式所述的游戏服务器与数据库的交互方法的主要思路是将游戏服务器程序的数据处理工作划分为操作与同步两个部分;并且,游戏主线程控制操作部分,用于读取和更新内存池中的缓存数据;同步部分由游戏服务器的多个同步子线程控制,用于将内存池中的缓存数据与数据库中的数据进行同步处理。
下面以一具体案例说明本实施方式所述的游戏服务器与数据库的交互方法的实现过程:
首先说明上述步骤S0中的游戏服务器从数据库中加载配置数据流程:在游戏服务器进程启动的过程中,需要从数据库管理系统中加载配置数据到内存池中供操作部分使用,这一加载任务由游戏服务器的一同步子进程执行,在加载过程中,由于游戏服务器主线程的逻辑功能尚未开启,因此采用主线程等待的方式,即在同步子线程加载配置数据时,游戏主线程阻塞,直至同步子线程完成加载配置数据的工作后,发送一个完成信号通知游戏主线程,此时游戏主线程再从阻塞状态恢复运行而逐步开启各逻辑功能。
当游戏用户登录至服务器时,存在于数据库中的与该用户相关的所有数据需要被加载到内存中以供游戏主线程操作使用。本发明的技术方案在此处采用异步方式处理该加载任务:
游戏主线程将请求登录的用户列于排队队列中,并依此将各用户的数据加载任务分配给一个空闲的同步子线程。在同步子线程加载用户相关数据的过程中,游戏主线程略过该用户的登录逻辑而执行其他任务;当同步子线程加载完成后,发送完成信号通知游戏主线程,游戏主线程则在下一个执行周期中处理该用户的登录任务、从内存池中读取该用户的所有相关数据并完成用户登录过程。
然后说明上述步骤S1中游戏服务器在内存中执行数据处理,并将处理结果保存于内存的过程:
在游戏主线程运行游戏逻辑的过程中,必然会出现需要修改存储于内存中的用户相关数据的情况,这些被修改的数据需要及时地同步到数据库管理系统中。本发明的技术方案里,所有这些同步操作都由游戏服务器主线程指定某同步子线程来完成,这将不会影响游戏主线程的效率。同时,这些执行同步操作的同步子线程会定期监视用户相关数据的状态变化情况,当发现有数据的状态被修改为某些预设值时,同步子线程将生成该数据的修改指令,将指令发送给数据库管理系统进行同步。
同步的过程要达到两个主要技术效果,其一为及时,另一为高效。然而,这两个技术效果事实上存在一定的矛盾,因为当要求及时性时,必然会损失效率,而要求高效时,及时性亦会受到相应影响。本发明的发明人实现这两个问题的最优化平衡的方案如下:
为保证及时性,需要在用户相关数据发生修改时及时将修改的数据同步到数据库管理系统中,这样当游戏服务器进程发生异常时能够保证内存数据的安全。本发明技术方案中,将用户相关数据分为两类,一类为重要数据(如金钱、经验等),另一类为非重要数据。当然其他实施方式中也可以有其他对数据的分类方式。在每个游戏主循环结束时统计这两类数据的修改量,当发现有重要数据被修改时,游戏主线程马上通知同步子线程执行数据同步任务;若发现无重要数据修改、但存在非重要数据修改,则统计自上次同步到此刻为止非重要数据被修改但尚未同步的数量,超过一预设阈值时立即通知同步子线程执行数据同步任务;否则,进一步判断自上次同步至此刻有多久未执行数据同步操作,在超过一预设时间阈值时(如5个游戏主循环时间)也立即通知同步子线程执行数据同步任务。
为保证高效性,需要使得同步子线程生成的同步SQL数量最少。鉴于在一个游戏主线程循环内,可能修改同一玩家的多项数据,而这些数据在数据库管理系统中可能属于同一记录之下。在现有技术的方案中,每次修改均生成一条SQL,这样将会造成多条SQL的低效状态。本发明技术方案中,采用一预设的SQL合并算法对同一张数据库表记录之下的修改SQL操作进行合并,将多个数据的修改合并到一条SQL当中并最终仅生成一条刷库SQL,这样将极大地提高数据库管理系统的效率。
进一步地,当游戏主线程需要为用户生成新的数据时,通常需要在数据库中插入(INSERT)一条新的记录;而由于INSERT指令是一条数据库同步指令,为得到INSERT指令的结果,游戏主线程需要阻塞、等待直至数据库返回信息。这种方式就会严重影响游戏主线程的运行效率。如何在需要新的数据时既能保证安全性(先生成数据、后使用数据)又保证高效性(不需要同步操作)就成为本发明致力于解决的一个重要课题。现有技术中对此并无很好解决方案,要么是保证安全性优先,即在数据库中先生成该数据,之后再在内存中加载该数据,这样的做法必然导致游戏服务器主线程等待的低效;要么是保证高效性优先,先在内存中生成一条内存数据而直接使用,之后在某时机同步数据库,虽然效率较高、需要新数据时可立即取用,但当游戏服务器进程出现异常时有可能导致内存数据未被同步到数据库管理系统,安全性无法得到保障。本发明技术方案中为了兼顾安全性与高效性,提出了这样的实现方法:
在数据库结构中,增加一标记字段,用于区分用户真实数据与与用户无关的空数据。在游戏服务器进程启动时,遍历每张用户相关数据表,检查其缓存数据记录的数量,当所述数量小于一预设阈值时,通过同步INSERT操作为其批量生成一批缓存数据记录,并加载置内存,存放于不同数据库表对应的缓存数据集。当游戏逻辑判断需要生成新的用户相关数据时,首先查找相关的数据库表缓存数据集,判断是否有可用的缓存数据记录,若有则直接取其中之一、将空数据设置为相应的用户真实数据并修改所述标记字段,同时将其从缓存数据集移除,而后通过同步子线程同步于数据库。
当游戏逻辑判断需要删除用户相关数据时,将该数据记录中的用户真实数据设置为空数据、修改相应的标记字段,同时将该数据记录加入缓存数据集,而后通过同步子线程同步于数据库。
此外,在游戏主线程运行过程中,开启一个缓存监控子线程,用于监控各缓存数据集以保证缓存数据集非空并且缓存数据记录数量位于一预设的区间范围。当该缓存监控子线程发现某缓存数据集中缓存数据记录的数量小于一阈值时,启动缓存补充子线程,由该子线程在数据库中INSERT新的数据记录并加载至内存和添加到相应的缓存数据集。当所述监控子线程发现某缓存数据集中缓存数据记录的数量超过一上限阈值时,启动缓存删除子线程,由该子线程在数据库中删除多余的数据记录、并在内存中同时删除这些缓存数据记录。
这样一来,所有的数据同步操作(包括插入INSER与删除DELETE)都被转移到子线程完成,游戏主线程仅执行异步数据操作UPDATE(游戏主线程只是修改内存数据,UPDATE的操作还是在同步子线程完成的),就保证了游戏主线程的高效运行,同时因为所用的缓存数据都是在数据库中已经生成的数据,故安全性亦得到保障,不会出现内存数据与数据库数据不同步的现象。
上述技术方案通过这样的方式能够极大提高游戏服务器程序的运行效率和安全性,提升用户在整个游戏过程中的娱乐体验。
请参阅图2,为本发明一实施方式中一种游戏服务器与数据库的交互系统的结构示意图。所述系统包括游戏服务器1与数据库2;所述游戏服务器1包括主处理单元11、内存储单元12和同步单元13;
所述主处理单元11用于在所述内存储单元12中执行数据处理,并将处理结果保存于所述内存储单元12;
所述同步单元13用于通过多线程方式将所述处理结果同步于数据库2。
进一步地,所述游戏服务器1还包括判断单元14;所述主处理单元11包括数据生成模块111;
所述数据生成模块111用于生成用户缓存数据记录并将其保存于内存储单元12中的缓存数据集,所述用户缓存数据记录包括一实质判别字段,所述实质判别字段的属性包括空数据或用户真实数据;
当判断单元14判定需要生成新的用户真实数据时,数据生成模块111在所述缓存数据集中查找是否有可用的缓存数据记录,若有则直接调取并将其中的空数据替换为所述用户真实数据;主处理单元11分配同步数据修改结果任务于同步单13元中的一第三子线程,所述第三子线程将所述处理结果同步于数据库。
进一步地,所述的游戏服务器与数据库的交互系统中,所述主处理单元11还包括数据删除模块112;
当判断单元14判定需要删除用户真实数据时,所述数据删除模块112将相应的缓存数据记录中的用户真实数据以空数据替换、修改其实质判别字段为空数据,并保存于内存储单元12中的缓存数据集;
然后主处理单元11分配同步数据修改结果任务于同步单元13中的一第四子线程,所述第四子线程将所述处理结果同步于数据库2。
进一步地,第三子线程或第四子线程将所述处理结果同步于数据库2具体包括:
以预设频率监控用户数据修改处理;所述用户数据修改处理包括预设类别用户数据修改处理与非预设类别用户数据修改处理;
当子线程监测到预设类别用户数据发生修改处理时,以即时模式将修改处理结果同步于数据库2;
当子线程监测到非预设类别用户数据发生修改处理时,以非即时模式将修改处理结果同步于数据库。
进一步地,所述第三子线程或第四子线程将修改处理结果同步于数据库具体包括:
以SQL合并算法对同一数据库表记录的修改SQL进行合并。
进一步地,本实施方式所述的游戏服务器与数据库的交互系统中,所述同步单元13还用于开启一第五子线程,所述第五子线程用于监控缓存数据集并保证所述缓存数据集中的缓存数据记录数量处于一预设区间。
进一步地,所述游戏服务器1还包括配置加载单元15,所述配置加载单元15用于从数据库2中加载配置数据;所述配置数据包括程序数据或用户数据。
进一步地,所述配置加载单元15从数据库2中加载程序数据具体包括:
配置加载单元15分配程序数据加载任务于一第一子线程,在所述第一子线程加载程序数据时,所述主处理单元11处于等待状态,并在收到所述第一子线程发送的程序数据加载完成通知信号后恢复运行。
进一步地,所述配置加载单元15从数据库2中加载用户数据具体包括:
主处理单元11接收用户操作请求后,配置加载单元15将所述用户操作请求对应的用户数据加载任务分配于一第二子线程;
在所述第二子线程执行所述用户操作请求对应的用户数据加载任务时,主处理单元11不执行所述用户操作请求,并在收到所述第二子线程发送的用户数据加载任务完成通知信号后执行所述用户操作请求。
下面以一具体案例说明本实施方式所述游戏服务器与数据库的交互系统的实际运作方式和实现高效和安全交互功能的过程:
首先,游戏服务器1中的配置加载单元15从数据库2中加载配置数据。在游戏服务器1进程启动的过程中,需要从数据库2中加载配置数据到内存储单元12中供操作部分使用,这一加载任务由游戏服务器1中同步单元13的一同步子进程执行,在加载过程中,由于游戏服务器1的主处理单元11的逻辑功能尚未开启,因此采用主线程等待的方式,即在同步子线程加载配置数据时,游戏主线程阻塞,直至同步子线程完成加载配置数据的工作后,发送一个完成信号通知游戏主线程,此时游戏主线程再从阻塞状态恢复运行而逐步开启各逻辑功能。
当游戏用户登录至游戏服务器1时,存在于数据库2中的与该用户相关的所有数据需要被加载到内存储单元12中以供游戏服务器1的主处理单元11操作使用。本发明的技术方案在此处采用异步方式处理该加载任务:
主处理单元11将请求登录的用户列于排队队列中,并依次将各用户的数据加载任务分配给同步单元13中的一个空闲的同步子线程。在同步子线程加载用户相关数据的过程中,主处理单元11略过该用户的登录逻辑而执行其他任务;当同步子线程加载完成后,发送完成信号通知主处理单元11,主处理单元11则在下一个执行周期中处理该用户的登录任务、从内存储单元12中读取该用户的所有相关数据并完成用户登录过程。
然后,游戏服务器1的主处理单元11在内存储单元12中执行数据处理,并将处理结果保存于所述内存储单元12:
在主处理单元11运行游戏逻辑的过程中,必然会出现需要修改存储于内存储单元12中的用户相关数据的情况,这些被修改的数据需要及时地同步到数据库2中。本发明的技术方案里,所有这些同步操作都由主处理单元11指定同步单元13中的某同步子线程来完成,这将不会影响游戏主线程的效率。同时,这些执行同步操作的同步子线程会定期监视用户相关数据的状态变化情况,当发现有数据的状态被修改为某些预设值时,同步子线程将生成该数据的修改指令,将指令发送给数据库2进行同步。
同步的过程要达到两个主要技术效果,其一为及时,另一为高效。然而,这两个技术效果事实上存在一定的矛盾,因为当要求及时性时,必然会损失效率,而要求高效时,及时性亦会受到相应影响。本发明的发明人实现这两个问题的最优化平衡的方案如下:
为保证及时性,需要在用户相关数据发生修改时及时将修改的数据同步到数据库2中,这样当游戏服务器1进程发生异常时能够保证内存数据的安全。本发明技术方案中,将用户相关数据分为两类,一类为重要数据(如金钱、经验等),另一类为非重要数据。当然其他实施方式中也可以有其他对数据的分类方式。在每个游戏主循环结束时统计这两类数据的修改量,当发现有重要数据被修改时,主处理单元11马上通知同步单元13的同步子线程执行数据同步任务;若发现无重要数据修改、但存在非重要数据修改,则统计自上次同步到此刻为止非重要数据被修改但尚未同步的数量,超过一预设阈值时立即通知同步子线程执行数据同步任务;否则,进一步判断自上次同步至此刻有多久未执行数据同步操作,在超过一预设时间阈值时(如5个游戏主循环时间)也立即通知同步子线程执行数据同步任务。
为保证高效性,需要使得同步子线程生成的同步SQL数量最少。鉴于在一个游戏主线程循环内,可能修改同一玩家的多项数据,而这些数据在数据库管理系统中可能属于同一记录之下。在现有技术的方案中,每次修改均生成一条SQL,这样将会造成多条SQL的低效状态。本发明技术方案中,同步单元13采用一预设的SQL合并算法对同一张数据库表记录之下的修改SQL操作进行合并,将多个数据的修改合并到一条SQL当中并最终仅生成一条刷库SQL,这样将极大地提高数据库管理系统的效率。
进一步地,当游戏服务器1中的判断单元14判定需要为用户生成新的数据时,通常需要在数据库中插入(INSERT)一条新的记录;而由于INSERT指令是一条数据库同步指令,为得到INSERT指令的结果,主处理单元11需要阻塞、等待直至数据库2返回信息。这种方式就会严重影响游戏主线程的运行效率。如何在需要新的数据时既能保证安全性(先生成数据、后使用数据)又保证高效性(不需要同步操作)就成为本发明致力于解决的一个重要课题。现有技术中对此并无很好解决方案,要么是保证安全性优先,即在数据库2中先生成该数据,之后再在内存中加载该数据,这样的做法必然导致主处理单元11等待的低效;要么是保证高效性优先,先在内存中生成一条内存数据而直接使用,之后在某时机同步数据库2,虽然效率较高、需要新数据时可立即取用,但当游戏服务器1进程出现异常时有可能导致内存数据未被同步到数据库2,安全性无法得到保障。本发明技术方案中为了兼顾安全性与高效性,提出了这样的实现方法:
在数据库2结构中,增加一标记字段,用于区分用户真实数据与与用户无关的空数据。在游戏服务器1进程启动时,遍历每张用户相关数据表,检查其缓存数据记录的数量,当所述数量小于一预设阈值时,通过同步INSERT操作为其批量生成一批缓存数据记录,并加载至内存,存放于不同数据库表对应的缓存数据集。当判断单元14判断需要生成新的用户相关数据时,首先查找相关的数据库表缓存数据集,判断是否有可用的缓存数据记录,若有则直接取其中之一、将空数据设置为相应的用户真实数据并修改所述标记字段,同时将其从缓存数据集移除,而后通过同步子线程同步于数据库2。
当判断单元14判断需要删除用户相关数据时,将该数据记录中的用户真实数据设置为空数据、修改相应的标记字段,同时将该数据记录加入缓存数据集,而后通过同步子线程同步于数据库2。
此外,在主处理单元11运行过程中,将开启一个同步单元13中的缓存监控子线程,用于监控各缓存数据集以保证缓存数据集非空并且缓存数据记录数量位于一预设的区间范围。当该缓存监控子线程发现某缓存数据集中缓存数据记录的数量小于一阈值时,启动缓存补充子线程,由该子线程在数据库中INSERT新的数据记录并加载至内存和添加到相应的缓存数据集。当所述监控子线程发现某缓存数据集中缓存数据记录的数量超过一上限阈值时,启动缓存删除子线程,由该子线程在数据库中删除多余的数据记录、并在内存中同时删除这些缓存数据记录。
这样一来,所有的数据同步操作(包括插入INSER与删除DELETE)都被转移到内存储单元12中的子线程完成,游戏主线程仅执行异步数据操作UPDATE(游戏主线程只是修改内存数据,UPDATE的操作还是由同步子线程完成),主处理单元11仅执行异步数据操作UPDATE,就保证了游戏主线程的高效运行,同时因为所用的缓存数据都是在数据库2中已经生成的数据,故安全性亦得到保障,不会出现内存数据与数据库数据不同步的现象。
上述技术方案通过这样的方式能够极大提高游戏服务器程序的运行效率和安全性,提升用户在整个游戏过程中的娱乐体验。
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括……”或“包含……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的要素。此外,在本文中,“大于”、“小于”、“超过”等理解为不包括本数;“以上”、“以下”、“以内”等理解为包括本数。
本领域内的技术人员应明白,上述各实施例可提供为方法、装置、或计算机程序产品。这些实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。上述各实施例涉及的方法中的全部或部分步骤可以通过程序来指令相关的硬件来完成,所述的程序可以存储于计算机设备可读取的存储介质中,用于执行上述各实施例方法所述的全部或部分步骤。所述计算机设备,包括但不限于:个人计算机、服务器、通用计算机、专用计算机、网络设备、嵌入式设备、可编程设备、智能移动终端、智能家居设备、穿戴式智能设备、车载智能设备等;所述的存储介质,包括但不限于:RAM、ROM、磁碟、磁带、光盘、闪存、U盘、移动硬盘、存储卡、记忆棒、网络服务器存储、网络云存储等。
上述各实施例是参照根据实施例所述的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到计算机设备的处理器以产生一个机器,使得通过计算机设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机设备以特定方式工作的计算机设备可读存储器中,使得存储在该计算机设备可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机设备上,使得在计算机设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已经对上述各实施例进行了描述,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改,所以以上所述仅为本发明的实施例,并非因此限制本发明的专利保护范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围之内。
Claims (16)
1.一种游戏服务器与数据库的交互方法,包括步骤:
游戏服务器在内存中执行数据处理,所述数据处理包括生成用户数据,具体包括:游戏服务器生成用户缓存数据记录并将其保存于内存中的缓存数据集,所述用户缓存数据记录包括一实质判别字段,所述实质判别字段的属性包括空数据或用户真实数据;
当游戏服务器判定需要生成新的用户真实数据时,在所述缓存数据集中查找是否有可用的缓存数据记录,若有则直接调取并将其中的空数据替换为所述用户真实数据,并分配同步数据修改结果任务于一第三子线程,所述第三子线程将所述处理结果同步于数据库,并将处理结果保存于内存;
游戏服务器通过多线程方式将所述处理结果同步于数据库。
2.如权利要求1所述的游戏服务器与数据库的交互方法中,所述数据处理还包括删除用户数据;
步骤“游戏服务器在内存中执行数据处理,并将处理结果保存于内存”还包括:
游戏服务器需要删除用户真实数据时,将相应的缓存数据记录中的用户真实数据以空数据替换、修改其实质判别字段为空数据,并保存于内存中的缓存数据集;
然后分配同步数据修改结果任务于一第四子线程,所述第四子线程将所述处理结果同步于数据库。
3.如权利要求1或2所述的游戏服务器与数据库的交互方法中,所述第三子线程或第四子线程将修改处理结果同步于数据库具体包括:
以SQL合并算法对同一数据库表记录的修改SQL进行合并。
4.如权利要求1所述的游戏服务器与数据库的交互方法中,还包括步骤:
游戏服务器开启一第五子线程,所述第五子线程用于监控缓存数据集并保证所述缓存数据集中的缓存数据记录数量处于一预设区间。
5.如权利要求1所述的游戏服务器与数据库的交互方法中,在步骤“游戏服务器
在内存中执行数据处理”之前还包括步骤:
游戏服务器从数据库中加载配置数据。
6.如权利要求5所述的游戏服务器与数据库的交互方法中,所述配置数据包括程序数据或用户数据。
7.如权利要求6所述的游戏服务器与数据库的交互方法中,游戏服务器从数据库中加载程序数据具体包括:
游戏服务器分配程序数据加载任务于一第一子线程,在所述第一子线程加载程序数据时,服务器主线程处于等待状态,并在收到所述第一子线程发送的程序数据加载完成通知信号后恢复运行。
8.如权利要求6所述的游戏服务器与数据库的交互方法中,游戏服务器从数据库中加载用户数据具体包括:
服务器主线程接收用户操作请求,并将所述用户操作请求对应的用户数据加载任务分配于内存池中一第二子线程;
在所述第二子线程执行所述用户操作请求对应的用户数据加载任务时,服务器主线程不执行所述用户操作请求,并在收到所述第二子线程发送的用户数据加载任务完成通知信号后执行所述用户操作请求。
9.一种游戏服务器与数据库的交互系统,包括游戏服务器与数据库;所述游戏服务器包括主处理单元、内存储单元、同步单元和判断单元;
所述主处理单元包括数据生成模块;
所述主处理单元用于在所述内存储单元中执行数据处理,并将处理结果保存于所述内存储单元;
所述同步单元用于通过多线程方式将所述处理结果同步于数据库;
所述数据生成模块用于生成用户缓存数据记录并将其保存于内存储单元中的缓存数据集,所述用户缓存数据记录包括一实质判别字段,所述实质判别字段的属性包括空数据或用户真实数据;
当判断单元判定需要生成新的用户真实数据时,数据生成模块在所述缓存数据集中查找是否有可用的缓存数据记录,若有则直接调取并将其中的空数据替换为所述用户真实数据;主处理单元分配同步数据修改结果任务于同步单元中的一第三子线程,所述第三子线程将所述处理结果同步于数据库。
10.如权利要求9所述的游戏服务器与数据库的交互系统中,所述主处理单元还包括数据删除模块;
当判断单元判定需要删除用户真实数据时,所述数据删除模块将相应的缓存数据记录中的用户真实数据以空数据替换、修改其实质判别字段为空数据,并保存于内存储单元中的缓存数据集;
然后主处理单元分配同步数据修改结果任务于同步单元中的一第四子线程,所述第四子线程将所述处理结果同步于数据库。
11.如权利要求9或10所述的游戏服务器与数据库的交互系统中,所述第三子线程或第四子线程将修改处理结果同步于数据库具体包括:
以SQL合并算法对同一数据库表记录的修改SQL进行合并。
12.如权利要求9所述的游戏服务器与数据库的交互系统中,所述同步单元还用
于开启一第五子线程,所述第五子线程用于监控缓存数据集并保证所述缓存数据集中的缓存数据记录数量处于一预设区间。
13.如权利要求9所述的游戏服务器与数据库的交互系统中,所述游戏服务器还
包括配置加载单元,所述配置加载单元用于从数据库中加载配置数据。
14.如权利要求13所述的游戏服务器与数据库的交互系统中,所述配置数据包括程序数据或用户数据。
15.如权利要求13所述的游戏服务器与数据库的交互系统中,所述配置加载单元从数据库中加载程序数据具体包括:
配置加载单元分配程序数据加载任务于一第一子线程,在所述第一子线程加载程序数据时,所述主处理单元处于等待状态,并在收到所述第一子线程发送的程序数据加载完成通知信号后恢复运行。
16.如权利要求14所述的游戏服务器与数据库的交互系统中,所述配置加载单元从数据库中加载用户数据具体包括:
主处理单元接收用户操作请求后,配置加载单元将所述用户操作请求对应的用户数据加载任务分配于一第二子线程;
在所述第二子线程执行所述用户操作请求对应的用户数据加载任务时,主处理单元不执行所述用户操作请求,并在收到所述第二子线程发送的用户数据加载任务完成通知信号后执行所述用户操作请求。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510001663.XA CN104601562B (zh) | 2015-01-04 | 2015-01-04 | 游戏服务器与数据库的交互方法和系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510001663.XA CN104601562B (zh) | 2015-01-04 | 2015-01-04 | 游戏服务器与数据库的交互方法和系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104601562A CN104601562A (zh) | 2015-05-06 |
CN104601562B true CN104601562B (zh) | 2017-12-22 |
Family
ID=53127068
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510001663.XA Active CN104601562B (zh) | 2015-01-04 | 2015-01-04 | 游戏服务器与数据库的交互方法和系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104601562B (zh) |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105207990B (zh) * | 2015-08-13 | 2019-03-15 | 北京乐动卓越科技有限公司 | 一种访问游戏服务器的方法、服务器和网络游戏系统 |
CN105491029A (zh) * | 2015-11-26 | 2016-04-13 | 盛趣信息技术(上海)有限公司 | 游戏服务器集群 |
CN107590277B (zh) * | 2017-09-28 | 2021-06-25 | 泰康保险集团股份有限公司 | 数据同步方法、装置、电子设备及存储介质 |
CN110570223A (zh) * | 2018-06-06 | 2019-12-13 | 北京三快在线科技有限公司 | 商家券库存智能分配方法、系统、电子设备及存储介质 |
CN111385255B (zh) * | 2018-12-28 | 2022-05-06 | 北京金山云网络技术有限公司 | 一种异步调用实现方法、装置、服务器及服务器集群 |
CN109885395A (zh) * | 2019-01-14 | 2019-06-14 | 珠海金山网络游戏科技有限公司 | 一种游戏配置表加载内存优化方法及装置 |
CN112100186B (zh) * | 2020-08-26 | 2024-04-05 | 金蝶软件(中国)有限公司 | 基于分布式系统的数据处理方法、装置、计算机设备 |
CN112597163B (zh) * | 2020-12-25 | 2024-05-28 | 珠海金山数字网络科技有限公司 | 数据处理系统、方法及装置 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103440285A (zh) * | 2013-08-14 | 2013-12-11 | 北京乐动卓越科技有限公司 | 大型手机游戏系统及其数据库更新方法 |
CN104125252A (zh) * | 2013-04-27 | 2014-10-29 | 博雅网络游戏开发(深圳)有限公司 | 数据存储系统及方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8777737B2 (en) * | 2006-04-13 | 2014-07-15 | Igt | Method and apparatus for integrating remotely-hosted and locally rendered content on a gaming device |
-
2015
- 2015-01-04 CN CN201510001663.XA patent/CN104601562B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104125252A (zh) * | 2013-04-27 | 2014-10-29 | 博雅网络游戏开发(深圳)有限公司 | 数据存储系统及方法 |
CN103440285A (zh) * | 2013-08-14 | 2013-12-11 | 北京乐动卓越科技有限公司 | 大型手机游戏系统及其数据库更新方法 |
Also Published As
Publication number | Publication date |
---|---|
CN104601562A (zh) | 2015-05-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104601562B (zh) | 游戏服务器与数据库的交互方法和系统 | |
CN102843396B (zh) | 一种分布式缓存系统中的数据写入及读取方法及装置 | |
CN103810048B (zh) | 一种面向资源利用最优的线程数量自动调整方法及装置 | |
CN103345514B (zh) | 大数据环境下的流式数据处理方法 | |
Mishne et al. | Fast data in the era of big data: Twitter's real-time related query suggestion architecture | |
Hauglid et al. | DYFRAM: dynamic fragmentation and replica management in distributed database systems | |
CN104794228B (zh) | 一种搜索结果提供方法及装置 | |
CN104111958B (zh) | 一种数据查询方法及装置 | |
CN104407879B (zh) | 一种电网时序大数据并行加载方法 | |
CN111124679A (zh) | 一种面向多源异构海量数据限时自动处理方法 | |
CN102882983A (zh) | 一种云存储系统中提升并发访问性能的数据快速存储方法 | |
CN103559300B (zh) | 数据的查询方法和查询装置 | |
CN104361296B (zh) | 一种并行的大容量访问控制列表的查找方法 | |
CN106649349A (zh) | 用于游戏应用的数据缓存方法、装置和系统 | |
CN100458784C (zh) | 在数字图书馆中所采用的检索系统和检索方法 | |
CN103500213B (zh) | 基于预读取的页面热点资源更新方法和装置 | |
CN105808358B (zh) | 一种用于众核系统的数据相关性线程分组映射方法 | |
CN106534784A (zh) | 一种用于视频分析数据结果集的采集分析存储统计系统 | |
CN104572505A (zh) | 一种保证海量数据缓存最终一致性的系统及方法 | |
CN107153643A (zh) | 数据表连接方法及装置 | |
CN107818012A (zh) | 一种数据处理方法、装置及电子设备 | |
CN106503008A (zh) | 文件存储方法和装置及文件查询方法和装置 | |
CN106681830B (zh) | 一种任务缓存空间监测方法和装置 | |
CN115221131A (zh) | 一种时序数据库高速数据读写方法及装置 | |
CN106407226A (zh) | 一种数据处理方法、备份服务器及存储系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |