基於cache的過載問題解決模式

假設系統A依賴於系統B,同時爲了提高訪問效率,A系統在本地設置系統B的cache,其過期時間爲t。當cache失效時的策略如下:

1)基於超時的常規模式: 單統程請求,其他線程等待

在t到達後,Cache中的Key和對應Value將被清除,get操作將通過RPC獲取B 系統的Key對應的Value,並更新本地Cache。

此時,如果另一個線程發現cache過期,get操作先判斷有沒有其他線程發起了遠程調用, 如果有,那麼自己就等待,直到那個線程遠程獲取操作成功,get操作返回更新後的cache中的值。如果遠程獲取操作失敗,則get操作拋出異常,不會返回任何Value。

2)基於刷新的常規模式:

在t到達後,Cache中的Key和相應Value都不會被清除,而是被標記爲舊數據,如果有線程調用get操作,將觸發refresh更新操作,根據get和refresh的同步關係,又分爲兩種模式:

  • 同步模式:get操作等待refresh操作結束,refresh結束後,get操作返回當前Cache中Key對應的Value(新值),注意:refresh操作結束並不意味着refresh成功,還可能拋了異常,這時 get操作返回的值可能是舊值。如果其他線程進行get操作,Key已經過期,並且發現有線程觸發了refresh操作,則自己不等refresh完成直接返回舊值。
  • 異步模式:get操作觸發refresh操作,不等refresh完成,直接返回Cache中的舊值。如果其他線程進行get操作,發現Key已經過期,並且發現有線程觸發了refresh操作,則自己不等refresh完成直接返回舊值。

3)基於刷新的續費模式

該模式和基於刷新的常規模式唯一的區別在於refresh操作超時或失敗的處理上。在基於刷新的常規模式中,refresh操作超時或失敗時拋出異常,Cache中的相應Key-Value還是舊值,這樣下一個get操作到來時又會觸發一次refresh操作。

在基於刷新的續費模式中,如果refresh操作失敗,那麼refresh將把舊值當成新值返回,這樣就相當於舊值又被續費了T時間,後續T時間內get操作將取到這個續費的舊值而不會觸發refresh操作。

基於刷新的續費模式也像常規模式那樣分爲同步模式和異步模式,不再贅述。




發佈了31 篇原創文章 · 獲贊 12 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章