php+mysql大量用户登录解决方案分析
本文实例分析了php+mysql大量用户登录解决方案。分享给大家供大家参考。具体分析如下:
百度、qq、360等大公司都拥有上亿的用户量,不仅所有子网站都通过一个账号登录,而且还开放用户平台,提供给其他网站使用,这种级别的数据量和访问量,如果不做优化,估计很快就会宕机,这些公司都是一个专门的团队,维护一个注册登录,细节设计的非常优秀,现在粗略谈下他们的设计方案.
大数据的时候,压力不在php,主要在mysql,php可以做负载均衡,10台机器抗不住就用20台或者100台,这都不是瓶颈.
但是mysql是单点的,无论做多少从库,都是优化查询,更新数据就无法只是简单的通过加机器解决了,而且查询也可以通过memcache缓存减轻压力,所以不必要做多少从库的,一般1主4从就可以了.
下面主要介绍下数据库的解决方案:
假设用户可以通过“登录名”、“邮箱”或“手机号”登录.
表结构如下:
登录名与id表,根据login_hash分100张表
login_name varchar() 用户登录名,可以是“登录名”、“邮箱”或“手机号”登录
login_hash bigint 用户登录名的hash码
user_id bigint 用户id
);
create table user_login0 like user_login;
create table user_login1 like user_login;
… …
create table user_login100 like user_login;
id与用户信息表,根据user_id分100张表
create table user_info(
user_id bigint 用户id
login_pwd char() 用户登录密码
… … 其他信息,家庭住址、手机号、性别等等
);
create table user_info0 like user_info;
create table user_info1 like user_info;
… …
create table user_info2 like user_info;
业务实现逻辑:
依赖服务器:实现一个自增id的服务(相当于oracle的sequence),也可以自己实现(用php+mysql或者用c实现都可以)。目的是可以 从这个服务中取id,每次取的id数都是在上次基础上+1,和mysql的autoincrement很像,只是不能在表内部自增。
注册流程:
1)验证用户名、邮箱、手机号、密码等格式。省略…
2)从服务中取一个id,假设是115。
3)如果用户的登录类型是邮箱(如:$loginname='songhuan@zixue.it'),则在登录名前加上前缀登录名结果(如:$loginname='mail_songhuan@zixue.it')
4)求登录名的hash值:$loginhash=md5($loginname); 对md5值hash,可以求asc码,或者用自己的算法,最后得出$loginhash=16位或32位的整数
5)$tablename = 'user_login' . ($loginhash%100),如果获取user_login表名,假如结果为user_login88。
$tablename = 'user_info' . (115%100),如果获取user_info表名。
6)执行sql:
insert into user_info15 (user_id, login_pwd) values (115, 'afieflefiefladifadfadfe');
登录流程:
1)如果用户的登录类型是邮箱(如:$loginname='songhuan@zixue.it'),则在登录名前加上前缀登录名结果(如:$loginname='mail_songhuan@zixue.it')
2)
3)
4)执行sql:
如果查询不到数据,则登录名不存在
5)如果能获取到,id=115,则
select id, pwd … from user_info15 where id = 115;
6)匹配密码,如果密码不相等,返回false
7)如果密码相等,将用户id加密放入cookie,将用户信息存入memcache.
希望本文所述对大家的php程序设计有所帮助。