CN115554705A - 一种分布式高性能游戏服务取名不重复的方法及其系统 - Google Patents
一种分布式高性能游戏服务取名不重复的方法及其系统 Download PDFInfo
- Publication number
- CN115554705A CN115554705A CN202211294603.8A CN202211294603A CN115554705A CN 115554705 A CN115554705 A CN 115554705A CN 202211294603 A CN202211294603 A CN 202211294603A CN 115554705 A CN115554705 A CN 115554705A
- Authority
- CN
- China
- Prior art keywords
- name
- user
- bitmap
- server
- game
- 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.)
- Pending
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供了一种分布式高性能游戏服务取名不重复的方法以及系统,该方法为:1、玩家取名时客户端把username通过hash函数得到hashcode,把hashcode对10取模得到目标服务器编号n,向服务器n发起取名username请求;2、服务器收到username请求,得到hashcode,对bitmap的长度值取模后得到数值a,从内存里的bitmap中判断下标a是否为1,如果为1则返回客户端姓名已存在,如果为0则hashcode对10取模得到编号x,访问user_x_tb数据表判断username是否存在,如果存在则修改bitmap中下标a为1,并返回客户端姓名已存在,如果不存在则插入username到数据库,并且修改bitmap下标a为1;3、服务器定时每分钟把内存bitmap保存至redis的key_n下。当服务器重启时,读取redis的key_n把bitmap数据保存在内存中;能保证游戏取名服务的高性能和游戏名不重复。
Description
技术领域
本发明涉及游戏开发技术领域,特别是一种分布式高性能游戏服务取名不重复的方法及其系统。
背景技术
分布式即:不同的业务模块部署在不同的服务器上或者同一个业务模块分拆多个子业务,部署在不同的服务器上,解决高并发的问题。redis是数据缓存很常选型的中间件,是一个key(键)-value(值)存储系统。
在新游戏刚上线时,往往是游戏热度最高的时候,大量玩家涌入游戏服务器创建自己的游戏角色,由于不允许游戏角色名重复,角色名的唯一性判断需要前往数据库查询,这无疑对服务器和数据库性能都造成不小的压力。所以本专利为解决如何在分布式系统下创造一个高性能的取名服务。
发明内容
为克服上述问题,本发明的目的是提供一种分布式高性能游戏服务取名不重复的方法,保证游戏取名服务的高性能和游戏名不重复。
本发明采用以下方案实现:一种分布式高性能游戏服务取名不重复的方法,所述方法包括如下步骤:
步骤S1、玩家取名时客户端把游戏名username通过hash函数得到hashcode,用hashcode对服务器数量取模得到目标服务器编号n,向目标服务器n发起取名请求;
步骤S2、在目标服务器n中设置长度值为M的位图bitmap来存储用户的取名情况;
步骤S3、目标服务器n对数据库进行设置多个用户分表,目标服务器n收到取名请求,得到hashcode,用hashcode对长度值M取模后得到数值a,判断长度值为M的位图bitmap下标a对应的存储bit位是否为1,如果为1则返回客户端游戏名已存在,如果为0则hashcode对用户分表数量取模得到编号x,访问user_x用户表判断游戏名username是否存在,如果存在则修改位图bitmap下标a对应的存储bit位为1,并返回客户端游戏名已重复,如果不存在则插入游戏名username到数据库对应的用户表user_x_tb中,并且修改位图bitmap下标a对应的存储bit位为1;
步骤S4、服务器定时每分钟把内存bitmap保存至redis的键为key_n的value下,当服务器重启时,读取redis的键key为key_n把bitmap数据保存在内存中。
进一步的,所述步骤S3进一步具体为:目标服务器n收到取名请求后,得到游戏名username,通过和步骤S1相同的hash函数得到散列值hashcode,为了减少数据库压力,设置位图bitmap的长度值为8亿,用hashcode对8亿值M取模后得到数值a,判断服务器内存中的位图bitmap下标a对应的存储bit位是否为1,如果为1则返回客户端游戏名已存在,如果为0则表示游戏名可用,设置10张用户表来存储已创建的游戏名,通过hashcode对10取模得到编号x,读取用户表user_x判断username是否存在,如果已存在则修改bitmap中下标a对应的存储bit位为1,并返回客户端游戏名已重复;如果用户表user_x中不存在username,则插入username到数据库中,并修改内存bitmap下标a对应的存储bit位为1,返回客户端创建成功。
进一步的,所述步骤S4进一步具体为:服务器定时每分钟把内存bitmap中的用户取名情况存储至redis的键key为key_n的value下,这是用于服务器重启时,可用自己的服务器编号n去redis读取本服务的取名情况,读取redis的键key为key_n把bitmap数据保存在内中中,以供用户取名时在内存中进行快速判重。
本发明还提供了一种分布式高性能游戏服务取名不重复的系统,所述系统包括:目标服务器定位模块、位图创建模块、游戏名重复处理模块、数据读取模块;
所述目标服务器定位模块,在玩家取名时客户端把游戏名username通过hash函数得到hashcode,用hashcode对服务器数量取模得到目标服务器编号n,向目标服务器n发起取名请求;
所述位图创建模块,在目标服务器n中设置长度值为M的位图bitmap来存储用户的取名情况;
所述游戏名重复处理模块,通过目标服务器n对数据库进行设置多个用户分表,目标服务器n收到取名请求,得到hashcode,用hashcode对长度值M取模后得到数值a,判断长度值为M的位图bitmap下标a对应的存储bit位是否为1,如果为1则返回客户端游戏名已存在,如果为0则hashcode对用户分表数量取模得到编号x,访问user_x用户表判断游戏名username是否存在,如果存在则修改位图bitmap下标a对应的存储bit位为1,并返回客户端游戏名已重复,如果不存在则插入游戏名username到数据库对应的用户表user_x中,并且修改位图bitmap下标a对应的存储bit位为1;
所述数据读取模块,通过服务器定时每分钟把内存bitmap保存至redis的键为key_n的value下,当服务器重启时,读取redis的键key为key_n把bitmap数据保存在内存中。
进一步的,所述游戏名重复处理模块的实现方式进一步具体为:目标服务器n收到取名请求后,得到游戏名username,通过和步骤S1相同的hash函数得到散列值hashcode,为了减少数据库压力,设置位图bitmap的长度值为8亿,用hashcode对8亿值M取模后得到数值a,判断服务器内存中的位图bitmap下标a对应的存储bit位是否为1,如果为1则返回客户端游戏名已存在,如果为0则表示游戏名可用,设置10张用户表来存储已创建的游戏名,通过hashcode对10取模得到编号x,读取用户表user_x判断username是否存在,如果已存在则修改bitmap中下标a对应的存储bit位为1,并返回客户端游戏名已重复;如果用户表user_x中不存在username,则插入username到数据库中,并修改内存bitmap下标a对应的存储bit位为1,返回客户端创建成功。
进一步的,所述数据读取模块的实现方式进一步具体为:服务器定时每分钟把内存bitmap中的用户取名情况存储至redis的键key为key_n的value下,这是用于服务器重启时,可用自己的服务器编号n去redis读取本服务的取名情况,读取redis的键key为key_n把bitmap数据保存在内中中,以供用户取名时在内存中进行快速判重。
本发明的有益效果在于:对要进行游戏取名的请求进行定位到服务器中,在服务器中设置位图bitmap,通过位图bitmap存储游戏名以及对存在重复的游戏名进行删除,从而在游戏上线初期的火热情况下,保证服务器进行取名服务的高性能和游戏名不重复。
附图说明
图1是本发明的方法流程示意图。
图2是本发明的工作原理框图。
具体实施方式
下面结合附图对本发明做进一步说明。
请参阅图1所示,本发明的一种分布式高性能游戏服务取名不重复的方法,所述方法包括如下步骤:
步骤S1、玩家取名时客户端把游戏名username通过hash函数得到hashcode,用hashcode对服务器数量取模得到目标服务器编号n,向目标服务器n发起取名请求;
步骤S2、在目标服务器n中设置长度值为M的位图bitmap来存储用户的取名情况;
步骤S3、目标服务器n对数据库进行设置多个用户分表,目标服务器n收到取名请求,得到hashcode,用hashcode对长度值M取模后得到数值a,判断长度值为M的位图bitmap下标a对应的存储bit位是否为1,如果为1则返回客户端游戏名已存在,如果为0则hashcode对用户分表数量取模得到编号x(用户这个表要设置多个用户分表,所以user表有多个,user_0_tb,user_1_tb,user_2_tb....user_x_tb。x表示用户分表数量取模得到编号x,就是第几张分表的意思),访问user_x用户表判断游戏名username是否存在,如果存在则修改位图bitmap下标a对应的存储bit位为1,并返回客户端游戏名已重复,如果不存在则插入游戏名username到数据库对应的用户表user_x中,并且修改位图bitmap下标a对应的存储bit位为1;
步骤S4、服务器定时每分钟把内存bitmap保存至redis的键为key_n的value下,当服务器重启时,读取redis的键key为key_n把bitmap数据保存在内存中。
下面结合一具体实施例对本发明做进一步说明:
一种分布式高性能游戏服务取名不重复的方法,该方法为:
步骤一、玩家取名时客户端把游戏名username通过hash函数得到hashcode,用hashcode对服务器数量10取模得到目标服务器编号n,向服务器n发起取名username请求。
为了应对游戏火热初期的高并发的取名请求,假设有10台取名服务器,当玩家登陆游戏客户端进行取名时,客户端会先把username通过hash函数得到散列值hashcode,用hashcode对服务器数量10取模得到目标服务器编号n,把玩家取名的请求发往服务器n。
步骤二、服务器n收到username请求,得到hashcode,对8亿数值取模后得到数值a,从内存里长度为8亿的bitmap中判断下标a对应的存储bit位是否为1,如果为1则返回客户端游戏名已存在,如果为0则hashcode对用户分表数量10取模得到编号x,访问user_x_tb用户表判断username是否存在,如果存在则修改bitmap中下标a对应的存储bit位为1,并返回客户端游戏名已重复,如果不存在则插入username到数据库,并且修改bitmap下标a对应的存储bit位为1。
目标服务器n对数据库进行设置多个用户分表,服务器收到取名请求后,得到username,通过和步骤一相同的hash函数得到hashcode,为了减少数据库压力,系统选用bitmap来存储用户的取名情况,由于bitmap暂用内存小的特性,1M=1024*1024*8=800万左右,所以8亿长度的bitmap只需要1000MB左右的容量,用hashcode对8亿取模后得到数值a,判断服务器内存中的bitmap下标a对应的存储bit位的值是否为1,如果为1则表示username可能存在,则返回客户端游戏名已重复。
如果为0则表示游戏名可用,系统用10张用户表来存储已创建的游戏名,通过hashcode对10(10张用户表数量)取模得到编号x,读取数据表user_x_tb判断username是否存在,如果已存在则修改bitmap中下标a对应的存储bit位为1,并返回客户端游戏名已重复。
如果数据表user_x_tb中不存在username,则插入username到数据库对应的用户表user_x_tb中,并修改内存bitmap下标a对应的存储bit位的值为1,返回客户端创建成功。
步骤三、服务器定时每分钟把内存bitmap保存至redis的键key=key_n的value下。当服务器重启时,读取redis的键key=key_n把bitmap数据保存在内存中。
服务器定时每分钟把内存bitmap中的用户取名情况存储至redis的键key=key_n的value下,这是用于服务器重启时,可用用自己的服务器编号n去redis读取本服务的取名情况,读取redis的key_n把bitmap数据保存在内中中,以供用户取名时在内存中进行快速判重。
请参阅图2所示,本发明还提供了一种分布式高性能游戏服务取名不重复的系统,所述系统包括:目标服务器定位模块、位图创建模块、游戏名重复处理模块、数据读取模块;
所述目标服务器定位模块,在玩家取名时客户端把游戏名username通过hash函数得到hashcode,用hashcode对服务器数量取模得到目标服务器编号n,向目标服务器n发起取名请求;
为了应对游戏火热初期的高并发的取名请求,假设有10台取名服务器,当玩家登陆游戏客户端进行取名时,客户端会先把username通过hash函数得到散列值hashcode,用hashcode对服务器数量10取模得到目标服务器编号n,把玩家取名的请求发往服务器n。
所述位图创建模块,在目标服务器n中设置长度值为M的位图bitmap来存储用户的取名情况;
所述游戏名重复处理模块,通过目标服务器n对数据库进行设置多个用户分表,在目标服务器n收到取名请求,得到hashcode,用hashcode对长度值M取模后得到数值a,判断长度值为M的位图bitmap下标a对应的存储bit位是否为1,如果为1则返回客户端游戏名已存在,如果为0则hashcode对用户分表数量(即数据库中设置的用户分表的数量)取模得到编号x,访问user_x用户表判断游戏名username是否存在,如果存在则修改位图bitmap下标a对应的存储bit位为1,并返回客户端游戏名已重复,如果不存在则插入游戏名username到数据库对应的用户表user_x中,并且修改位图bitmap下标a对应的存储bit位为1;
所述游戏名重复处理模块的实现方式进一步具体为:目标服务器n收到取名请求后,得到游戏名username,通过和步骤S1相同的hash函数得到散列值hashcode,为了减少数据库压力,设置位图bitmap的长度值为8亿,用hashcode对8亿值M取模后得到数值a,判断服务器内存中的位图bitmap下标a对应的存储bit位是否为1,如果为1则返回客户端游戏名已存在,如果为0则表示游戏名可用,设置10张用户表来存储已创建的游戏名,通过hashcode对10取模得到编号x,读取用户表user_x_tb判断username是否存在,如果已存在则修改bitmap中下标a对应的存储bit位为1,并返回客户端游戏名已重复;如果用户表user_x_tb中不存在username,则插入username到数据库对应的用户表user_x_tb中,并修改内存bitmap下标a对应的存储bit位为1,返回客户端创建成功。
所述数据读取模块,通过服务器定时每分钟把内存bitmap保存至redis的键为key_n的value下,当服务器重启时,读取redis的键key为key_n把bitmap数据保存在内存中。
所述数据读取模块的实现方式进一步具体为:服务器定时每分钟把内存bitmap中的用户取名情况存储至redis的键key为key_n的value下,这是用于服务器重启时,可用自己的服务器编号n去redis读取本服务的取名情况,读取redis的键key为key_n把bitmap数据保存在内中中,以供用户取名时在内存中进行快速判重。
总之,本发明对要进行游戏取名的请求进行定位到服务器中,在服务器中设置位图bitmap,通过位图bitmap存储游戏名以及对存在重复的游戏名进行删除,从而在游戏上线初期的火热情况下,保证服务器进行取名服务的高性能和游戏名不重复。
以上所述仅为本发明的较佳实施例,凡依本发明申请专利范围所做的均等变化与修饰,皆应属本发明的涵盖范围。
Claims (6)
1.一种分布式高性能游戏服务取名不重复的方法,其特征在于:所述方法包括如下步骤:
步骤S1、玩家取名时客户端把游戏名username通过hash函数得到hashcode,用hashcode对服务器数量取模得到目标服务器编号n,向目标服务器n发起取名请求;
步骤S2、在目标服务器n中设置长度值为M的位图bitmap来存储用户的取名情况;
步骤S3、目标服务器n对数据库进行设置多个用户分表,目标服务器n收到取名请求,得到hashcode,用hashcode对长度值M取模后得到数值a,判断长度值为M的位图bitmap下标a对应的存储bit位是否为1,如果为1则返回客户端游戏名已存在,如果为0则hashcode对用户分表数量取模得到编号x,访问user_x用户表判断游戏名username是否存在,如果存在则修改位图bitmap下标a对应的存储bit位为1,并返回客户端游戏名已重复,如果不存在则插入游戏名username到数据库对应的用户表user_x中,并且修改位图bitmap下标a对应的存储bit位为1;
步骤S4、服务器定时每分钟把内存bitmap保存至redis的键为key_n的value下,当服务器重启时,读取redis的键key为key_n把bitmap数据保存在内存中。
2.根据权利要求1所述的一种分布式高性能游戏服务取名不重复的方法,其特征在于:所述步骤S3进一步具体为:目标服务器n收到取名请求后,得到游戏名username,通过和步骤S1相同的hash函数得到散列值hashcode,为了减少数据库压力,设置位图bitmap的长度值为8亿,用hashcode对8亿值M取模后得到数值a,判断服务器内存中的位图bitmap下标a对应的存储bit位是否为1,如果为1则返回客户端游戏名已存在,如果为0则表示游戏名可用,设置10张用户表来存储已创建的游戏名,通过hashcode对10取模得到编号x,读取用户表user_x判断username是否存在,如果已存在则修改bitmap中下标a对应的存储bit位为1,并返回客户端游戏名已重复;如果用户表user_x中不存在username,则插入username到数据库中,并修改内存bitmap下标a对应的存储bit位为1,返回客户端创建成功。
3.根据权利要求1所述的一种分布式高性能游戏服务取名不重复的方法,其特征在于:所述步骤S4进一步具体为:服务器定时每分钟把内存bitmap中的用户取名情况存储至redis的键key为key_n的value下,这是用于服务器重启时,可用自己的服务器编号n去redis读取本服务的取名情况,读取redis的键key为key_n把bitmap数据保存在内中中,以供用户取名时在内存中进行快速判重。
4.一种分布式高性能游戏服务取名不重复的系统,其特征在于:所述系统包括:目标服务器定位模块、位图创建模块、游戏名重复处理模块、数据读取模块;
所述目标服务器定位模块,在玩家取名时客户端把游戏名username通过hash函数得到hashcode,用hashcode对服务器数量取模得到目标服务器编号n,向目标服务器n发起取名请求;
所述位图创建模块,在目标服务器n中设置长度值为M的位图bitmap来存储用户的取名情况;
所述游戏名重复处理模块,通过目标服务器n对数据库进行设置多个用户分表,目标服务器n收到取名请求,得到hashcode,用hashcode对长度值M取模后得到数值a,判断长度值为M的位图bitmap下标a对应的存储bit位是否为1,如果为1则返回客户端游戏名已存在,如果为0则hashcode对用户分表数量取模得到编号x,访问user_x用户表判断游戏名username是否存在,如果存在则修改位图bitmap下标a对应的存储bit位为1,并返回客户端游戏名已重复,如果不存在则插入游戏名username到数据库对应的用户表user_x中,并且修改位图bitmap下标a对应的存储bit位为1;
所述数据读取模块,通过服务器定时每分钟把内存bitmap保存至redis的键为key_n的value下,当服务器重启时,读取redis的键key为key_n把bitmap数据保存在内存中。
5.根据权利要求4所述的一种分布式高性能游戏服务取名不重复的系统,其特征在于:所述游戏名重复处理模块的实现方式进一步具体为:目标服务器n收到取名请求后,得到游戏名username,通过和步骤S1相同的hash函数得到散列值hashcode,为了减少数据库压力,设置位图bitmap的长度值为8亿,用hashcode对8亿值M取模后得到数值a,判断服务器内存中的位图bitmap下标a对应的存储bit位是否为1,如果为1则返回客户端游戏名已存在,如果为0则表示游戏名可用,设置10张用户表来存储已创建的游戏名,通过hashcode对10取模得到编号x,读取用户表user_x判断username是否存在,如果已存在则修改bitmap中下标a对应的存储bit位为1,并返回客户端游戏名已重复;如果用户表user_x中不存在username,则插入username到数据库中,并修改内存bitmap下标a对应的存储bit位为1,返回客户端创建成功。
6.根据权利要求4所述的一种分布式高性能游戏服务取名不重复的系统,其特征在于:所述数据读取模块的实现方式进一步具体为:服务器定时每分钟把内存bitmap中的用户取名情况存储至redis的键key为key_n的value下,这是用于服务器重启时,可用自己的服务器编号n去redis读取本服务的取名情况,读取redis的键key为key_n把bitmap数据保存在内中中,以供用户取名时在内存中进行快速判重。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211294603.8A CN115554705A (zh) | 2022-10-21 | 2022-10-21 | 一种分布式高性能游戏服务取名不重复的方法及其系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211294603.8A CN115554705A (zh) | 2022-10-21 | 2022-10-21 | 一种分布式高性能游戏服务取名不重复的方法及其系统 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115554705A true CN115554705A (zh) | 2023-01-03 |
Family
ID=84746649
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211294603.8A Pending CN115554705A (zh) | 2022-10-21 | 2022-10-21 | 一种分布式高性能游戏服务取名不重复的方法及其系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115554705A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117390007A (zh) * | 2023-12-08 | 2024-01-12 | 创意信息技术股份有限公司 | 大数据量去重接口数据采集方法、装置、设备及存储介质 |
-
2022
- 2022-10-21 CN CN202211294603.8A patent/CN115554705A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117390007A (zh) * | 2023-12-08 | 2024-01-12 | 创意信息技术股份有限公司 | 大数据量去重接口数据采集方法、装置、设备及存储介质 |
CN117390007B (zh) * | 2023-12-08 | 2024-03-12 | 创意信息技术股份有限公司 | 大数据量去重接口数据采集方法、装置、设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
EP3399434B1 (en) | Short link processing method, device and server | |
CN104317926B (zh) | 一种持久化的数据存储和查询方法及对应的装置和系统 | |
CN109726202B (zh) | 一种区块链数据存储方法及计算机存储介质 | |
CN106997557B (zh) | 订单信息采集方法及装置 | |
CN101030275A (zh) | 索引惟一电子邮件消息及其使用的系统和方法 | |
CN102710763B (zh) | 一种分布式缓存池化、分片及故障转移的方法及系统 | |
CN115554705A (zh) | 一种分布式高性能游戏服务取名不重复的方法及其系统 | |
CN107766529B (zh) | 一种用于污水处理行业的海量数据存储方法 | |
US11520826B2 (en) | Data extraction using a distributed indexing architecture for databases | |
CN112764997B (zh) | 一种日志存储的方法、装置、计算机设备和存储介质 | |
CN105447166A (zh) | 一种基于关键字查找信息的方法及系统 | |
CN112817538B (zh) | 数据处理的方法、装置、设备和存储介质 | |
CN104636349A (zh) | 一种索引数据压缩以及索引数据搜索的方法和设备 | |
CN109597574A (zh) | 分布式数据存储方法、服务器及可读存储介质 | |
CN105912696A (zh) | 一种基于对数归并的dns索引创建方法及查询方法 | |
CN111723360B (zh) | 凭证码处理方法、装置及存储介质 | |
CN114090530A (zh) | 分布式架构下的日志汇总查询方法及装置 | |
CN100476815C (zh) | 网页标识抓取方法 | |
JP2015210815A (ja) | データベース管理方法及びデータベース管理システム | |
CN111787074A (zh) | 一种文件同步方法及终端 | |
CN107040455B (zh) | 一种基于redis的即时消息通讯方法和系统 | |
CN111013134B (zh) | 服务器系统和数据处理方法 | |
US8572231B2 (en) | Variable-length nonce generation | |
CN114416741A (zh) | 基于多级索引的kv数据写入读取方法、装置及存储介质 | |
US10990574B2 (en) | Distributed indexing architecture for databases |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |