欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

php+mysql大量用戶登錄解決方案分析

 更新時(shí)間:2014年12月29日 12:01:14   投稿:shichen2014  
這篇文章主要介紹了php+mysql大量用戶登錄解決方案,較為詳細(xì)的分析了大量用戶登錄時(shí)負(fù)載過大的解決方案,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

本文實(shí)例分析了php+mysql大量用戶登錄解決方案。分享給大家供大家參考。具體分析如下:

百度、QQ、360等大公司都擁有上億的用戶量,不僅所有子網(wǎng)站都通過一個(gè)賬號(hào)登錄,而且還開放用戶平臺(tái),提供給其他網(wǎng)站使用,這種級別的數(shù)據(jù)量和訪問量,如果不做優(yōu)化,估計(jì)很快就會(huì)宕機(jī),這些公司都是一個(gè)專門的團(tuán)隊(duì),維護(hù)一個(gè)注冊登錄,細(xì)節(jié)設(shè)計(jì)的非常優(yōu)秀,現(xiàn)在粗略談下他們的設(shè)計(jì)方案.

大數(shù)據(jù)的時(shí)候,壓力不在PHP,主要在MySQL,PHP可以做負(fù)載均衡,10臺(tái)機(jī)器抗不住就用20臺(tái)或者100臺(tái),這都不是瓶頸.

但是MySQL是單點(diǎn)的,無論做多少從庫,都是優(yōu)化查詢,更新數(shù)據(jù)就無法只是簡單的通過加機(jī)器解決了,而且查詢也可以通過Memcache緩存減輕壓力,所以不必要做多少從庫的,一般1主4從就可以了.

下面主要介紹下數(shù)據(jù)庫的解決方案:

假設(shè)用戶可以通過“登錄名”、“郵箱”或“手機(jī)號(hào)”登錄.

表結(jié)構(gòu)如下:

登錄名與ID表,根據(jù)login_hash分100張表

復(fù)制代碼 代碼如下:
CREATE TABLE user_login(
login_name VARCHAR() 用戶登錄名,可以是“登錄名”、“郵箱”或“手機(jī)號(hào)”登錄
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與用戶信息表,根據(jù)user_id分100張表

CREATE TABLE user_info(
user_id BIGINT 用戶ID
login_pwd CHAR() 用戶登錄密碼
… … 其他信息,家庭住址、手機(jī)號(hào)、性別等等
);
 
CREATE TABLE user_info0 LIKE user_info;
CREATE TABLE user_info1 LIKE user_info;
… …
CREATE TABLE user_info2 LIKE user_info;


業(yè)務(wù)實(shí)現(xiàn)邏輯:

依賴服務(wù)器:實(shí)現(xiàn)一個(gè)自增ID的服務(wù)(相當(dāng)于oracle的sequence),也可以自己實(shí)現(xiàn)(用PHP+MySQL或者用C實(shí)現(xiàn)都可以)。目的是可以 從這個(gè)服務(wù)中取ID,每次取的ID數(shù)都是在上次基礎(chǔ)上+1,和MySQL的autoincrement很像,只是不能在表內(nèi)部自增。

注冊流程:

1)驗(yàn)證用戶名、郵箱、手機(jī)號(hào)、密碼等格式。省略…

2)從服務(wù)中取一個(gè)ID,假設(shè)是115。

3)如果用戶的登錄類型是郵箱(如:$loginName='songhuan@zixue.it'),則在登錄名前加上前綴登錄名結(jié)果(如:$loginName='mail_songhuan@zixue.it')

4)求登錄名的HASH值:$loginHash=md5($loginName); 對md5值hash,可以求asc碼,或者用自己的算法,最后得出$loginHash=16位或32位的整數(shù)

5)$tableName  = 'user_login' . ($loginHash%100),如果獲取user_login表名,假如結(jié)果為user_login88。

$tableName  = 'user_info' . (115%100),如果獲取user_info表名。

6)執(zhí)行SQL:

復(fù)制代碼 代碼如下:
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'),則在登錄名前加上前綴登錄名結(jié)果(如:$loginName='mail_songhuan@zixue.it')

2)

復(fù)制代碼 代碼如下:
$loginHash=ord(md5($loginName));

3)

復(fù)制代碼 代碼如下:
$tableName  = 'user_login' . ($loginHash%100);
假如結(jié)果為user_login88

4)執(zhí)行SQL:

復(fù)制代碼 代碼如下:
SELECT id FROM user_login88 WHERE login_hash = $loginHash;

如果查詢不到數(shù)據(jù),則登錄名不存在

5)如果能獲取到,id=115,則

復(fù)制代碼 代碼如下:
$tableName  = 'user_info'.(115%100);

SELECT id, pwd … FROM user_info15 WHERE id = 115;

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

7)如果密碼相等,將用戶ID加密放入COOKIE,將用戶信息存入Memcache.

希望本文所述對大家的php程序設(shè)計(jì)有所幫助。

相關(guān)文章

最新評論