php+mysql大量用戶登錄解決方案分析
本文實(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張表
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:
INSERT INTO user_info15 (user_id, login_pwd) VALUES (115, 'afieflefiefladifadfadfe');
登錄流程:
1)如果用戶的登錄類型是郵箱(如:$loginName='songhuan@zixue.it'),則在登錄名前加上前綴登錄名結(jié)果(如:$loginName='mail_songhuan@zixue.it')
2)
3)
4)執(zhí)行SQL:
如果查詢不到數(shù)據(jù),則登錄名不存在
5)如果能獲取到,id=115,則
SELECT id, pwd … FROM user_info15 WHERE id = 115;
6)匹配密碼,如果密碼不相等,返回false
7)如果密碼相等,將用戶ID加密放入COOKIE,將用戶信息存入Memcache.
希望本文所述對大家的php程序設(shè)計(jì)有所幫助。
相關(guān)文章
PHP簡單實(shí)現(xiàn)記錄網(wǎng)站訪問量功能示例
這篇文章主要介紹了PHP簡單實(shí)現(xiàn)記錄網(wǎng)站訪問量功能,涉及php針對文件加鎖讀寫及日期時(shí)間轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下2018-06-06PHP+JS+rsa數(shù)據(jù)加密傳輸實(shí)現(xiàn)代碼
PHP+JS+rsa數(shù)據(jù)加密傳輸實(shí)現(xiàn)代碼,需要的朋友可以參考下。2011-03-03php獲取URL中帶#號(hào)等特殊符號(hào)參數(shù)的解決方法
這篇文章主要介紹了php獲取URL中帶#號(hào)等特殊符號(hào)參數(shù)的解決方法,本文使用JS中的escape函數(shù)編碼后傳遞解決這個(gè)問題,需要的朋友可以參考下2014-09-09Sorting Array Values in PHP(數(shù)組排序)
有時(shí)候,你可能需要對數(shù)組內(nèi)的值進(jìn)行排序,那么就可以參考下面的文章。2011-09-09php中轉(zhuǎn)義mysql語句的實(shí)現(xiàn)代碼
如果你需要向數(shù)據(jù)庫,插入形如’你好’,這樣包含有單引號(hào)或者雙引號(hào)的字符串怎么辦,當(dāng)然可以使用反斜杠進(jìn)行轉(zhuǎn)義,但是如果內(nèi)容太多呢?2011-06-06PHP編程實(shí)現(xiàn)陽歷轉(zhuǎn)換為陰歷的方法實(shí)例
這篇文章主要介紹了PHP編程實(shí)現(xiàn)陽歷轉(zhuǎn)換為陰歷的方法,結(jié)合具體實(shí)例形式分析了php陰歷操作類的定義與使用技巧,需要的朋友可以參考下2017-08-08