c# - .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()
再次调用该方法,因为缓存还没有填满。
我们怎样才能避免这种情况?
解决方案
您可以使用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
运行时阻塞所有调用线程,这对您来说可能是也可能不是问题
推荐阅读
- java - SpringBoot:从泛型映射器中的泛型类型创建对象
- reactjs - 带有 react useState 钩子的计数器无法正常工作
- c# - 局部位置和全局位置
- python - Pygame 混音器在我不想要的时候播放声音
- python - 如何从迭代第三个数据帧的两列的函数返回两个数据帧?
- angular - 具有名称的表单控件没有值访问器 - mat-button-toggle
- c# - 优先考虑在单个 WebApp 中运行的多个 Azure WebJobs 之一
- python - 如何防止 Visual Studio 2019 将制表符更改为空格?
- python - 在 windows python 上安装 mapnik
- java - 从二进制数java中删除前导零