假設系統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操作。
基於刷新的續費模式也像常規模式那樣分爲同步模式和異步模式,不再贅述。