緩存
頁面緩存
頁面緩存的有效期比較短,因為頁面具有即時性
- 取緩存
- 手動渲染模版
- 結果輸出
URL緩存
與頁面緩存的區(qū)別就是不同的頁面有不同的id啦
對象緩存
根據(jù)緩存取一個對象,對象緩存期望永久有效
- 取緩存
- 若緩存中沒有,取數(shù)據(jù)庫,并且加載進緩存
- 如果是更新操作,一定要記得處理緩存
service之間一定是調別人的service,不要調用別人的dao,因為在service中可能會涉及緩存操作,而dao是純數(shù)據(jù)庫
Cache Aside Pattern
失效:從cache中取數(shù)據(jù),如果沒取到,則從數(shù)據(jù)庫中取,成功后放入緩存
命中:從cache中取到了數(shù)據(jù),取到后返回
更新:先把數(shù)據(jù)存到數(shù)據(jù)庫中,成功后再讓緩存失效
一定不能先讓緩存失效,再更新數(shù)據(jù)庫
頁面靜態(tài)化,前后端分離
頁面為純HTML,使用js ajax請求數(shù)據(jù)來渲染頁面
常用技術AngularJs、Vue.js
靜態(tài)數(shù)據(jù)可以緩存到客戶端,從服務器只需下載動態(tài)數(shù)據(jù)
GET POST的區(qū)別
get是冪等的,從服務端獲取數(shù)據(jù)時無論調用多少次結果都一樣,不會對服務端產生任何影響
post向服務端提交數(shù)據(jù),會對服務端數(shù)據(jù)產生改變
304
客戶端向服務端詢問靜態(tài)頁面有沒有發(fā)生變化,沒有變化服務端就返回304表示從而讓客戶端可以直接使用本地緩存
但盡管304客戶端和服務端還是會有一次交互,怎么客戶端直接從瀏覽器取數(shù)據(jù),不需要詢問服務端呢? spring有相關的配置,可以直接取瀏覽器緩存
超賣問題的解決
- 秒殺service中,步驟為減庫存、下訂單,如果兩個線程同時進入秒殺方法,要減庫存,就會出現(xiàn)超賣問題。
數(shù)據(jù)庫update時增加stock_count > 0限制條件。因為數(shù)據(jù)庫會自動加鎖,不會有兩個線程同時進入。 - 一個用戶通過抓取接口同時發(fā)起兩個請求,秒殺到兩個商品。
在數(shù)據(jù)庫的秒殺訂單表上,為用戶Id和商品Id建立唯一索引,防止用戶插入重復記錄。但現(xiàn)實中,會使用驗證碼解決,不讓用戶發(fā)出兩個請求。
靜態(tài)資源優(yōu)化
- JS/CSS壓縮,減少流量
- 多個JS/CSS組合,減少連接數(shù)
CDN優(yōu)化
內容分發(fā)網絡,約等于緩存,在整個互聯(lián)網上有很多節(jié)點,把數(shù)據(jù)在每個節(jié)點上都做一次緩存。根據(jù)用戶的位置,將用戶的請求定位到最近的CDN鏡像上。
總結
解決并發(fā)大
瓶頸在于數(shù)據(jù)庫,最有效的辦法是加緩存
用戶發(fā)起請求,瀏覽器上通過頁面靜態(tài)化直接把頁面緩存到瀏覽器端;請求到達網站之前,可以部署CDN節(jié)點讓請求首先訪問CDN;網站方面nginx也可以加緩存;應用程序里頁面緩存,頁面緩存再細粒度一點就是對象緩存。最后才到數(shù)據(jù)庫。削減到數(shù)據(jù)庫的數(shù)量。