原有緩存失效,新緩存未到來期間,原本都請求緩存的,現在都去通路資料庫了。短時間内對
資料庫、cpu、記憶體造成巨大壓力,嚴重時可導緻資料庫當機,進而引起一系列連鎖反應,導緻系統崩潰。
1.并發量要求不大的時候,可以加鎖隊列,控制最大通路數。
2.給緩存加上辨別,如果過期,則進行緩存更新。提高緩存命中率,降低資料庫通路。
3.為每個key設定失效時間。
在資料庫中查詢結果沒有,傳回空,那麼緩存中必然也沒有,兩次無用查詢。
1.采用布隆過濾器,将可能的值hash到一個足夠大的bitmap裡,通過bitmap可以過濾掉一個肯定不存在的值,進而減少對緩存和資料庫無用的通路。
2.采用暴力緩存方式,不管查詢資料庫結果是不是為空,都進行緩存。但這個緩存有效時間設定比較短,一般不超過5分鐘,當下次進行更新後就可以取到值。
系統剛上線,很多緩存其實都還沒有,那麼需要對緩存進行初始化,減少對資料庫的通路。
緩存更新除了緩存伺服器自帶的緩存失效政策之外(redis 預設的有 6 中政策可供選擇:volatile-lru、volatile-ttl、volatile-random、allkeys-lru、allkeys-random、no-enviction)
我們還可以根據業務需要進行自定義更新政策,常見的有:
1.定時更新
2.查詢是否過期,如果過期則查詢資料庫,然後更新緩存。
當通路量劇增、服務出現問題、或者非核心服務影響了核心服務的性能時,仍然需要保障服務可用時,需要對緩存降級。比如淘寶天貓雙十一活動時,如果核心服務受到影響,那麼那些相似産品推薦的服務緩存就可以進行降級,盡管對系統有損,但為了核心服務服務正常使用,必須進行降級。但有些服務就無法進行降級比如說:支付、購物車。應為他們都是核心服務。那這種我們隻能通過加機器、加通路隊列、熔斷機制進行高可用的了。