棋牌游戏用户中心开

用户中心最主要的功能就是管理用户的注册和登录,登录成功以后生成对应的token,并负责token的验证。当一个用户注册或登录成功以后,它的信息会在用户中心服务中缓存一段时间,方便验证和查看。通常用户中心使用web服务开发,支持restful模式。这样用户中心能够在app和浏览器通用。目前流行的技术是springboot。技术组合为:springboot + mybatis + mysql + redis。html


用户中心最简单的也须要使用用户名和密码登陆,在登录过程当中首先就是查询,就先说说查询的事吧!当收到用户登陆的请求后,最简单的操做就是先根据用户名和密码查询数据库,一条sql语句就能够搞定,皆大欢喜,随着用户量的增长,发现愈来愈慢,直到有一天,系统开始卡的不行,若是你的用户量增加的快,这一天来的也很快,到时候,登录一个帐号须要几分钟,用户体验变差。这时候开始考虑解决这个问题。mysql


数据量大,解决的唯一办法就是分而治之,可能想到的第一件事就是分库分表。就是把原来全部数据都存一个库一个表改成存到多个库的表中。那应该怎么分呢?web

 若是你的用户id(userId)是long且是递增的,能够方便的以id段分库。好比100000到999999为一个库,记录为1库,1000000到1900000为2库,当收到须要根据用户id查询用户信息时,就能够根据userId判断,在100000到999999范围内就去1库查,在1000000到1900000范围内就去2库查,依次类推,之后无论用户增长多了,只须要增长相应的库就能够了。这样分库的一个好处是,一个用户的全部的信息都在同一个库中。有时候须要对用户信息进行多表查询,这样能够方便的实现。不用跨库查找了。redis



回到登录那里,由于登录的时候不是根据id查询的,而是根据用户名和密码查询的。若是只是单纯的按上面分库,那怎么根据用户名去查询?总不能遍历全部的库吧,虽然这是一个方法,可是相信没有人会这么干。还有一种方法是缓存用户名与id的对应关系,好比当用户注册成功以后,生成userId,这时把用户名和userId及密码的对应关系存储到redis缓存中。查询的时候,选择查redis,看看用户名对应的id是否存在,若是存在再对比密码信息。若是不存在,再从数据库查找,找到后若是密码正确,存储到缓存中。因此问题又回来了,仍是须要根据用户名和密码在数据库中查询。算法

由于咱们是根据userid分库的,因此咱们应该想办法把用户名和userId创建必定的关系,能够根据用户名制定必定的规则,肯定userId所在的库,那么就不能按上面简单的根据id范围来分库了,须要改变一下策略。在生成用户userId的时候,加入一些因子,使用这些因子来分库,而这些由用户名的一些信息生成。首先咱们要肯定userId的组成,假如咱们的userId有如下几部分组成:spring

43bit(时间戳(存储2018年1月1日零到如今的毫秒数)) +8bit(机器编号) +8bit(毫秒序列) +5bit(分库因子) =64bitsql

(实现方式参考:http://www.coc88.com/h-nd-147.html#skeyword=%E5%94%AF%E4%B8%80id&_np=0_35数据库

这个算法每秒能够生成不一样的userId个数为:1000 * 2^8=256000,可使用到2296年,最多能够分32个库,基本知足须要了。(若是二百年后不能知足了,再改造吧)数组

上面说到的分库因子,是由用户名计算出来的,好比用户名wgs123,转成byte,取最后5bit,10011,转化成十进制为19.所在当使用userId% 32时,这个userId被分到第19个数据库。即分库因子最终肯定这个userId在哪一个库。浏览器

即分库因子 =f(username),取最后5bit用于生成userId

这样不论是使用用户中仍是用户id,使用它们的最后5bit就能够计算出在哪一个数据库了。

若是游戏服务器是世界服,不分区,那么全部的数据都共享在一块儿,这样设计以后能够放心的导入用户,而不用担忧用户过多了。天生就分好库了。


对于游戏来讲,不论是世界服仍是分区分服的,都有一个角色,须要一个角色id(roleId),这个roleId的生成通常有必定的业务规则,好比由7位数组成,惟一且递增等。所在用户的业务数据和用户映射的时候是使用playerId关联,好比物品信息,技能信息,它们属于一个角色。


用户中心最基本的有两张表,用户表和角色表,用户表中存储用户的基本公共信息,好比:


user table
role table

若是是分区分服的,这里面role table的数据通常来自逻辑服务的通知,当游戏逻辑服那里建立角色了,或角色升级了,会发布一个通知,用户中心这里监听,而后处理这个通知。这样在用户登录成功以后,须要显示用户的角色信息就很是 方便了。

参考:58沈剑,https://mp.weixin.qq.com/s/8aI9jS0SXJl5NdcM3TPYuQ


游戏技术网公众号,扫描加入讨论游戏服务器开发技术