[英]IMemoryCache in .NET Core GetOrCreate function is called multiple times
我正在使用 IMemoryCache 來加速我的 Web 應用程序。 因此,我在網上商店中緩存了一個完整的產品數據庫表,其中包含所有鏈接的詳細信息。 緩存功能最多需要 20 秒。
private List<Article> Articles {
get {
return _cache.GetOrCreate("Articles ", entry =>
{
entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(24);
return CacheArticles(); // takes 20 seconds
});
}
}
我們網上商店中的一個頁面請求多次使用這些Articles
,並且我們的商店中總是有多個用戶。 現在我們遇到了緩存方法最多需要 20 秒的問題,在這 20 秒內, Articles
會被多次調用,並且每次CacheArticles()
方法都會再次被調用,因為緩存還沒有被填滿。
我們怎樣才能避免這種情況?
您可以使用lock
來確保一次只調用一次CacheArticles
。
private readonly object locker = new object();
private List<Article> Articles {
get {
lock (locker)
{
return _cache.GetOrCreate("Articles ", entry =>
{
entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(24);
return CacheArticles(); // takes 20 seconds
});
}
}
}
請注意,它會在CacheArticles
運行時阻塞所有調用線程,這對您來說可能是也可能不是問題
這就是lock
語句的用武之地。
在您的類級別將其定義為靜態以供訪問該類的每個人共享。
private static object __AriticleTableLock = new object();
然后你想填充你的緩存使用以下代碼:
lock (__AriticleTableLock)
{
// your code comes here...
}
這導致只有一個用戶可以訪問這部分代碼。
請注意__AriticleTableLock
是static
因為它將為應用程序中的所有用戶共享。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.