思路
一數據庫讀寫分離
- 在實際的項目中,我們對讀的操作是大於寫操作的,如果讀寫都在一個庫的情況下,寫操作會鎖行數據,這個時候查詢數據庫就會很慢,非常影響性能,而且數據庫讀寫切換也是非常耗性能的。
- 讀寫分離後,對數據庫的讀操作去讀庫,寫操作去寫庫,會提高高併發的數據庫訪問性能,但是也有風險,什麼風險呢,因爲讀庫的數據是從寫庫通過過來的,當讀一個數據的時候,寫庫的數據還沒有同步過來,這個時候就會產生錯誤數據。
- 案例(細節https://blog.csdn.net/zhou920786312/article/details/97813954)
-
我以前接手一個項目,項目的是數據庫是讀寫分離的,其中有個插入數據到數據庫,並查詢插入id的操作。
- 將數據插入數據庫(主鍵自增長)
- 查詢當前連接插入的最大id( LAST_INSERT_ID)
-
它查到的id不是當前插入的數據庫id,因爲寫庫的數據還沒有同步到讀庫,所以我們查到的數據不是插入數據的id。
-
- 案例(細節https://blog.csdn.net/zhou920786312/article/details/97813954)
二分離靜態資源
- 在web項目中,加載圖片是非常耗資源的。通常我們會把圖片放到圖片服務器,並針對圖片資源進行加速。
- 將大圖片分割多個小圖片,開啓多個線程進行操作,最後多各個進程的處理結果進行彙總處理。
- 同理針對js,css,zip文件我們可以做專門的處理
三 cdn加速
- CDN加速就是在靠近用戶的物理位置上架設服務器,根據就近原則讓用戶訪問物理上最近的服務器來節省網絡傳輸時間。
- 作用降低網絡傳輸時間
四 用戶請求,數據預處理
- 我們把一次HTTP請求的時間分成3段:請求–> 計算處理–> 響應。那麼我們能專門優化呢。
- 請求:數據壓縮傳輸,降低網絡傳輸時間
- 響應:數據壓縮傳輸,降低網絡傳輸時間
- 計算處理:預先處理好結果,並將結果緩存起來,當用戶請求的時候直接返回處理結果。
- 案例
- 我剛參加工作的那會,我接手一個項目,優化用戶登錄模塊。
- 用戶登錄,做了登錄校驗,校驗成功後
- 獲取用戶的基本信息
- 獲取用戶的零錢信息(我們有自己的購物商場)
- 獲取用戶物流地址信息
- 獲取用戶帖子信息(用戶發帖)
- 獲取用戶等級信息(類似qq的等級)
- 還有一大堆的用戶信息。
- 上面的操作是如此的多,而且有些表數據是非常大(單表查詢,單表性能高),造成用戶登錄非常耗時
- 針對上面的情況,我做了優化如下
- 針對固定的數據,如用戶基本信息,我放到緩存中,不去數據庫查詢,這樣減少數據庫的請求壓力
- 針對那些會變化,但是變化間隔時間很大的數據,放到緩存,比如物流地址
- 正對那些需要返回的實時數據,比如用戶帖子信息(其他用戶對帖子的評論),我開啓一個定時任務,間隔時間更新用戶帖子信息,並把帖子信息放到緩存中,當用戶請求帖子接口,不去操作數據庫,直接從緩存響應並給出結果。
- 用戶登錄,做了登錄校驗,校驗成功後
- 我剛參加工作的那會,我接手一個項目,優化用戶登錄模塊。