簡體   English   中英

.NET Core GetOrCreate 函數中的 IMemoryCache 被多次調用

[英]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...
 }

這導致只有一個用戶可以訪問這部分代碼。

請注意__AriticleTableLockstatic因為它將為應用程序中的所有用戶共享。

暫無
暫無

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

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