首页 > 解决方案 > .NET Core GetOrCreate 函数中的 IMemoryCache 被多次调用

问题描述

我正在使用 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()再次调用该方法,因为缓存还没有填满。

我们怎样才能避免这种情况?

标签: c#asp.net-core.net-core

解决方案


您可以使用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运行时阻塞所有调用线程,这对您来说可能是也可能不是问题


推荐阅读