通過(guò)設(shè)置Http頭中的Cache-和的屬性。靜態(tài)資源的更新不要直接更新文件內(nèi)容,要通過(guò)更改文件名的方式更新。更新講臺(tái)資源的時(shí)候使用逐量更新。
使用GZIP壓縮,在服務(wù)端對(duì)文件進(jìn)行壓縮,在瀏覽器端對(duì)文件解壓縮可以減少通信傳輸?shù)臄?shù)據(jù)量。但是該種方式會(huì)對(duì)服務(wù)器產(chǎn)生一定的壓力,在款低啊良好而服務(wù)器資源不足的情況下要權(quán)衡考慮。
瀏覽器會(huì)在下載完全部的CSS之后才會(huì)對(duì)頁(yè)面進(jìn)行渲染,所以最好的方式是把CSS放在頁(yè)面最上面;但是JS則相反(如果頁(yè)面解析時(shí)就要用的js還是要放在最上面)。
比如用戶的登錄信息,可以考慮使用攔截器,在用戶登錄的時(shí)候把登錄信息和用戶的相關(guān)信息存放在里面。
CDN的本質(zhì)就是把資源放在離用戶最近的地方,CDN能夠緩存的一般是靜態(tài)資源,如圖片、文件、CSS、js腳本,靜態(tài)網(wǎng)頁(yè)。
反向代理服務(wù)器的兩個(gè)用途:
①保護(hù)網(wǎng)站安全;
②配置緩存功能可以加速web請(qǐng)求;
③負(fù)載均衡,可以提高網(wǎng)站的并發(fā)數(shù)
后臺(tái)服務(wù)器常用的優(yōu)化方式
緩存相關(guān)知識(shí)
后臺(tái)性能優(yōu)化的第一定律:優(yōu)先考慮使用緩存優(yōu)化性能。
緩存的本質(zhì)
緩存的本質(zhì)就是一個(gè)內(nèi)存Hash表,數(shù)據(jù)以一對(duì)Key\Value鍵值對(duì)存儲(chǔ)在內(nèi)存Hash表中。主要用戶存放讀寫比很高、很少變化的數(shù)據(jù),網(wǎng)站數(shù)據(jù)通常遵循“二八定律”,即80%的訪問(wèn)落在20%的數(shù)據(jù)上,因此,將這20%的數(shù)據(jù)緩存起來(lái),可以很好的改善系統(tǒng)性能。
合理的使用緩存
合理的使用緩存對(duì)提高系統(tǒng)性能有很多好處,但是不合理的使用緩存反而會(huì)成為系統(tǒng)的累贅甚至風(fēng)險(xiǎn)。濫用緩存的三種情況如下:
數(shù)據(jù)的讀寫比至少應(yīng)該是2:1以上,即寫入一次緩存,在數(shù)據(jù)更新前至少讀寫兩次,緩存才有意義。真正實(shí)踐中這個(gè)比例可能會(huì)更高。
如果應(yīng)用系統(tǒng)訪問(wèn)數(shù)據(jù)沒(méi)有熱點(diǎn),不遵循二八定律,即大部分?jǐn)?shù)據(jù)訪問(wèn)并沒(méi)有集中在小部分?jǐn)?shù)據(jù)中,那么緩存也沒(méi)有意義,因?yàn)榇蟛糠謹(jǐn)?shù)據(jù)還沒(méi)有被再次訪問(wèn)就已經(jīng)被擠出緩存了。
寫入緩存的數(shù)據(jù)最好能容忍一定時(shí)間的數(shù)據(jù)不一致,一般情況下最好對(duì)緩存的數(shù)據(jù)設(shè)置失效時(shí)間(固定值+一定范圍的隨機(jī)值)。如果不能容忍數(shù)據(jù)的不一致,必須在數(shù)據(jù)更新時(shí),刪除對(duì)應(yīng)的緩存(思考:為什么不是更新緩存),但是這種情況只針對(duì)讀寫比非常高的情況。
緩存的常見(jiàn)問(wèn)題優(yōu)化手段
緩存雪崩我們可以簡(jiǎn)單的理解為:由于原有緩存失效,新緩存未到期間(例如:我們?cè)O(shè)置緩存時(shí)采用了相同的過(guò)期時(shí)間,在同一時(shí)刻出現(xiàn)大面積的緩存過(guò)期),所有原本應(yīng)該訪問(wèn)緩存的請(qǐng)求都去查詢數(shù)據(jù)庫(kù)了,而對(duì)數(shù)據(jù)庫(kù)CPU和內(nèi)存造成巨大壓力,嚴(yán)重的會(huì)造成數(shù)據(jù)庫(kù)宕機(jī)。從而形成一系列連鎖反應(yīng),造成整個(gè)系統(tǒng)崩潰。
該類問(wèn)題的解決方式主要有三種:
①加鎖排隊(duì)。大概原理是在去數(shù)據(jù)庫(kù)取數(shù)據(jù)的時(shí)候加鎖排隊(duì),該方法僅僅適用于并發(fā)量不高的情況。
②在原有失效時(shí)間基礎(chǔ)上加一個(gè)合理的隨機(jī)值(0-5分鐘)。分布式場(chǎng)景下最常見(jiàn)的方式(單機(jī)也可以)。
③給緩存加標(biāo)記,在緩存失效之后更新緩存數(shù)據(jù)。
緩存穿透是指用戶查詢數(shù)據(jù),在數(shù)據(jù)庫(kù)沒(méi)有,自然在緩存中也不會(huì)有。這樣就導(dǎo)致用戶查詢的時(shí)候,在緩存中找不到,每次都要去數(shù)據(jù)庫(kù)再查詢一遍,然后返回空(相當(dāng)于進(jìn)行了兩次無(wú)用的查詢)。
該類問(wèn)題的主要解決方式。
①使用布隆過(guò)濾器做過(guò)濾。該方法僅僅用于查詢一個(gè)不可能存在的數(shù)據(jù)。
②把不存在的數(shù)據(jù)也緩存起來(lái)。最佳實(shí)踐:?jiǎn)为?dú)設(shè)置比較短的過(guò)期時(shí)間網(wǎng)站優(yōu)化,比如說(shuō)五分鐘。
緩存中存放的是熱點(diǎn)數(shù)據(jù),熱點(diǎn)數(shù)據(jù)又是緩存系統(tǒng)利用某種算法對(duì)不斷訪問(wèn)的數(shù)據(jù)篩選淘汰出來(lái)的,在重建緩存數(shù)據(jù)的過(guò)程中,系統(tǒng)的性能和數(shù)據(jù)庫(kù)負(fù)載都不太好,那么多好的方式就是在緩存系統(tǒng)啟動(dòng)的時(shí)候就把熱點(diǎn)數(shù)據(jù)加載好,這個(gè)緩存預(yù)加載的手段叫做緩存預(yù)熱。對(duì)于一些元數(shù)據(jù)如省市區(qū)列表,類目信息,就可以在啟動(dòng)的加載數(shù)據(jù)庫(kù)中的全部數(shù)據(jù)。
分布式緩存架構(gòu)
分布式緩存是指緩存部署在多個(gè)服務(wù)器組成的集群中,以集群方式提供緩存服務(wù),其架構(gòu)方式有兩種:
①以 Cache為代表的需要更新同步的分布式緩存(在所有服務(wù)器中保存相同的緩存數(shù)據(jù))。
②以為代表的互不通信的分布式緩存(應(yīng)用程序通過(guò)一致性Hash等路由算法選擇緩存服務(wù)器遠(yuǎn)程訪問(wèn)遠(yuǎn)程數(shù)據(jù),可以會(huì)容易的擴(kuò)容,具有良好的可伸縮性)。
異步
使用異步操作,可以大幅度改善網(wǎng)站的性能,使用異步的兩種場(chǎng)景,高并發(fā)、微服務(wù);
①高并發(fā),在不使用消息隊(duì)列的情況下,用戶的請(qǐng)求數(shù)據(jù)直接寫入數(shù)據(jù)庫(kù),在高并發(fā)的情況下會(huì)對(duì)數(shù)據(jù)庫(kù)造成一定的壓力,同時(shí)也使得響應(yīng)延遲加劇。使用消息隊(duì)列具有很好的削峰作用,在電子商務(wù)網(wǎng)站促銷活動(dòng)中,使用消息隊(duì)列是常見(jiàn)的技術(shù)手段。
②微服務(wù)之間調(diào)用網(wǎng)站優(yōu)化,在微服務(wù)流行的當(dāng)下,有時(shí)候我們調(diào)用其他系統(tǒng)的微服務(wù)接口,只是為了通知其他系統(tǒng),我們不關(guān)心結(jié)果,這個(gè)時(shí)候我們可以使用單獨(dú)的線程池異步調(diào)用其他系統(tǒng)的微服務(wù),這樣可以減少程序的響應(yīng)時(shí)間。
任何可以晚點(diǎn)的事情都應(yīng)該晚點(diǎn)再做。
集群
在網(wǎng)站高并發(fā)訪問(wèn)的場(chǎng)景洗下,使用負(fù)載均衡技術(shù)為一個(gè)應(yīng)用構(gòu)建一個(gè)由多臺(tái)服務(wù)器組成的服務(wù)器集群,可以避免單一服務(wù)器因負(fù)載壓力過(guò)大而響應(yīng)緩慢。常用的負(fù)載均衡技術(shù)有以下幾種:
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。