Web 網(wǎng)站性能優(yōu)化思路

網(wǎng)站性能優(yōu)化是在網(wǎng)站遇到問題時的解決方案。網(wǎng)站性能問題大多是因為用戶高并發(fā)訪問時引起的混埠,所以網(wǎng)站性能優(yōu)化的主要工作就是改善用戶高并發(fā)訪問時的響應(yīng)速度脆丁。

web 前端性能優(yōu)化

減少 HTTP 請求

因為 HTTP 每次的請求的代價都是很昂貴的,所以減少 HTTP 請求的數(shù)目可以有效的提高訪問性能续搀。

減少 HTTP 請求次數(shù)的手段主要是合并 CSS帐我、合并 JavaScript坎炼、合并圖片。將頁面需要的 JavaScript拦键、CSS 合并成一個文件谣光,這樣瀏覽器只需要一次請求即可。

使用瀏覽器緩存

對于一個網(wǎng)站而言芬为,CSS萄金、JavaScript、Logo媚朦、圖片這些靜態(tài)資源文件的更新頻率比較低氧敢,而這些文件又幾乎是每個頁面都需要用到的。將這些文件緩存到瀏覽器中可以很好的改善網(wǎng)站性能询张。

通過設(shè)置 HTTP 響應(yīng)頭中的 Cache-Control 和 Expires 數(shù)據(jù)可以設(shè)定瀏覽器是否開啟緩存孙乖,及緩存時間。

如果某些靜態(tài)文件按需要及時更新,可以通過改變文件名實現(xiàn)唯袄。

使用壓縮

文本文件的壓縮效率可以達(dá)到 80% 以上弯屈,在服務(wù)器對 HTML、CSS恋拷、JavaScript 文件使用 GZip 壓縮资厉,然后在瀏覽器中解壓,可以有效的減少通信傳輸?shù)臄?shù)據(jù)量蔬顾。

但是壓縮是很耗費(fèi) CPU 資源的宴偿,對服務(wù)器會產(chǎn)生一定的壓力。如果服務(wù)器壓力大阎抒,而帶寬足夠的情況下建議最好不要啟用壓縮酪我。優(yōu)化第一步要做的就是找到性能瓶頸,不然很容易負(fù)優(yōu)化且叁。

CSS 放置在頁面最上面,JavaScript 放在網(wǎng)頁最下面

瀏覽器會在下載完所有需要用到的 CSS 之后才會對整個頁面進(jìn)行渲染秩伞,因此最后的做法是將 CSS 放在頁面最上面逞带,讓瀏覽器盡快下載 CSS。而 JavaScript 剛好相反纱新,瀏覽器在加載 JavaScript 后會立即執(zhí)行展氓,有可能會阻塞,造成頁面顯示緩慢脸爱,因此 JavaScript 最好放在頁面最下邊遇汞。

但是,如果頁面解析是就需要 JavaScript簿废,那就不適用此條優(yōu)化建議

減少 Cookie 和 Token 承載的數(shù)據(jù)量

Cookie 包含在每次請求和響應(yīng)中空入,太大的 Cookie 會嚴(yán)重影響數(shù)據(jù)傳輸,因此寫入數(shù)據(jù)到 Cookie 時要考慮這個數(shù)據(jù)是不是必須的族檬。盡量要減少 Cookie 承載的數(shù)據(jù)量歪赢。

現(xiàn)在網(wǎng)站使用 restful 風(fēng)格,使用 Token 作為用戶憑證单料。如果網(wǎng)站的大部分接口都需要使用 token埋凯,那么也需要減少 Token 承載內(nèi)容。還有 Token 的 payload 部分是沒有加密的扫尖,只是用了 base64 做了編碼白对,放太多內(nèi)容可能會導(dǎo)致用戶信息泄露。

使用 CDN 加速

CDN 的本質(zhì)就是一個緩存换怖,讓用戶就近獲取所需內(nèi)容甩恼,降低網(wǎng)絡(luò)擁塞,提高用戶訪問響應(yīng)速度。CDN 能夠緩存一些靜態(tài)文件媳拴,如圖片黄橘、文件、CSS屈溉、Script 腳本塞关、靜態(tài)網(wǎng)頁等。

使用 Nginx

使用 Nginx 做靜態(tài)服務(wù)器子巾,反向代理帆赢、負(fù)載均衡。

后端服務(wù)器優(yōu)化

應(yīng)用服務(wù)器是網(wǎng)開發(fā)最復(fù)炸线梗,變化最多的地方椰于,優(yōu)化的手段主要有緩存、集群仪搔、異步瘾婿。

使用緩存

當(dāng)網(wǎng)站遇到瓶頸的時候,首先想到的應(yīng)該就是能不能使用緩存優(yōu)化烤咧。在整個網(wǎng)站應(yīng)用中緩存無處不在偏陪,瀏覽器、服務(wù)器煮嫌、數(shù)據(jù)庫都有使用緩存優(yōu)化性能笛谦。合理的使用緩存對網(wǎng)站性能優(yōu)化意義重大。

使用緩存為什么可以優(yōu)化網(wǎng)站性能昌阿?

  1. 緩存是存儲在可以高速訪問的介質(zhì)中的饥脑,如內(nèi)存,cpu 的一級二級緩存懦冰,所以使用緩存可以提高獲取數(shù)據(jù)的速度灶轰。
  2. 我們可以緩存一些經(jīng)過復(fù)雜計算才能得到的結(jié)果。減少計算量儿奶,這就是常說的空間換時間框往。

使用緩存可以提高系統(tǒng)性能,但是不合理的使用緩存非但不能提供系統(tǒng)性能還會成為系統(tǒng)的累贅闯捎,甚至風(fēng)險椰弊。在開發(fā)中如何合理使用緩存?

  1. 緩存頻繁修改的數(shù)據(jù)瓤鼻。如果緩存的事平凡修改的數(shù)據(jù)秉版,會出現(xiàn)數(shù)據(jù)寫入緩存后,還沒有讀取就失效了茬祷,用了緩存跟沒用一樣反而還增添了系統(tǒng)負(fù)擔(dān)清焕。
  2. 不緩存沒有熱點數(shù)據(jù)。因為內(nèi)存有限,不可能將所有數(shù)據(jù)都緩緩存秸妥,我們需要盡可能緩存可能被大量訪問的部分滚停。
  3. 不緩存一致性強(qiáng)的的數(shù)據(jù)。有的緩存的數(shù)據(jù)超過的失效時間才會從數(shù)據(jù)庫從新加載粥惧,因此要容忍一定時間的數(shù)據(jù)不一致键畴。

緩存的一些概念解釋

  • 緩存雪崩:緩存服務(wù)器崩潰,或者大量緩存失效導(dǎo)致的請求全落在數(shù)據(jù)庫上導(dǎo)致書庫宕機(jī)突雪。
  • 緩存穿透:因為業(yè)務(wù)邏輯問題或則惡意攻擊持續(xù)高并發(fā)的請求不存在的數(shù)據(jù)起惕,所有的請求落在數(shù)據(jù)苦。
  • 緩存預(yù)熱:新啟動的緩存沒有任何數(shù)據(jù)咏删,在建立緩存過程中惹想,系統(tǒng)的新能和負(fù)載都不太好。最好的做法是啟時先把熱點數(shù)據(jù)加載到緩存督函。

異步

使用消息隊列的異步可以改善服務(wù)器性能嘀粱。

比如,用戶請求驗證碼辰狡,我們把用戶請求發(fā)送給消息隊列后立即返回草穆,再由消息隊列的消費(fèi)者從隊列獲取消息,異步發(fā)送驗證碼搓译。所以使用異步可以有效的提高接口響應(yīng)速度。

消息隊列還具有很好的削峰作用锋喜,將短時間高并發(fā)產(chǎn)生的消息存儲到消息隊列中些己,然后在一一處理。比如在促銷開始時涌入的大量訂單嘿般,如果不適用消息隊列可能超出服務(wù)器負(fù)荷段标,對服務(wù)器造成沖擊。

使用集群

使用負(fù)載均衡為一個應(yīng)用構(gòu)建一個有多臺服務(wù)器組成的服務(wù)器集群講并發(fā)訪問請求分發(fā)到多臺服務(wù)器上處理炉奴。避免單一服務(wù)器因為負(fù)載壓力過大響應(yīng)過慢逼庞。

代碼優(yōu)化

多線程

從資源利用的角度來看,使用多線程主要的原因有兩個瞻赶, IO 阻塞與多 CPU赛糟。

線程 IO 阻塞會釋放 CPU 資源,這時候 CPU 可以調(diào)度其他線程砸逊。

另一個原因是現(xiàn)在的處理器都是多核想要最大限度的使用這些CPU必須使用多線程璧南。

使用多線程需要注意線程安全問題,既多線程并發(fā)對共享資源進(jìn)行修改师逸,導(dǎo)致數(shù)據(jù)不一致司倚。線程安全產(chǎn)生的 bug 難以測試和重現(xiàn)。

編程上解決線程安全的主要手段有幾點

  • 將對象設(shè)計成無狀態(tài)對象。就是對象本身不存儲狀態(tài)信息动知,這樣多線程并發(fā)訪問時就不會出現(xiàn)狀態(tài)不一致皿伺,Java Servlet 對象就設(shè)計成了無狀態(tài)對象。
  • 使用局部變量:因為在 Java 中局部變量是存儲在棧中的盒粮,棧是線程獨享的鸵鸥。
  • 使用鎖:并發(fā)訪問時使用鎖,通過鎖將并發(fā)訪問轉(zhuǎn)換為順序操作拆讯,從而避免資源被并發(fā)修改脂男。

資源復(fù)用

系統(tǒng)運(yùn)行時要盡量開銷很大的系統(tǒng)資源創(chuàng)建和銷毀。比如說數(shù)據(jù)庫連接种呐、網(wǎng)絡(luò)通信連接宰翅、線程和復(fù)雜對象。

資源復(fù)用主要有兩種方式

  1. 單例爽室,因為目前 web 開發(fā)主要使用貧血模式汁讼,從 Service 到 DAO 都是無狀態(tài)對象,無需重復(fù)創(chuàng)建阔墩,使用單例模式也是自然而然的嘿架,事實上如果不特別配置的話 Spring 構(gòu)造的對象都是單例的。
  2. 對象池啸箫,對象池通過復(fù)用實例對象耸彪,減少對象的創(chuàng)建和資源消耗。比如數(shù)據(jù)庫連接對象忘苛,如果每次使用都創(chuàng)建一個新的蝉娜,大量的時間耗費(fèi)在創(chuàng)建和關(guān)閉連接上。使用連接池的方式扎唾,連接對象統(tǒng)一存儲在對象池中召川,需要連接是就從連接池中獲取一個空閑連接,使用完畢歸還即可胸遇,不需要重復(fù)的創(chuàng)建銷毀荧呐。

存儲性能優(yōu)化

一句話花錢上固態(tài)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纸镊,一起剝皮案震驚了整個濱河市倍阐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌薄腻,老刑警劉巖收捣,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異庵楷,居然都是意外死亡罢艾,警方通過查閱死者的電腦和手機(jī)楣颠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咐蚯,“玉大人童漩,你說我怎么就攤上這事〈悍妫” “怎么了矫膨?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長期奔。 經(jīng)常有香客問我侧馅,道長,這世上最難降的妖魔是什么呐萌? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任馁痴,我火速辦了婚禮,結(jié)果婚禮上肺孤,老公的妹妹穿的比我還像新娘罗晕。我一直安慰自己,他們只是感情好赠堵,可當(dāng)我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布小渊。 她就那樣靜靜地躺著,像睡著了一般茫叭。 火紅的嫁衣襯著肌膚如雪酬屉。 梳的紋絲不亂的頭發(fā)上坞靶,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天扁掸,我揣著相機(jī)與錄音,去河邊找鬼劫樟。 笑死吗垮,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的凹髓。 我是一名探鬼主播烁登,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蔚舀!你這毒婦竟也來了饵沧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤赌躺,失蹤者是張志新(化名)和其女友劉穎狼牺,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體礼患,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡是钥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年掠归,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悄泥。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡虏冻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出弹囚,到底是詐尸還是另有隱情厨相,我是刑警寧澤,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布鸥鹉,位于F島的核電站蛮穿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏毁渗。R本人自食惡果不足惜践磅,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望祝蝠。 院中可真熱鬧音诈,春花似錦、人聲如沸绎狭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽儡嘶。三九已至喇聊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蹦狂,已是汗流浹背誓篱。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留凯楔,地道東北人窜骄。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像摆屯,于是被迫代替她去往敵國和親邻遏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,666評論 2 350