簡體   English   中英

您應該在什么時候緩存屬性值?

[英]What point should you cache a value for a Property?

我一直想知道何時何地緩存屬性值的最佳時間...其中一些似乎很簡單,例如下面的那個...

public DateTime FirstRequest {
    get {
        if (this.m_FirstRequest == null) {
            this.m_FirstRequest = DateTime.Now;
        }
        return (DateTime)this.m_FirstRequest;
    }
}
private DateTime? m_FirstRequest;

但是,一些更復雜的情況呢?

  1. 來自數據庫的值,但是在被選擇后仍然為真。
  2. 存儲在內置緩存中的值,該值可能會不時過期。
  3. 必須先計算一個值?
  4. 需要一些時間來初始化的值。 0.001s,0.1s,1s, 5s ???
  5. 已設置的值,但可能會出現其他情況,並將其設置為null,以指示應重新填充該值。
  6. ??? 似乎有無限的情況。

您認為財產不再能照顧自己,而是需要某種東西來填充其價值,這是什么意思?


[編輯]

我看到過早優化的建議,等等。但是我的問題是何時該進行優化。 緩存所有內容不是我要的,而是何時該緩存,應該由誰負責?

通常,您應該先使代碼工作,然后再進行優化,然后再進行性能分析認為可以幫助您的優化。

我認為您需要反過來提出您的問題,以免您陷入過早優化的陷阱。

您認為什么時候不再需要在每次調用時重新計算屬性而是使用某種形式的緩存的意義?

值的緩存是一種優化,因此不應作為規范。 在某些情況下,使用此優化顯然很重要,但是在大多數情況下,應該通過進行適當的工作來獲取該值,然后在分析和顯示該值后對其進行優化,以使屬性每次都能正確運行需要優化。

緩存是不是一個好主意的一些原因:-如果值易於頻繁更改,則不要緩存-如果值永不更改且您負責它永不更改,請緩存;-如果不負責則不要緩存在您依賴他人的實現時提供價值

支持和反對緩存值還有很多其他原因,但是對於何時緩存和何時不緩存沒有明確的硬性規定-每種情況都是不同的。

如果您必須緩存...

假設您已確定要使用某種形式的緩存,那么如何執行該緩存取決於您要緩存的內容,原因以及為您提供值的方式。

例如,如果像您的示例中那樣是單例對象或時間戳記,則簡單的“是否已設置?” 一次設置值的條件是一種有效方法(即在構造過程中創建實例)。 但是,如果它正在命中數據庫,並且數據庫會在更改時通知您,則可以基於臟標志來緩存該值,該臟標志每當數據庫值更改時就會弄臟。 當然,如果您沒有更改通知,則可能必須在每次調用時刷新值,或在兩次檢索之間引入最短等待時間(當然,接受值不一定總是准確的)。

無論情況如何,您都應始終考慮每種方法的利弊,並考慮引用該值的方案。 消費者是否總是需要最新的價值,或者他們可以應付落后的情況? 您控制價值來源嗎? 源是否提供更改通知(或者您可以使其提供此類通知)? 來源的可靠性如何? 有很多因素會影響您的方法。

考慮到您給出的方案...

同樣,假設需要緩存。

  1. 來自數據庫的值,但是在被選擇后仍然為真。
    如果保證數據庫保留該行為,則可以在第一次請求該值時對其進行輪詢,然后將其緩存。 如果不能保證數據庫的行為,則可能需要格外小心。

  2. 存儲在內置緩存中的值,該值可能會不時過期。
    我將使用臟標志方法,其中不時將高速緩存標記為臟,以指示需要刷新刷新的值(假設您知道“時間”)。 如果不這樣做,請考慮使用一個計時器,該計時器指示緩存定期刷新。

  3. 必須先計算一個值?
    我會根據價值來判斷。 即使您認為需要緩存,編譯器也可能已經對其進行了優化。 但是,假設需要緩存,如果計算時間較長,則在構建過程中或通過ISupportInitialize的接口可能會更好。

  4. 需要一些時間來初始化的值。 0.001s,0.1s,1s,5s ???
    我希望該屬性對此不做任何計算,並實現一個指示值何時更改的事件(這在值可能更改的任何情況下都是有用的方法)。 初始化完成后,將觸發該事件,從而使消費者獲得價值。 您還應該考慮這可能不適合物業; 相反,請考慮使用異步方法,例如帶有回調的方法。

  5. 已設置的值,但可能會出現其他情況,並將其設置為null,以指示應重新填充該值。
    這只是第2點中討論的臟標志方法的特例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM