近來被困擾的概念問題

2021-09-25 22:54:27 字數 2830 閱讀 9258

近來總是被一些概念和實際問題困擾,讓我很不理解。經過查閱文件和自己動手操作,自己將他們整理歸納了一下。

高可用,負載均衡,分布式的概念

高可用:一台伺服器宕機後,服務可以繼續使用以及不丟失資料。主要目的就是穩定,其核心就是冗餘+故障轉移。

負載均衡:負載均衡演算法(輪詢,隨機,雜湊,權重等)來分發請求到不同的主伺服器。主要目的就是分壓抗併發。

分布式:就是各個伺服器實現不同的功能(分布式不一定集群)。主要目的就是各司其職和抗壓。

高併發:垂直擴充套件,水平擴充套件

大資料的時候,壓力不在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='[email protected]'),則在登入名前加上字首登入名結果(如:$loginname='[email protected]')

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 ('[email protected]', 183239324323, 1);

insert into user_info15 (user_id, login_pwd) values (115, 'afieflefiefladifadfadfe');

登入流程

1)如果使用者的登入型別是郵箱(如:$loginname='[email protected]'),則在登入名前加上字首登入名結果(如:$loginname='[email protected]')

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

不能的字串生成的hash值有可能相同,特別是當資料量巨大的時候,重複的概率更高。

這時候通過乙個hash從user_login表中獲取的記錄可能是多條。

這時可以做乙個效能和業務之間的權衡,就是當hash存在的時候,使用者用就已經被使用了。

假如:'songhuan'和'宋歡'對應的hash碼相同,這時如果有使用者註冊了'songhuan',那麼註冊'宋歡'的時候也只能提示使用者,該使用者名稱已經被註冊了。

所以建表的時候,在login_hash上加上唯一索引

一致性問題:

Intel MRST CDK上困擾已久的問題

問題 從官方途徑拿到新的cdk 的moorestown img後,usb的鍵盤和滑鼠經常無法操作。用系統命令檢視usb識別的外設,正常 root localhost x11 lsusb bus 001 device 004 id 046d c01f logitech,inc.bus 001 devi...

WinRT常見而又困擾的問題

1.popup content中的繫結都會失效,之前在stack overflow上看到過類似的問題,自己在開發中也遇到了,始終沒找到原因。解決方案是將原本popup的content全都移到中 2.當你滑鼠點選在text之外的空白處,無背景色的控制項單擊事件會失效,這種情況經常發生在自己寫的temp...

一直困擾我的問題

當解決乙個問題的時候,隨即引出幾個未知的問題。然後在解決那幾個問題時又引出更多的問題。導致問題就像一棵樹一樣,不斷往上生長。逐漸遠離最開始的問題。當然也在一層一層未解決的問題的影響下挫敗感越來越強烈。最後不得不停止 放棄。發現解決方法一 當在解決乙個不知道難度有多大的問題時,找一張紙,把最根本的要解...