php+mysql大量用户登录解决方案分析


Posted in PHP onDecember 29, 2014

本文实例分析了php+mysql大量用户登录解决方案。分享给大家供大家参考。具体分析如下:

百度、QQ、360等大公司都拥有上亿的用户量,不仅所有子网站都通过一个账号登录,而且还开放用户平台,提供给其他网站使用,这种级别的数据量和访问量,如果不做优化,估计很快就会宕机,这些公司都是一个专门的团队,维护一个注册登录,细节设计的非常优秀,现在粗略谈下他们的设计方案.

大数据的时候,压力不在PHP,主要在MySQL,PHP可以做负载均衡,10台机器抗不住就用20台或者100台,这都不是瓶颈.

但是MySQL是单点的,无论做多少从库,都是优化查询,更新数据就无法只是简单的通过加机器解决了,而且查询也可以通过Memcache缓存减轻压力,所以不必要做多少从库的,一般1主4从就可以了.

下面主要介绍下数据库的解决方案:

假设用户可以通过“登录名”、“邮箱”或“手机号”登录.

表结构如下:

登录名与ID表,根据login_hash分100张表

CREATE TABLE user_login( 

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_login88 (login_name, login_hash, user_id) VALUES ('songhuan@zixue.it', 183239324323, 1); 

INSERT INTO user_info15 (user_id, login_pwd) VALUES (115, 'afieflefiefladifadfadfe');

登录流程:

1)如果用户的登录类型是邮箱(如:$loginName='songhuan@zixue.it'),则在登录名前加上前缀登录名结果(如:$loginName='mail_songhuan@zixue.it')

2)

$loginHash=ord(md5($loginName));

3)

$tableName  = 'user_login' . ($loginHash%100);
假如结果为user_login88

4)执行SQL:

SELECT id FROM user_login88 WHERE login_hash = $loginHash;

如果查询不到数据,则登录名不存在

5)如果能获取到,id=115,则

$tableName  = 'user_info'.(115%100);
SELECT id, pwd … FROM user_info15 WHERE id = 115;

6)匹配密码,如果密码不相等,返回false

7)如果密码相等,将用户ID加密放入COOKIE,将用户信息存入Memcache.

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
优化PHP程序的方法小结
Feb 23 PHP
php下载文件的代码示例
Jun 29 PHP
PHP输出数组中重名的元素的几种处理方法
Sep 05 PHP
深入理解:XML与对象的序列化与反序列化
Jun 08 PHP
PHP设计模式之责任链模式的深入解析
Jun 13 PHP
ThinkPHP的模版中调用session数据的方法
Jul 01 PHP
php实现的ping端口函数实例
Nov 12 PHP
Redis构建分布式锁
Mar 28 PHP
PHP手机短信验证码实现流程详解
May 17 PHP
PHP7实现和CryptoJS的AES加密方式互通示例【AES-128-ECB加密】
Jun 08 PHP
PHP 图片处理
Sep 16 PHP
PHP7移除的扩展和SAPI
Mar 09 PHP
php从memcache读取数据再批量写入mysql的方法
Dec 29 #PHP
php操作mongoDB实例分析
Dec 29 #PHP
Yii实现多数据库主从读写分离的方法
Dec 29 #PHP
php调用mysql存储过程实例分析
Dec 29 #PHP
php生成excel列名超过26列大于Z时的解决方法
Dec 29 #PHP
php+mysqli实现批量替换数据库表前缀的方法
Dec 29 #PHP
PHP跨平台获取服务器IP地址自定义函数分享
Dec 29 #PHP
You might like
PHP分页函数代码(简单实用型)
2010/12/02 PHP
对PHP语言认识上需要避免的10大误区
2014/06/12 PHP
如何使用jQuery+PHP+MySQL来实现一个在线测试项目
2015/04/26 PHP
Javascript string 扩展库代码
2010/04/09 Javascript
JavaScript 基础篇之运算符、语句(二)
2012/04/07 Javascript
使用jquery mobile做幻灯播放效果实现步骤
2013/01/04 Javascript
getComputedStyle与currentStyle获取样式(style/class)
2013/03/19 Javascript
jQuery遍历对象、数组、集合实例
2014/11/08 Javascript
js随机生成字母数字组合的字符串 随机动画数字
2015/09/02 Javascript
简单实现js页面切换功能
2021/01/10 Javascript
Three.js学习之文字形状及自定义形状
2016/08/01 Javascript
js实现功能比较全面的全选和多选
2017/03/02 Javascript
Vue + Webpack + Vue-loader学习教程之相关配置篇
2017/03/14 Javascript
Javascript中类式继承和原型式继承的实现方法和区别之处
2017/04/25 Javascript
Vue原理剖析 实现双向绑定MVVM
2017/05/03 Javascript
JavaScript实现的搜索及高亮显示功能示例
2017/08/14 Javascript
支付宝小程序自定义弹窗dialog插件的实现代码
2018/11/30 Javascript
layui使用templet格式化表格数据的方法
2019/09/16 Javascript
解决父组件将子组件作为弹窗调用只执行一次created的问题
2020/07/24 Javascript
nginx部署多个vue项目的方法示例
2020/09/06 Javascript
typescript编写微信小程序创建项目的方法
2021/01/29 Javascript
[02:30]DOTA2放量测试专访海涛:呼吁保护新手玩家
2013/08/26 DOTA
在Python中操作字符串之rstrip()方法的使用
2015/05/19 Python
使用Python实现windows下的抓包与解析
2018/01/15 Python
python版本的仿windows计划任务工具
2018/04/30 Python
Python实现的查询mysql数据库并通过邮件发送信息功能
2018/05/17 Python
对python opencv 添加文字 cv2.putText 的各参数介绍
2018/12/05 Python
Pandas时间序列:时期(period)及其算术运算详解
2020/02/25 Python
python中time、datetime模块的使用
2020/12/14 Python
网络工程与软件技术毕业生自荐信
2013/09/24 职场文书
搞笑获奖感言
2014/01/30 职场文书
新闻学专业个人求职信写作
2014/02/04 职场文书
2015感人爱情寄语
2015/02/26 职场文书
2015年药店工作总结
2015/04/20 职场文书
同意落户证明
2015/06/19 职场文书
Python中else的三种使用场景
2021/06/16 Python