繁体   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