你想建設一個能承受500萬PV/天天的網站嗎? 500萬PV是什麼概念?服務器每秒要處理多少個請求才能應對?若是計算呢??前端
PV是什麼:PV是page view的簡寫。PV是指頁面的訪問次數,每打開或刷新一次頁面,就算作一個pv。
計算模型:
每臺服務器每秒處理請求的數量=((80%*總PV量)/(24小時*60分*60秒*40%)) / 服務器數量 。
其中關鍵的參數是80%、40%。表示一天中有80%的請求發生在一天的40%的時間內。24小時的40%是9.6小時,有80%的請求發生一天的9.6個小時當中(很適合互聯網的應用,白天請求多,晚上請求少)。
簡單計算的結果:
((80%*500萬)/(24小時*60分*60秒*40%))/1 = 115.7個請求/秒 linux
((80%*100萬)/(24小時*60分*60秒*40%))/1 = 23.1個請求/秒 程序員
(2)初步結論: web
如今咱們在作壓力測試時,就有了標準,若是你的服務器一秒能處理115.7個請求,就能夠承受500萬PV/天天。若是你的服務器一秒能處理23.1個請求,就能夠承受100萬PV/天天。
留足餘量:
以上請求數量是均勻的分佈在白天的9.6個小時中,但實際狀況並不會這麼均勻的分佈,會有高峯有低谷。爲了應對高峯時段,應該留一些餘地,最少也要x2倍,x3倍也不爲過。
115.7個請求/秒?*2倍=231.4個請求/秒
115.7個請求/秒?*3倍=347.1個請求/秒
23.1個請求/秒?*2倍=46.2個請求/秒
23.1個請求/秒?*3倍=69.3個請求/秒
(3)最終結論:
若是你的服務器一秒能處理231.4--347.1個請求/秒,就能夠應對平均500萬PV/天天。
若是你的服務器一秒能處理46.2--69.3個請求,就能夠應對平均100萬PV/天天。算法
這裏所謂的每秒N個請求,就是QPS。數據庫
(4)實際經驗:編程
一、根據實際經驗,採用兩臺常規配置的機架式服務器,配置是很常見的配置,例如一個4核CPU+4G內存+服務器SAS硬盤。
二、我的武斷的認爲在服務器CPU領域Intel的CPU要優於AMD的CPU,有反對的就反對吧,我都說我武斷了(請看CPU性能比較),不要太相信AMD的廣告,比較CPU性能簡單辦法就是比價格,不要比頻率與核心數,價格相差很少的性能也相差很少。
三、硬盤的性能很重要,尤爲是數據庫服務器。通常的服務器都配1.5萬轉的SAS硬盤,高級一點的能夠配SSD固態硬盤,性能會更好。最最最最重要的指標是「隨機讀寫性能」而不是「順序讀寫性能」。(本例仍是配置最多見的1.5萬轉的SAS硬盤吧)
四、一臺服務器跑Tomcat運行j2ee程序,一臺服務器跑MySql數據庫,程序寫的中等水平(這個真的很差量化),是論壇類型的應用(總有回帖,不太容易作緩存,也沒法靜態化)。
五、以上軟硬件狀況下,是能夠承受100萬PV/天天的。(已留有餘量應對忽然的訪問高峯)
注意機房的網絡帶寬:
有人說以上條件我都知足了,但實際性能仍是達不到目標。這時請注意你對外的網絡的帶寬,在國內服務器便宜但帶寬很貴,極可能你在機房是與你們共享一條100M的光纖,實際每一個人可分到2M左右帶寬。再好一點5M,再好一點雙線機房10M獨享,這已經很貴了(北京價格)。
一天總流量:每一個頁面20k字節*100萬個頁面/1024=19531M字節=19G字節,
19531M/9.6小時=2034M/小時=578K字節/s。若是請求是均勻分佈的,須要5M(640K字節)帶寬(5Mb=640KB 注意大小寫,b是位,B是字節,差了8倍),但全部請求不多是均勻分佈的,當有高峯時5M帶寬必定不夠,X2倍就是10M帶寬。10M帶寬基本能夠知足要求。以上是假設每一個頁面20k字節,基本不包含圖片,要是包含圖片就更大了,10M帶寬也不能知足要求了後端
Throughput(吞吐量):按照常規理解網絡吞吐量表示在單位時間內經過網卡數據量之和,其中即包括本機網卡發送出去的數據量也包括本機網卡接收到的數據量。 一個100Mb(位)的雙工網卡,最大發送數據的速度是12.5M字節/s, 最大接收數據的速度是12.5M字節/s, 能夠同時收發數據。
併發用戶數 是同時執行操做的用戶(線程數)
響應時間 從請求發出到收到響應花費的時間
QPS(Queries Per Second) 每秒處理的查詢數(若是是數據庫,就至關於讀取)
TPS(Transactions Per Second) 每秒處理的事務數(若是是數據庫,就至關於寫入、修改)
IOPS 每秒磁盤進行的I/O操做次數
瀏覽器
IP地址分類/IP地址10開頭和172開頭和192開頭的區別/判斷是否同一網段緩存
簡單來講在公司或企業內部看到的就基本都是內網IP,ABC三類IP地址裏的常見IP段。
每一個IP地址都包含兩部分,即網絡號和主機號。
InterNIC將IP地址分爲五類:
A類保留給ZF或大型企業,
B類分配給中等規模的公司,
C類分配給小公司或我的,
D類用於組播,
E類用於實驗,
注:各種可容納的地址數目不一樣。
A、B、C三類IP地址的特徵:當將IP地址寫成二進制形式時,
A類地址的第一位老是O,如,10.0.0.1==00001010-00000000-00000000-00000001
==》1.0.0.0-127.255.255.255,默認子網掩碼爲255.0.0.0,最多可容納16777215臺計算機
B類地址的前兩位老是10,如,172.16.0.1==10101100-00010000-00000000-00000001
==》128.0.0.0-191.255.255.255,默認子網掩碼爲255.255.0.0,最多可容納65535臺計算機
C類地址的前三位老是110。如,192.168.0.1==11000000-10101000-00000000-00000001
==》192.0.0.0-223.255.255.255,默認子網掩碼是255.255.255.0,最多可容納254臺計算機
IP地址中保留地址:主機部分全爲0的IP地址保留用於網絡地址,主機部分全爲1的IP地址保留爲廣播地址,224--255部分保留做爲組播和實 驗目的。 同時注意IP地址分配時不能使用最末位爲0和255的地址,由於這是廣播地址,普通計算機上不能使用,但可用於網關和路由器上。
專用IP地址: 就是咱們在3類地址中常見到內網的IP段。
10.0.0.0--10.255.255.255
172.16.0.0--172.31.255.255
192.168.0.0--192.168.255.255
內網的計算機以NAT(網絡地址轉換)協議,經過一個公共的網關訪問Internet。內網的計算機可向Internet上的其餘計算機發送鏈接請求,但Internet上其餘的計算機沒法向內網的計算機發送鏈接請求。
主機地址種類
經過IP地址的引導位(最高位)來區分不一樣類別的IP地址:
注:n爲網絡編號位,h爲主機編號位
A類地址:0nnnnnnn.hhhhhhhh.hhhhhhhh.hhhhhhhh
A類地址具備7位網絡編號,所以可定義126個A類網絡{2^7-2(網絡編號不能是全0或全1 注1)-1(127爲環回地址 注2)}每一個網絡能夠擁有的主機數爲16777214{2^24-2(主機位不能是全0或全1)}
十進制表示範圍:1.0.0.1-126.255.255.254,任何一個0到127間的網絡地址均是一個A類地址。
B類地址:10nnnnnn.nnnnnnnn.hhhhhhhh.hhhhhhhh
B類地址具備14位網絡編號,所以可定義16382個B類網絡{2^14-2}
每一個網絡能夠擁有的主機數爲65534{2^16-2}
十進制表示範圍:129.0.0.1-191.255.255.254,任何一個128到191間的網絡地址是一個B類地址。
C類地址:110nnnnn.nnnnnnnn.nnnnnnnn.hhhhhhhh
C類地址具備21位網絡編號,所以可定義2097152個C類地址{2^21-2}
每一個網絡能夠擁有的主機數爲254{2^8-2}
十進制表示範圍:192.0.0.1-223.255.255.254,任何一個192到223間的網絡地址是一個C類地址。
D類地址:1110xxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx
D類地址用於組播,前面4位1110引導,後面28位爲組播地址ID。
十進制表示範圍:224.0.0.0-239.255.255.255
E類地址:老是以1111四位引導
E類地址用於研究用
十進制表示範圍:240-
IP地址由InterNIC(因特網信息中心)統一分配,以保證IP地址的惟一性,但有一類IP地址是不用申請可直接用於企業內部網的,這就是 Private Address,Private Address不會被INTERNET上的任何路由器轉發,欲接入INTERNET必需要經過NAT/PAT轉換,以公有IP的形式接入。
這些私爲地址爲:
10.0.0.0-10.255.255.255(一個A類地址)
172.16.0.0-172.31.255.255(16個B類地址)
192.168.0.0-192.168.255.255(256個C類地址)
任何一個第一個八位組在224到239間的網絡地址是一個組播地址
任何一個專用I P網絡都可以使用包括:
1個A類地址( 10.0.0.0 )、
16個B類地址(從172.16.0.0到172.31.0.0 )
256個C類地址(從192.168.0.0到192.168.255.0 )
觀察者模式,指的是定義一種對象間的一對多的關係,當一個對象的狀態發生變化的時候,全部依賴於它的對象都將獲得通知並更新本身。
「推」的方式是指,Subject維護一份觀察者的列表,每當有更新發生,Subject會把更新消息主動推送到各個Observer去。
「拉」的方式是指,各個Observer維護各自所關心的Subject列表,自行決定在合適的時間去Subject獲取相應的更新數據。
「推」的好處包括:
一、高效。若是沒有更新發生,不會有任何更新消息推送的動做,即每次消息推送都發生在確確實實的更新事件以後,都是有意義的。
二、實時。事件發生後的第一時間便可觸發通知操做。
三、能夠由Subject確立通知的時間,能夠避開一些繁忙時間。
四、能夠表達出不一樣事件發生的前後順序。
「拉」的好處包括:
一、若是觀察者衆多,Subject來維護訂閱者的列表,可能困難,或者臃腫,把訂閱關係解脫到Observer去完成。
二、Observer能夠不理會它不關心的變動事件,只須要去獲取本身感興趣的事件便可。
三、Observer能夠自行決定獲取更新事件的時間。
四、拉的形式可讓Subject更好地控制各個Observer每次查詢更新的訪問權限。
----------------------------------------------------------------------------------------------------------------------------------
補充:
事實上「推」和「拉」能夠比較的內容太多了,好比:
客戶端一般是不穩定的,服務端是穩定的,若是消息由客戶端主動發起去獲取,它很容易找到服務端的地址,能夠比較容易地作到權限控制(集中在服務端一處),服務端也能夠比較容易地跟蹤客戶端的位置和狀態,反之則不行;
互聯網頁面的訪問就是一個最好的「拉」的模式的例子;
一般咱們但願把壓力分散到各個客戶端上去,服務端只作最核心的事情,只提供內容,無論理分發列表;
……
還有一個idea是關於「推」和「拉」結合的形式,例如,服務端只負責通知某一些數據已經準備好,至因而否須要獲取和何時客戶端來獲取這些數據,徹底由客戶端自行肯定。
1 引言
http: 超文本傳輸協議http協議被用於在web瀏覽器和網站服務器之間傳遞信息,http協議以明文方式發送內容,不提供任何方式的數據加密,若是攻擊者截取了web瀏覽器和網站服務器之間的 傳輸報文,就能夠讀懂其中的信息。所以http協議不適合傳輸一些銀行卡號,密碼等敏感信息
https: https是以安全爲目標的http通道,簡單來講就是http的安全版,即http下加入ssl(secure sockets layer)層,https的安全基礎是ssl。https協議的主要做用能夠分爲兩種: 一種是創建一個信息安全通道,來保證數據傳輸的安全; 另外一種就是確認網站的真實性.
2 http和https的區別
1 https協議須要到ca申請證書,通常免費證書較少,所以須要必定費用
2 http是超文本傳輸協議,信息是明文傳輸,https則是具備安全性的ssl加密傳輸協議
3 http和https使用的是徹底不一樣的鏈接方式,用的端口不同,前者是80,後者是443
4 http的鏈接很簡單,是無狀態的; https協議是由ssl + http協議構建的可進行加密傳輸,身份認證的網絡協議,比http協議安全
3 通訊過程
客戶端在使用HTTPS方式與Web服務器通訊時有如下幾個步驟,如圖所示。
(1)客戶使用https的URL訪問Web服務器,要求與Web服務器創建SSL鏈接。
(2)Web服務器收到客戶端請求後,會將網站的證書信息(證書中包含公鑰)傳送一份給客戶端。
(3)客戶端的瀏覽器與Web服務器開始協商SSL鏈接的安全等級,也就是信息加密的等級。
(4)客戶端的瀏覽器根據雙方贊成的安全等級,創建會話密鑰,而後利用網站的公鑰將會話密鑰加密,並傳送給網站。
(5)Web服務器利用本身的私鑰解密出會話密鑰。
(6)Web服務器利用會話密鑰加密與客戶端之間的通訊。
4 https的優缺點
優勢:
(1) 使用HTTPS協議可認證用戶和服務器,確保數據發送到正確的客戶機和服務器
(2) HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,要比http協議安全,可防止數據在傳輸過程當中不被竊取、改變,確保數據的完整性。它是現行架構下最安全的解決方案,雖然不是絕對安全,但它大幅增長了中間人攻擊的成本。
缺點:
(1) https協議握手階段比較費時,會使頁面的加載時間延長近50%。
(2) https鏈接緩存不如http高效,會增長數據開銷和功耗,甚至已有的安全措施也會所以受到影響
(3) ssl證書須要錢,功能越強大費用越高,我的網站小型網站不必用
(4) 加密範圍比較有限,在黑客攻擊,拒絕服務攻擊,服務器劫持等方面起不到什麼做用。最關鍵的,SSL證書的信用鏈體系並不安全,特別是在某些國家能夠控制CA根證書的狀況下,中間人攻擊同樣可行。
當咱們在瀏覽器輸入網址並回車後,一切從這裏開始
1 DNS域名解析
將域名解析成對應的服務器ip地址這項工做,是由DNS服務器完成的
客戶端收到你輸入的域名地址後,它首先去找本地的hosts文件,檢查在該文件中是否有相應的域名,ip對應關係。若是有,則向其IP地址發送請求,若沒有,再去找DNS服務器。通常用戶不多去編輯修改hosts文件
DNS服務器層次結構
瀏覽器客戶端向本地DNS服務器發送一個含有域名www.cnblogs.com的DNS查詢報文。本地DNS服務器把查詢報文轉發到根DNS服務器,根DNS服務器注意到其com後綴,因而向本地DNS服務器返回comDNS服務器的IP地址。本地DNS服務器再次向comDNS服務器發送查詢請求,comDNS服務器注意到其www.cnblogs.com後綴並用負責該域名的權威DNS服務器的IP地址做爲迴應。最後,本地DNS服務器將含有www.cnblogs.com的IP地址的響應報文發送給客戶端。
從客戶端到本地服務器屬於遞歸查詢,而DNS服務器之間的交互屬於迭代查詢。
正常狀況下,本地DNS服務器的緩存中已有comDNS服務器的地址,所以請求根域名服務器這一步不是必需的。
2 創建TCP鏈接
費了一頓周折終於拿到服務器IP了,下一步天然就是連接到該服務器。對於客戶端與服務器的TCP連接,必然要說的就是『三次握手』。
客戶端發送一個帶有SYN標誌的數據包給服務端,服務端收到後,回傳一個帶有SYN/ACK標誌的數據包以示傳達確認信息,最後客戶端再回傳一個帶ACK標誌的數據包,表明握手結束,鏈接成功。
上圖也能夠這麼理解:
客戶端:「你好,在家不,有你快遞。」
服務端:「在的,送來就行。」
客戶端:「好嘞。」
3 發送http請求
與服務器創建了鏈接後,就能夠向服務器發起請求了。這裏咱們先看下請求報文的結構(以下圖):
在瀏覽器中查看報文首部(以google瀏覽器爲例):
請求行包括請求方法、URI、HTTP版本。首部字段傳遞重要信息,包括請求首部字段、通用首部字段和實體首部字段。咱們能夠從報文中看到發出的請求的具體信息。具體每一個首部字段的做用,這裏不作過多闡述。
4 服務器處理請求
服務器端收到請求後的由web服務器(準確說應該是http服務器)處理請求,諸如Apache、Ngnix、IIS等。web服務器解析用戶請求,知道了須要調度哪些資源文件,再經過相應的這些資源文件處理用戶請求和參數,並調用數據庫信息,最後將結果經過web服務器返回給瀏覽器客戶端。
服務器處理請求
5 返回響應結果
在HTTP裏,有請求就會有響應,哪怕是錯誤信息。這裏咱們一樣看下響應報文的組成結構:
在響應結果中都會有個一個HTTP狀態碼,好比咱們熟知的200、30一、40四、500等。經過這個狀態碼咱們能夠知道服務器端的處理是否正常,並能瞭解具體的錯誤。
狀態碼由3位數字和緣由短語組成。根據首位數字,狀態碼能夠分爲五類:
6 關閉TCP鏈接
爲了不服務器與客戶端雙方的資源佔用和損耗,當雙方沒有請求或響應傳遞時,任意一方均可以發起關閉請求。與建立TCP鏈接的3次握手相似,關閉TCP鏈接,須要4次握手。
上圖能夠這麼理解:
客戶端:「兄弟,我這邊沒數據要傳了,咱關閉鏈接吧。」
服務端:「收到,我看看我這邊有木有數據了。」
服務端:「兄弟,我這邊也沒數據要傳你了,咱能夠關閉鏈接了。」
客戶端:「好嘞。」
7 瀏覽器解析HTML
準確地說,瀏覽器須要加載解析的不只僅是HTML,還包括CSS、JS。以及還要加載圖片、視頻等其餘媒體資源。
瀏覽器經過解析HTML,生成DOM樹,解析CSS,生成CSS規則樹,而後經過DOM樹和CSS規則樹生成渲染樹。渲染樹與DOM樹不一樣,渲染樹中並無head、display爲none等沒必要顯示的節點。
要注意的是,瀏覽器的解析過程並不是是串連進行的,好比在解析CSS的同時,能夠繼續加載解析HTML,但在解析執行JS腳本時,會中止解析後續HTML,這就會出現阻塞問題,關於JS阻塞相關問題,這裏不過多闡述。
8 瀏覽器佈局渲染
根據渲染樹佈局,計算CSS樣式,即每一個節點在頁面中的大小和位置等幾何信息。HTML默認是流式佈局的,CSS和js會打破這種佈局,改變DOM的外觀樣式以及大小和位置。這時就要提到兩個重要概念:replaint和reflow。
replaint:屏幕的一部分重畫,不影響總體佈局,好比某個CSS的背景色變了,但元素的幾何尺寸和位置不變。
reflow: 意味着元件的幾何尺寸變了,咱們須要從新驗證並計算渲染樹。是渲染樹的一部分或所有發生了變化。這就是Reflow,或是Layout
因此咱們應該儘可能減小reflow和replaint,我想這也是爲何如今不多有用table佈局的緣由之一。
最後瀏覽器繪製各個節點,將頁面展現給用戶。
前段時間在使用百度網盤時,忽然發現百度網盤能夠免費領取 2TB 空間啦!
網絡硬盤你們可能都或多或少的接觸過,不得不說在萬物皆雲的時代裏,這是一種很是好的網絡工具,而對咱們這種窮到掉渣的免費用戶來講,硬盤空間簡直就是硬傷,剛開始使用的時候真是爲了空間,各類折騰(作他那裏所謂的任務),到頭來也才擴充了5G左右。如今好了,隨隨便便、輕輕鬆鬆就有了2T的空間。
而這突如其來的2T空間是如何實現的呢?
事實是這樣滴!
假如我想要爲每一個用戶提供 1G 的網絡存儲空間。
若是服務器上有一顆 1000G 的硬盤能夠所有爲用戶提供數據儲存,若是每一個用戶分配 1G 的最大儲存空間,那麼能分配給多少個用戶使用呢?
你必定說是 1000/1=1000 個用戶。
可是事實上你這麼分配了,你會發現每一個用戶平時根本不會上傳 1G 的東西將容量佔的滿滿的,有多有少,但平均用戶平時只上傳 50M 的文件,也就是說,若是你將 1000G 的硬盤分給 1000我的使用,但只有效利用了其中的 50M*1000=50G 的空間,剩餘 950G 的空間基本都徹底浪費了。
那麼怎麼解決呢?
你能夠變通一下,將這 1000G 的空間分配給 20000個用戶使用,每一個人的上傳上限容量仍是1G,但每人平時仍是平均上傳 50M 的數據,那麼 20000*50M=1000G,這下子就把寶貴的服務器上的存儲空間充分利用了。但你又怕這樣分配給 20000我的後,萬一某一刻人們忽然多上傳點數據,那麼用戶不是就覺察出來你分給人家的 1G 空間是假的了嗎?因此能夠不分配那麼多人,只分配給 19000 人,剩下一些空間作應急之用。
忽然發現一會兒將可分配的用戶數量翻了 19倍啊,了不得。那還有沒有辦法更加有效的利用一下呢?
若是我有 1000個 以上的服務器,一個服務器上有 1000G 空間,那麼咱們每一個服務器上都要留下 50G 的空白空間以備用戶忽然上傳大數據時致使數據塞滿的狀況,那麼我這 1000個服務器上就空出了 1000臺*50G=50000G 的空間被浪費了,多麼惋惜。因此攻城獅們發明了存儲集羣,使得一個用戶的數據能夠被分配在多個服務器上存儲,但在用戶那看起來只是一個 1G 的連續空間,那麼就不必在每一個服務器上預留出應急的空間了,甚至能夠充分的將前一個服務器塞滿後,在將數據往下一個服務器中塞。這樣保證了服務器空間的 最大利用,若是某一刻管理員發現用戶都在瘋狂上傳數據(在一個大規模用戶羣下,這樣的機率少之又少)致使我現有提供的空間不夠了,不要緊,只須要隨手加幾塊硬盤或者服務器就解決了。
好吧,這下子咱們的服務器空間利用高多了,能夠將必定量的空間分配給最多的用戶使用了。但有沒有更好的改進方案呢?
管理員有一天發現,即便每一個用戶平均下來只存儲 50M 的東西,但這 50M 也不是一蹴而就的,是隨着1-2年的使用慢慢的達到這個數量的,也就是說,一個新的用戶剛剛註冊個人網絡空間時,不會上傳東西,或者只上傳一點很是小的東西。那麼我爲每個用戶都初始分配了 50M 的空間,即便未來2年後他們會填滿這 50M ,但這期間的這空間就有不少是浪費的啊。因此聰明的攻城獅說:既然咱們能夠分佈式、集羣式存儲,一個用戶的數據能夠分佈在多個服務器上,那麼咱們就假設一開始就給一個新註冊的用戶提供 0M 的空間,未來他用多少,我就給他提供多少存儲空間,這樣就完全的保證硬盤的利用了。但用戶的前端仍是要顯示 1G 的。
工程師的這個點子,使得我在創建網盤初期能用 1臺 1000G 的服務器提供了大約 1000000 人來註冊和使用,隨着註冊的人多了,我也有錢了,也能夠不斷增長服務器以提供他們後期的存儲了。同時由於一部分服務器完成了一年多購買,個人購買成本也下來了。
那麼…這就結束了嗎?
如果郵箱提供商的話,這樣的利用率夠高了。但網盤就不同了。
聰明的工程師發現:不一樣於郵箱,你們的內容和附件絕大多數都是自創的和不一樣的。但網盤上你們上傳的東西不少都是重複的。
好比:張三今天下載了一部《TOKYO HOT》上傳到了本身的網盤上,李四在三天後也下載瞭如出一轍的《TOKYO HOT》上傳到了網絡硬盤上,隨着用戶的增多,你會發現總共有 1000我的上傳了1000份如出一轍的文件到你寶貴的服務器空間上,因此工程師想出一個辦法,既然是同樣的文件,我就只存一份不久好啦,而後在用戶的前端顯示是沒人都有一份不久行啦。當某些用戶要刪除這個文件的時候,我並不真的刪除,只須要在前端顯示彷佛刪除了,但後端一直保留着以供其餘擁有此文件的用戶下載。直到全部使用此文件的用戶都刪除了這個文件我再真的將其刪除吧。
這樣子隨着存儲的數據愈來愈多,註冊的用戶愈來愈多,其上傳的重複數據愈來愈多。你發現這樣的檢測重複文件存儲的效率愈來愈大。這樣算下來彷佛每一個人上傳的不重複的文件只能平均 1M/用戶。這下子你能夠提供超過50倍的用戶使用您這有限的空間了。
但伴隨着使用,你又發現一個規律:
張三上傳的《TOKYO HOT N0124》和李四上傳的《TH n124》是同一個文件,只不過文件名不同,難道我就不能識別出他們是一個文件,而後只將其分別給不一樣的用戶保存成不一樣的文件名不就行啦?確實可行,但這要利用一些識別文件相同性的算法,例如MD5值等。只要兩個文件的 MD5 值同樣,文件大小同樣,我就認爲它們是相同的文件,只須要保存一份文件並給不一樣的用戶記做不一樣的文件名就行了。
有一天你發現,由於每個文件都須要計算 MD5 值,致使 CPU 負荷很大,並且原本同樣的文件非要浪費帶寬上傳回來才能夠檢測一致性,能改進一下嗎?
聰明的工程師寫了個小軟件或小插件,美其名曰「上傳控件」,將計算 MD5 的工做利用這個軟件交給了上傳用戶的電腦來完成,一旦計算出用戶要上傳的數據和服務器上已經存儲的某個數據是同樣的,就乾脆不用上傳了,直接在用戶那裏標記上這個文件已經按照 XX 文件名上傳成功了。這個過程幾乎是瞬間搞定了,並給其起了個高富帥的名字「秒傳」!
經過以上這麼多步驟,你發現原本你只能給 1000用戶 提供網絡空間的,這麼多改進辦法後,在用戶端顯示 1G 空間不變的狀況下,近乎能夠爲 1000000個用戶 提供網絡空間了。
這樣如果您哪天心情好,對外宣傳說:我要將每一個用戶的存儲空間上限提高到 1TB。那麼每一個用戶平均仍是隻上傳 50M 數據,只有極個別的用戶上傳了突破 1G 原始空間的數據,你會發現所付出的成本近乎是微乎其微的。
辛勤的攻城獅還在爲如何更有效率的利用服務器提供的磁盤空間在不屑努力和挖掘着……