如何解決數據庫高併發?

發生數據庫高併發問題主要在用戶訪問量增加,例如以下場景:定時秒殺活動,大範圍的同一時間段的搶紅包活動(支付寶的新年集字領紅包等)

數據庫高併發的問題本質在於:一個是慢,一個是等

而要解決可以從以下幾個方面着手解決

  • 短是指路徑要短

    典型的mvc架構請求是->controller-->model-->dao(數據層)-->view,然後把頁面返回給用戶

    縮小解決範圍:

    1. 頁面靜態化:將一些不常用或者更新間隔時間長的頁面實行靜態化,例如https://vip.taobao.com/vip_home_new2.htm,這是一個淘寶辦理VIP的頁面,如果要我實現的話,第一步:導航條去掉因爲購物車內商品數量的顯示;第二步:頁面底部的二維碼去掉;第三步將頁面獨立出來,讓用戶即使不登錄也可以直接訪問"VIP.html"這個頁面

    2. 使用緩存:主要針對於數據與用戶無直接關聯,寫少讀多的數據,使用緩存來減少數據庫的壓力

      第一獲取數據從數據庫中提取,然後保存在緩存中,以後就可以直接從緩存中加載數據,需要有機制維持緩存和數據庫的一致性.

      不過在我們平時寫代碼的時候也可以稍微注意一下這個問題例如:

      在進行ORM映射查詢數據的時候,儘量使用filter()方法,因爲filter()方法具有緩存的功能,而且在查詢關聯表的時候,無論關聯多少數據都不會報錯

    3. 使用儲存過程 那些處理一次請求需要多次訪問數據庫的操作,可以把操作整合到儲存過程,這樣只要一次數據庫訪問就可以了

    4. 批量讀取 高併發情況下,可以把多個請求的查詢合併到一次進行,以減少數據庫的訪問次數

    5. 延遲修改 高併發情況下,可以把多次修改請求,先保存在緩存中,然後定時將緩存中的數據保存到數據庫中,風險是可能會斷電丟失緩存中的數據

  • 少是指查詢的數據要少:

    1. 分表 意思就是將本來一張表的內容,再次細分一下,但是要儘量避免分出來的多表關聯查詢

    2. 分離活躍數據 例如登錄用戶業務,註冊用戶很多,可以將活躍用戶專門保存一張表,查詢時可先查詢活躍用戶,沒有的話在查詢總表

  • 分流

    1. 集羣 將併發請求分配到不同的服務器上

    2. 分佈式 將單次請求的多項業務邏輯分配到多個服務器上

    3. CDN 域名解析層面的分流,也就是將華南地區的用戶請求配給給華南,華中給華中

對於"6.18"等這種特殊時間,可以使用消息隊列來削峯異步處理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章