2017-04-02 84 views
1

當需要在內存中緩存文件,假定了以下行動:內存緩存和併發的問題

public IActionResult Article(int id) { 
    String content = MemoryCache.Get<String>(id.ToString()); 

    if(content == null) { 
     MemoryCache.Set<String>(id.ToString(), ReadFile(id), new MemoryCacheEntryOptions() { 
       AbsoluteExpiration = DateTime.Now.AddHours(1) 
     }); 

     content = MemoryCache.Get<String>(id.ToString()); 
    } 

    return View(content); 
} 

如果兩個或更多的請求命中服務器在同一時間會發生什麼?這會導致文件被多次讀取和緩存,或者ASP.Net Core MVC默認處理這個問題?如果是這樣,鎖定緩存塊是否安全?

回答

0

MemoryCache是​​「線程安全」,但這並不意味着兩個進程不能同時錯過緩存(而第一個緩存正在生成緩存)。

現在使用鎖定,這實際上取決於生成緩存的函數有多沉重,並將其與您的代碼中的鎖有多沉重比較。

兩個線程多久會進來尋找相同的緩存值?如果答案不經常,那麼如果大多數情況下實際上不需要,可能不值得增加鎖的開銷。

+0

我已經想通了,答案是「是的確會導致問題」,因爲Get或Set方法不是線程安全的。另一方面,'GetOrAdd'或'AddOrUpdate'方法是線程安全的,我可以使用。 – Arrrr